X86SEH分析笔记

在X86Windows中,函数经过如下步骤来参与SEH:ide

1.在自身的栈空间中分配并初始化一个EXCEPT_REGISTRATION(_RECORD)结构体。函数

2.在该EXCEPTION_REGISTRATION(_RECORD)挂入当前进程的异常链表。spa

当某个函数触发异常时,系统首先经过调用KiDisaptchException来给内核调试器一个机会,若是内核调试器没有处理该异常线程

则该机会被转给 RtlDispatchException,这个函数就开始分发该异常。分发过程为:调试

       从当前线程的异常链表头开始遍历,对于每个 SEH 注册信息(即 EXCEPTION_REGISTRATION(_RECORD)),调用其 Handler。根据 Handler 的返回值作相应的后续处理:进程

               1. 返回 ExceptionContinueExecution,表示 Handler 已经修复了异常触发点,从异常触发点继续执行。io

               2. 返回 ExceptionContinueSearch,表示该 Handler 没有处理该异常,继续遍历异常链表。class

               3. Handler 没有修复异常触发点,可是却能处理该异常(某个 __except 过滤代码返回 EXCEPTION_EXECUTE_HANDLER)。这种状况下,处理完该异常后就从异常解决代码(__except 代码块)继续执行,Handler 不会返回。遍历

       以上是简略的 x86 SEH 流程,其中省略了不少细节,好比展开、错误处理、ExceptionNestedException  ExceptionCollidedUnwind 等等。链表

相关文章
相关标签/搜索