我在比较SetUnhandledExceptionFilter和SEH在处理异常方面的差别时,发现在OD中,SetUnhandledExceptionFilter方式到不了Handler,无论是否忽略所有异常,都停在异常代码处(0地址写入),显示运行终止。SEH方式正常。向大牛请教是什么原理?(对OD内部工作机制不清楚
)
源程序代码如下:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
lpOldHandler dd ?
.const
szMsg db '异常发生位置:%08x, 异常代码:%08x, 标志:%08x',0
szSafe db '回到安全的地方!',0
szCaption db '筛选器异常处理例子',0
.code
_Handler proc _lpExceptionPoint
LOCAL @szBuffer[256]:byte
pushad
mov esi,_lpExceptionPoint
assume esi:ptr EXCEPTION_POINTERS
mov edi,[esi].ContextRecord
mov esi,[esi].pExceptionRecord
assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
invoke wsprintf,addr @szBuffer,addr szMsg,[edi].regEip,[esi].ExceptionCode,[esi].ExceptionFlags
invoke MessageBox,NULL,addr @szBuffer,NULL,MB_OK
mov [edi].regEip,offset _SafePlace
assume esi:nothing,edi:nothing
popad
mov eax,EXCEPTION_CONTINUE_EXECUTION
ret
_Handler endp
start:
invoke SetUnhandledExceptionFilter,addr _Handler
mov lpOldHandler,eax
xor eax,eax
mov dword ptr [eax],0 ;
在这里过不了
_SafePlace:
invoke MessageBox,NULL,addr szSafe,addr szCaption,MB_OK
invoke SetUnhandledExceptionFilter,lpOldHandler
invoke ExitProcess,NULL
end start
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课