SEH异常处理机制

1.SEH是windows操作系统提供的异常处理机制。

2.在程序中可以使用__try、__except、__finally关键来实现异常处理。

3.SEH属于系统级的异常处理,是不同于C++中try、catch的。SEH诞生的更早一些。

4.异常处理过程:

正常情况:程序执行->抛出异常->程序SEH处理函数->系统默认SEH处理函数。

调试情况:程序执行->抛出异常->调试器中断处理->程序SEH异常处理->系统默认异常处理

如果程序没有异常处理函数时,系统才会调用默认的异常处理。

 

系统默认异常处理函数就是关闭进程,并弹出警告框。

5.异常处理定义:

EXCEPTION_DATATYPE_MISALIGNMENT        (0x80000002)
EXCEPTION_BREAKPOINT                   (0x80000003)   断点异常
EXCEPTION_SINGLE_STEP                  (0x80000004)   单步执行
EXCEPTION_ACCESS_VIOLATION             (0x80000005)   非法访问内存
EXCEPTION_IN_PAGE_ERROR                (0x80000006)
EXCEPTION_ILLEGAL_INSTRUCTION          (0x8000001D)   无法识别的指令
EXCEPTION_NONCONTINUABLE_EXCEPTION     (0x80000025)
EXCEPTION_INVALID_DISPOSITION          (0x80000026)
EXCEPTION_ARRAY_BOUNDS_EXCEEDED        (0x8000008C)
EXCEPTION_FLT_DENORMAL_OPERAND         (0x8000008D)
EXCEPTION_INT_DIVIDE_BY_ZERO           (0x80000094)   除法运算分母为0
...

6.SEH处理链

SEH的单结构体定义如下:

typedef struct _EXCEPTION_REGISTRATION_RECORD
{
    PEXCEPTION_REGISTRATION_RECORD Next;
    PEXCEPTION_DISPOSITION Handler;
}EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;

异常处理函数Handler的定义如下:

EXCEPTION_DISPOSITION _except_handler(
    EXCEPTION_RECORD *pRecord,
    EXCEPTION_REGISTRATION_RECORD *pFrame,
    CONTEXT *pContext,
    PVOID pValue
);

这是一个回调函数,系统在发生异常后,会自动调用,并传入4个参数。

在汇编代码中会遇到一种添加异常处理链的方法,如下:

00401011    PUSH 40102C                    异常处理函数Handler
00401016    PUSH DWORD PTR FS:[0]
0040101D    MOV DWORD PTR FS:[0], ESP

以上代码的意思是:将异常处理函数,和原来的异常处理结构地址压入栈,此时栈中的内存如下:

FS:[0](原) Next

40102C Handler

此时内存中正好就是_EXCEPTION_REGISTRATION_RECORD结构。而此时的esp正好指向的就是该结构的首地址,然后再将该处理结构的地址在替换到FS:[0]中,这样就完成了一个异常处理链表。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤月丶星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值