首页 > 其他 > 详细

第48章:SEH

时间:2020-09-12 10:55:26      阅读:60      评论:0      收藏:0      [点我收藏+]

SEH 是 Windows 操作系统提供的异常处理机制,在程序源代码中使用 __try   __catch   __finally 等关键字来具体实现。 

技术分享图片

进程在运行过程中发生异常,OS 会委托进程处理,但如果进程内没有具体实现 SEH ,那么 OS 会启动默认的异常处理机制终止进程运行。如果有调试器,则先交由调试器处理。

 

三种异常处理的方法

(1) 直接修改代码、寄存器、内存

技术分享图片

(2) 将异常抛给被调试者

技术分享图片

(3) 将异常抛给 OS 默认处理机制

技术分享图片

 

 异常

技术分享图片

 

SEH 

SEH 是以的形式存在的,第一个异常处理器若未处理相关异常,它就会传递到下一个异常处理器,直到得到处理。SEH 是由 _EXCEPTION_REGISTRATION_RECORD 结构体组成的链表。

技术分享图片

Next 成员指向下一个结构体Handler 则直接指向了异常处理函数的首地址。

而异常处理函数是由 OS 调用的,即触发异常后,由 OS 提供参数给异常处理函数,并调用它。

异常处理函数的定义如下:

技术分享图片

1. 异常处理函数的返回值 EXCEPTION_DISPOSITION 是一个枚举类型

技术分享图片

2. 异常处理函数的第一个参数即 EXCEPTION_RECORD 是一个结构体

技术分享图片

ExceptionCode异常类型。比如 80000004 指的是 EXCEPTION_SINGLE_STEP 异常,而 ExceptionAddress 则指出异常发生的地址

3. 异常处理函数的第三个参数CONTEXT 也是一个结构体

技术分享图片

技术分享图片

技术分享图片

访问 SEH 链的方法很简单: FS: [ 0 ]

 

 

在实验中继续观察,首先获取 SEH 链,然后将自身的栈指针接入 SEH 链,此时栈底的两个数据分别是 Next 指针和 Handler 函数地址。

技术分享图片

技术分享图片

然后运行到触发异常的地方(将数据写入不存在的内存区域):

技术分享图片

触发异常后,按 Shift+ F7,将异常传递给程序自行处理。此时查看栈顶:

技术分享图片

由书作者提供的函数声明可知,第一个参数就是 EXCEPTION_RECORD 的指针:

技术分享图片

红色方框圈起来的两个分别是 ExceptionCode 和 ExceptionAddress ,都由 OS 填入。

第二个参数的值是 0012FF78

技术分享图片

一看很眼熟,进入栈区查看:

技术分享图片

可以看出,它指向了下一个 SEH 结构体。

第三个参数指向 CONTEXT 结构体:

技术分享图片

可以看到,框起来的第一个元素是 ContexFlags,第二个元素是 Eip ,前面一个即为 Ebp ,其它大部分都是零。

 

继续查看作者编写的异常处理代码:

技术分享图片

首先将第三个参数,即 Contex 结构体放入 esi ,并读取 TEB.NtTilb.BeingDebugged 的值并进行比较,若进程处于被调试阶段,则不跳转,并将地址写入 Contex 结构体中的 Eip .由 Contex 的功能可知,这将改变程序的运行。同时 xor eax,eax 表示函数返回值为0 ,将继续执行异常代码,而不转到下一个 SEH 结构体 。

 

接下来是系统代码——> 删除 SEH :

技术分享图片

 

同样,在 OllyDbg 中设置相应的选项,可以避免 SEH 反调试,如果程序出现异常,调试器不会暂停,异常自动被 OS 送给程序。

技术分享图片

 

经过实验,发现:在没有异常的时候,使用X64dbg 进行调试(没有开启异常忽略)查看 BeingDebugged 的值,可以发现其值是 1。

而使用 OllyDbg(开启异常忽略),在没有异常发生时,查看 BeingDebugged 的值,其值是 0。

并且在程序断在系统断点时,查看该元素的值,和上述的值没有变化。在 x64dbg 中,从系统断点处开始对该元素下硬件断点,没有暂停。

 

在第一次LOAD_DLL_DEBUG_EVENT发生时设置“BeingDebugged=FALSE”,但是这样就无法终端在系统断点出。所以在第二次LOAD_DLL_DEBUG_EVENT发生的时候,将BeingDebugged=TRUE,此后就会停在系统断点处 ,进而消除BingDebugged。

 

第48章:SEH

原文:https://www.cnblogs.com/Rev-omi/p/13624497.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!