对于SEH(Structured Exception Handling)结构化异常处理的初步理解:是在CPU指令层次上给程序设计者提供异常处理,C++中的_try{}_except{}结构不过是在高层对SEH的包装。从总体上来说SEH是一个异常处理回调函数的链表,以线程基本单位,每个线程拥有自己的SEH处理链,出现异常时可以顺着SEH链依次调用异常处理函数,直到找到适合的处理函数为止。在线程创建之初系统会提供一个默认的异常处理函数——出现异常时弹出“XXXX处出现异常,退出或调试”窗口。为了处理异常设计者可以用SetUnhandledExceptionFilter()向系统注册处理异常的回调函数,将回调函数添加到SEH处理链的头部,在出现异常时被第一个调用。
在汇编的层面向注册SEH链注册异常处理回调函数非常的简单,首先我们必须了解以下事实:SEH链保存在堆栈中,每个节点由两个指针构成占用8个字节,高地址的4个字节存放回调函数的地址,低地址的4个地址指向下一个节点,链尾值为0xffffffff。fs:[0]指向SEH链的头部,所以异常处理回调函数的注册过程可以简要描述为:
push offset exception_function_address
push fs:[0]
mov fs:[0], esp