Здравствуйте! Пытаюсь разобраться со структурным обработчиком исключений, но мало что понимаю. Информации мало, а та что есть (например здесь на WASMе) рассчитана на профи и повергает меня в уныние. Вот пример использования SEH (из одного крякми): Код (Text): 00401000 >/$ E8 24000000 CALL crackme2.00401029 00401005 |. 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C] 00401009 |. C701 17000100 MOV DWORD PTR DS:[ECX],10017 0040100F |. C781 B8000000>MOV DWORD PTR DS:[ECX+B8],0 00401019 |. 31C0 XOR EAX,EAX 0040101B |. 8941 14 MOV DWORD PTR DS:[ECX+14],EAX 0040101E |. 8941 18 MOV DWORD PTR DS:[ECX+18],EAX 00401021 |. 806A 00 E8 SUB BYTE PTR DS:[EDX],0E8 00401025 |. 33C0 XOR EAX,EAX 00401027 |. 33DB XOR EBX,EBX 00401029 |$ 68 60104000 PUSH crackme2.00401060 ; SE handler installation 0040102E |. 64:FF35 00000>PUSH DWORD PTR FS:[0] 00401035 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP 0040103C |. 9C PUSHFD 0040103D |. 813424 540100>XOR DWORD PTR SS:[ESP],154 00401044 |. 9D POPFD 00401045 |. 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL 00401047 |. 68 00604000 PUSH crackme2.00406000 ; |Title = "crackme2" 0040104C |. 68 7A604000 PUSH crackme2.0040607A ; |Text = "What the hell are you doing in my app with a debugger?" 00401051 |. 6A 00 PUSH 0 ; |hOwner = NULL 00401053 |. E8 9C030000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA 00401058 |. 6A 00 PUSH 0 ; /ExitCode = 0 0040105A \. E8 A7030000 CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess 0040105F . C3 RETN Смысл такой: при запуске в отладчике вылетает окно с надписью "What the hell are you doing in my app with a debugger?". (самое начало это имитация сигнатры ExeCryptor`а и в общем-то никогда не выполняется, а "рабочий" код начинается с адреса 00401029). И вопрос: объясните, пожалуйста, на пальцах почему при запуске программы под отладчиком сообщение появляется, а при запуске без отладчика не появляется? Как устанавливается собственный обработчик исключений? Понял только, что это как-то связано с регистром FS. И где икать код этого обработчика? И что он делает? полный asm-файл кейгена прилагается:
???? ну если по сеху информации мало, я не знаю по чему тогда много. Информации - море просто и в достаточно доступной форме.
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). Ну а что делает обработчик - зависит от задачи и типа ошибки, в общем случае либо обходит ошибочную инструкцию, либо устраняет причину ошибки и повторяет исполнение, либо беспомощно разводит руками ))
Большое спасибо за ответы, особенно leo! Статьи разные я читаю, но плохо понимаю что там написано. А уж "Win32™ SEH изнутри"... у меня зубы ломит от таких статей. Может конечно там все подробно и конкретно расписано, но я же чайник и пока многого не знаю. Теперь вроде стало чуть-чуть более понятно. Дальше буду читать все подряд про SEH, может и найду что-нибудь попроще. Еще раз всем большое спасибо.
Ребяты, у меня так же проблема с SEHами при отладке приложения в оле оно отказывается работать... не помогает плуг hidedebbuger как спрятать отладчик от SEHов ?
пробовал, не помогает ситуация такая если в проге ставлю бряк в некоторых местах то она слетает бряки не срабатывают при этом бряки в других местах нормально работают
hardware бряки срабатывают нормально а вот простое выполненеи под отладчиком без всяких бряков терпит неудачу...
Думаю, от такого нахождения отладчика спасет такое написание его кода, чтобы, если исключение single-step произошло несанкционировано (т.е. в отладчике никто не включал пошаговый режим), то передавать управление законному SEH.