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
View Code

关于汇编程序的编译问题:

masm32+nmake,makefile

文件打包上传,每次在CMD下进入masm32的目录,运行var.bat,再进入code目录,修改nmake文件的name为要编译的文件名,nmake即可编译程序。

MASM32.rar

原文地址:https://www.cnblogs.com/Rrouned/p/3362606.html