Объясните чайнику про SEH

Тема в разделе "WASM.BEGINNERS", создана пользователем Sturgeon, 8 ноя 2006.

  1. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Здравствуйте!
    Пытаюсь разобраться со структурным обработчиком исключений, но мало что понимаю. Информации мало, а та что есть (например здесь на WASMе) рассчитана на профи и повергает меня в уныние.
    Вот пример использования SEH (из одного крякми):

    Код (Text):
    1. 00401000 >/$  E8 24000000   CALL crackme2.00401029
    2. 00401005  |.  8B4C24 0C     MOV ECX,DWORD PTR SS:[ESP+C]
    3. 00401009  |.  C701 17000100 MOV DWORD PTR DS:[ECX],10017
    4. 0040100F  |.  C781 B8000000>MOV DWORD PTR DS:[ECX+B8],0
    5. 00401019  |.  31C0          XOR EAX,EAX
    6. 0040101B  |.  8941 14       MOV DWORD PTR DS:[ECX+14],EAX
    7. 0040101E  |.  8941 18       MOV DWORD PTR DS:[ECX+18],EAX
    8. 00401021  |.  806A 00 E8    SUB BYTE PTR DS:[EDX],0E8
    9. 00401025  |.  33C0          XOR EAX,EAX
    10. 00401027  |.  33DB          XOR EBX,EBX
    11. 00401029  |$  68 60104000   PUSH crackme2.00401060                   ;  SE handler installation
    12. 0040102E  |.  64:FF35 00000>PUSH DWORD PTR FS:[0]
    13. 00401035  |.  64:8925 00000>MOV DWORD PTR FS:[0],ESP
    14. 0040103C  |.  9C            PUSHFD
    15. 0040103D  |.  813424 540100>XOR DWORD PTR SS:[ESP],154
    16. 00401044  |.  9D            POPFD
    17. 00401045  |.  6A 30         PUSH 30                                  ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    18. 00401047  |.  68 00604000   PUSH crackme2.00406000                   ; |Title = "crackme2"
    19. 0040104C  |.  68 7A604000   PUSH crackme2.0040607A                   ; |Text = "What the hell are you doing in my app with a debugger?"
    20. 00401051  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
    21. 00401053  |.  E8 9C030000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
    22. 00401058  |.  6A 00         PUSH 0                                   ; /ExitCode = 0
    23. 0040105A  \.  E8 A7030000   CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess
    24. 0040105F   .  C3            RETN
    Смысл такой: при запуске в отладчике вылетает окно с надписью "What the hell are you doing in my app with a debugger?". (самое начало это имитация сигнатры ExeCryptor`а и в общем-то никогда не выполняется, а "рабочий" код начинается с адреса 00401029). И вопрос: объясните, пожалуйста, на пальцах почему при запуске программы под отладчиком сообщение появляется, а при запуске без отладчика не появляется?
    Как устанавливается собственный обработчик исключений? Понял только, что это как-то связано с регистром FS. И где икать код этого обработчика? И что он делает?

    полный asm-файл кейгена прилагается:
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    ????
    ну если по сеху информации мало, я не знаю по чему тогда много. Информации - море просто и в достаточно доступной форме.
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Sturgeon
    Все отладчики по умолчанию обрабатывают отладочные прерывания - пошаговой трассировки (single-step), int3, DRx. В данном примере инструкции pushfd+xor+popfd устанавливают флаг трассировки TF в регистре флагов, поэтому на инструкции, следующей за popfd возникает исключение single-step. Если отладчика нет, то управление передается в SEH-обработчик. Если же есть, то отладчик сам обрабатывает это исключение и управление в SEH-обработчик не передается

    Почитай статью по приведенной ссылке и все поймешь ;) Если кратко, то в fs:[0] хранится адрес структуры EXCEPTION_REGISTRATION, первый дворд которой указывает на предыдущую такую же запись, а второй дворд содержит адрес текущего SEH-обработчика. Поэтому, чтобы установить новый обработчик нужно сначала запушить адрес нового обработчика, затем fs:[0] (адрес предыдущей записи) и записать в fs:[0] значение регистра esp (адрес новой записи). Поэтому "искать" код обработчика очень просто - если по дизасму, то это будет значение, которое пушится в стек до fs:[0]. В твоем примере это адрес 00401060. В режиме отладки можно по fs:[0] проследить всю цепочку SEH-обработчиков (например в OllyDbg по View -> SEH chain). Ну а что делает обработчик - зависит от задачи и типа ошибки, в общем случае либо обходит ошибочную инструкцию, либо устраняет причину ошибки и повторяет исполнение, либо беспомощно разводит руками ;)))
     
  5. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Большое спасибо за ответы, особенно leo! Статьи разные я читаю, но плохо понимаю что там написано. А уж "Win32™ SEH изнутри"... у меня зубы ломит от таких статей. Может конечно там все подробно и конкретно расписано, но я же чайник и пока многого не
    знаю.
    Теперь вроде стало чуть-чуть более понятно. Дальше буду читать все подряд про SEH, может и найду что-нибудь попроще.
    Еще раз всем большое спасибо.
     
  6. researchist

    researchist New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2006
    Сообщения:
    21
    Ребяты, у меня так же проблема с SEHами
    при отладке приложения в оле оно отказывается работать...
    не помогает плуг hidedebbuger

    как спрятать отладчик от SEHов ?
     
  7. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    А если попробовать другой плагин? Например, Hide debugger или Olly Advanced&
     
  8. researchist

    researchist New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2006
    Сообщения:
    21
    пробовал, не помогает
    ситуация такая если в проге ставлю бряк в некоторых местах то она слетает бряки не срабатывают
    при этом бряки в других местах нормально работают
     
  9. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    А hardware бряки не помогают? Это скорее всего и не SEH. А проверка на целостность кода.
     
  10. researchist

    researchist New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2006
    Сообщения:
    21
    hardware бряки срабатывают нормально
    а вот простое выполненеи под отладчиком без всяких бряков терпит неудачу...
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    жж0те
     
  12. Sharp

    Sharp New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    143
    Адрес:
    Ukraine
    Думаю, от такого нахождения отладчика спасет такое написание его кода, чтобы, если исключение single-step произошло несанкционировано (т.е. в отладчике никто не включал пошаговый режим), то передавать управление законному SEH.