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]中,这样就完成了一个异常处理链表。