X86SEH分析笔记

在X86Windows中,函数通过以下步骤来参与SEH:

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

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

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

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

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

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

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

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

       以上是简略的 x86 SEH 流程,其中省略了很多细节,比如展开、错误处理、ExceptionNestedException  ExceptionCollidedUnwind 等等。

posted on 2017-02-28 19:21  yifi  阅读(277)  评论(0编辑  收藏  举报

导航