SEH结构化异常处理02
进程上的异常处理
使用这个API注册一个函数为进程上的异常处理程序,当有异常发生,且根据上一篇异常处理流程轮到进程异常处理程序处理异常时,OS(系统)就会调用这个函数,类似与消息机制的回调。
1 //一个进程只能有一个进程异常处理函数 2 LPTOP_LEVEL_EXCEPTION_FILTER //上一个注册函数的地址 3 WINAPI SetUnhandledExceptionFilter( 4 __in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter //要注册的函数 5 );
贴上代码
1 ;****************************************** 2 ;coded by Rrouned 3 ;****************************************** 4 ;例子1.演示Final型异常处理及参数获取 5 ;****************************************** 6 7 .386 8 .model flat,stdcall 9 option casemap:none 10 11 12 ;编译所必需的头文件 13 include windows.inc 14 include user32.inc 15 includelib user32.lib 16 include kernel32.inc 17 includelib kernel32.lib 18 19 20 .DATA 21 szTitle db "SEH例子-Final",0 22 mes000 db "We are in the Exception handler,Kill Prog",0dh,0ah ;0dh,0ah换行 23 db "in silence(Y)、noisily(N) or Continue(cancel)?",0 24 messuc db "Hello,We manage to return after exception!",0 25 impossible db "It's impossible...",0 26 .DATA? 27 var dd ? 28 ;;----------------------------------------- 29 .CODE 30 31 ;Final 型异常处理回调函数 32 myFinalHandler proc uses esi edi ebx lpExceptionPointers ;说明程序当中会使用到esi等寄存器,保存一下寄存器的值 33 ;lpExceptionPointers是myFinalHandler函数的参数 34 invoke MessageBox,0,addr mes000,addr szTitle,MB_ICONINFORMATION or MB_YESNOCANCEL 35 36 .if eax==IDYES 37 mov eax,EXCEPTION_EXECUTE_HANDLER ;处理完毕,不会显示对话框 38 .elseif eax==IDNO 39 orCannotHanle: ;这是标号 40 mov eax,EXCEPTION_CONTINUE_SEARCH ;继续查找,显示对话框 41 .elseif eax==IDCANCEL ;处理完毕,修改CONTEXT上下文 42 mov ebx,[lpExceptionPointers] ;继续执行程序 43 ASSUME ebx:ptr EXCEPTION_POINTERS 44 ASSUME esi:ptr EXCEPTION_RECORD 45 ASSUME edi:ptr CONTEXT 46 mov esi,[ebx].pExceptionRecord 47 mov edi,[ebx].ContextRecord 48 test [esi].ExceptionFlags,3 49 jnz orCannotHanle 50 cmp [esi].ExceptionCode,STATUS_ACCESS_VIOLATION 51 jne orCannotHanle ;是内存读写异常吗 52 mov [edi].regEip,offset suc_ret ;改变返回地址 53 54 mov eax,EXCEPTION_CONTINUE_EXECUTION 55 .endif 56 ret 57 myFinalHandler endp 58 59 ;程序入口点 60 _StArT: 61 invoke SetErrorMode,0 62 invoke SetUnhandledExceptionFilter,offset myFinalHandler 63 mov [var],eax 64 65 xor eax,eax 66 mov [eax],eax ;向地址0处写数据!产生异常 67 nop ;永不可能执行下面的语句 68 invoke MessageBox,0,addr impossible,addr szTitle,MB_ICONINFORMATION 69 nop 70 suc_ret: ;返回后执行到这里 71 invoke MessageBox,0,addr messuc,addr szTitle,MB_ICONINFORMATION 72 invoke ExitProcess,0 73 74 END _StArT
关于汇编程序的编译问题:
masm32+nmake,makefile
文件打包上传,每次在CMD下进入masm32的目录,运行var.bat,再进入code目录,修改nmake文件的name为要编译的文件名,nmake即可编译程序。