Хочу установить SEH. Пишу: mov eax,fs:[0]; mov fs:[0],ecx; //в ecx адрес восьмибайтового буфера mov [ecx],eax; mov eax,handler; //в handler адрес обработчика mov [ecx+4],eax; Обработчик должен выдавать сообщение. А вместо этого процесс просто убивается. Причем, вот такой вариант работает правильно: mov ecx,fs:[0]; mov eax,handler; mov [ecx+4],eax; Т.е. простая подмена адреса обработчика в "чужой" структуре работает нормально. А "по инструкции" (первый вариант) - нет. В чем ошибка в первом варианте?
че та я не понял, что ты намутил в первом варианте, но seh устанавливается так: push offset handler push dword ptr fs:[0] mov fs:[0],esp восстанавливаешь так: pop dword ptr fs:[0] add esp,4
стек не годится, нужно где-то в другом месте хранить структуру. Полностью функция моя выглядит так: void _stdcall sehInstall(){ DWORD handler = (DWORD)sehExceptHandler; _asm{ push 8; call funcGetMem; //упрощенный VirtualAlloc xchg eax,ecx; jecxz lexit; mov eax,fs:[0]; mov fs:[0],ecx; mov [ecx],eax; mov eax,handler; mov [ecx+4],eax; lexit: } }
nadge Дело в том, что ОС предполагает, что SEH-фрейм расположен на стеке - делается проверка указателя фрейма на принадлежность [stackMin; stackMax], а также много других проверок: при возникновении исключения есть вероятность что фрейм может быть испорчен. Если что-то не так, процесс прибивается.
А я вот так использую: WorkThred proc uses edi esi ebx pDatar:dword LOCAL lcBff[300]:byte LOCAL hsoket:dword LOCAL outSes:dword push offset @@SehHandler push fs:[0] mov fs:[0], esp ;----------------------------------------------------------------- xor eax, eax mov [eax], eax ;----------------------------------------------------------------- @@BadExit: add esp, 8 xor eax, eax ret @@SehHandler: push ebp mov ebp, esp mov eax, [ebp+10h] lea ecx, @@BadExit mov [eax+0B8h], ecx mov eax, 1 leave jmp dword ptr [esp] WorkThred endp
1) Почему jmp [esp] а не retn ? 2) Обработчик должен возвращать ноль в еах, иначе исключение считается необработанным и вызывается следующий обработчик из цепочки.
Все нориально, вот этого не хватает: MainThred proc uses edi esi ebx pArv:dword mov esi, pArv lea eax, SEH mov (sSEH ptr [eax]).OrgEsp, esp mov (sSEH ptr [eax]).OrgEbp, ebp mov (sSEH ptr [eax]).OrgEbx, ebx mov (sSEH ptr [eax]).SaveEip, offset @@BadExit invoke SetUnhandledExceptionFilter, offset UnhandledExceptionFilter .while dword ptr [esi] != 0 lea eax, SEH mov (sSEH ptr [eax]).OrgEsi, esi invoke CreateThread, 0, 0, addr WorkThred, esi, 0, 0 invoke CloseHandle, eax @@BadExit: inc esi .endw invoke SetUnhandledExceptionFilter, 0 xor eax, eax ret MainThred endp