欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

SEH分析笔记(X64篇)

SEH分析笔记(X64篇)

SEH分析笔记(X64篇)
  v1.0.0
  boxcounter
  历史:
  v1.0.0, 2011-11-4:最初版本。
  [不介意转载,但请注明出处 www.boxcounter.com 
  附件里有本文的原始稿,一样的内容,更好的高亮和排版。
  本文的部分代码可能会因为论坛的自动换行变得很乱,需要的朋友手动复制到自己的代码编辑器就可以正常显示了]
  在之前的《SEH分析笔记(X86篇)》中,我借助 wrk1.2 介绍了 x86 下 windows 系统内核中的 SEH 实现。这次我们来看看 x64 位 windows 系统内核中 SEH 的实现。
  本文需要大家熟悉 x64 位系统的一些特性,比如调用约定、Prolog 和 Epilog。可以通过这几篇文章熟悉一下:
  Overview of x64 Calling Conventions, MSDN
  The history of calling conventions, part 5: amd64 , The Old New Thing
  Everything You Need To Know To Start Programming 64-Bit Windows Systems, Matt Pietrek
  首先回顾一下前一篇文章。
  在 x86 windows 中,函数通过以下几个步骤来参与 SEH :
  1. 在自身的栈空间中分配并初始化一个 EXCEPTION_REGISTRATION(_RECORD) 结构体。
  2. 将该 EXCEPTION_REGISTRATION(_RECORD) 挂入当前线程的异常链表。
  当某函数触发异常时,系统首先会通过调用 KiDispatchException 来给内核调试器一个机会,如果内核调试器没有处理该异常,则该机会被转给 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 等等。
  之所以在这里重温这个流程,是因为 x64 中 SEH 的流程总体思路也是如此,只是细节上做了一些修改。但这并不表示熟悉 x86 SEH 就能很轻松的掌握 x64 SEH。
  本文分为四个部分:“异常注册”、“异常分发”、“展开、解决”和“ExceptionNestedException 和 ExceptionCollidedUnwind”。依然以 MSC 的增强版为分析对象。分析环境为:WDK 7600.16385.1,内置的 cl 的版本是15.00.30729.207,link 的版本是9.00.30729.207,测试虚拟机系统为 amd64 WinXP + wrk1.2。
  
  在讲述之前,需要先定义几个名词,以简化后续的讲述。
  RVA  熟悉 PE 格式的朋友都懂的,表示某个绝对地址相对于所在模块的基地址的偏移。
  EXCEPT_POINT  异常触发点。
  EXCEPT_FILTER  __except 小括号内的异常过滤代码。
  EXCEPT_HANDLER  __except 大括号内的异常解决代码。
  FINALLY_HANDLER  __finally 大括号内的代码。
  以下面的伪码为例,

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功