[转]第48章:SEH - Rev

news/2025/3/19 15:42:49/文章来源:https://www.cnblogs.com/xiaomingerniu/p/18231987

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 :

 

 

如果修改了上面 eax 的返回值,使其为1,即 ExceptionContinueSearch ,运行下一个异常处理器:

和 eax==0 时一样从 ntdll.77018E10 返回后,在 76FF8229 会经历一个跳转:

并且在一路没有跳转的执行到:

此函数中存在 call ecx :

 

此处就调用了 SEH 链的下一个异常处理函数

 

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

 

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

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

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

 

 

地址:   https://blog.csdn.net/whklhhhh/article/details/79656200

总结:可以猜测,OD 使用了这种形式。而 X64dbg 没有,只有点击 隐藏调试器 后才会将 BeingDebugged 值设为 0.

 


---------------------
作者:Rev_omi
来源:CNBLOGS
原文:https://www.cnblogs.com/Rev-omi/p/13624497.html
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720082.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes - 安装方法

Minikube: 对于想要在系统上安装 Kubernetes 但系统资源有限的用户来说,它是理想的选择。因此,minikube 的关键点在于它没有单独的 Kubernetes 主节点和 Kubernetes 工作节点架构。在这里,我们将所有 Kubernetes 组件打包在一起作为一体化设置。单个系统同时充当主节点和工…

UE4 AI

UE4中的AI UE4中AI一般通过行为树来实现行为树控制了AI的动作,而该执行哪些动作则是由AIController(本质上是一个类)进行判断,然后传入BlackBoard的Key中,之后在行为树里利用Selector或者Sequence进行执行对应的动作 每个Actor类都可以选择一个AIController类 行为树中的两个…

一文了解JVM(中)

HotSpot 虚拟机对象探秘 对象的创建Header 解释使用 new 关键字 调用了构造函数使用 Class 的 newInstance 方法 调用了构造函数使用 Constructor 类的newInstance 方法 调用了构造函数使用 clone 方法 没有调用构造函数使用反序列化 没有调用构造函数说到对象的创建,首先让我…

FFT 学习笔记

多项式 复数 单位根 DFT IDFT FFTFFT 学习笔记 1.多项式与卷积 1.1 多项式 对于多项式 \(F(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n\),我们称 \(a_0,a_1,\dots,a_n\) 为它的系数,这种表示法叫做系数表示法。 定义 \(F(x)\) 的 \(n\) 次项系数为 \(f_n\)。 我们有: \[F(x)=…

题目集4-6的总结性Blog

一.前言: 在这几周,我们又进行了3次pta的题目训练。 首先是答题程序的最后一次迭代,答题程序-4,接着就是新的迭代,家居电路模拟程序。经过一段时间的学习,我对面向对象设计的理解进一步加深,这三次题集写起来也没有之前那么困难了,虽然还有不足,我仍在一次次答题中学…

Kubernetes – 架构

Kubernetes 集群主要由称为节点的工作机器和控制平面组成。集群中至少有一个工作节点。Kubectl CLI 与控制平面通信,控制平面管理工作节点。 Kubernetes – 集群架构 如下图所示,Kubernetes 采用客户端-服务器架构,有主节点和工作节点,主节点安装在单个 Linux 系统上,而节…

九、FreeRTOS学习笔记-列表和列表项

列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS中的任务。 列表项就是存放在列表中的项目列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向环形链表 列表的特点:列表项间的地址非连续的,是人为的连接到…

我真的从测试转成了开发......

写在前面 因为走的圈太大了,早上上班差点迟到,幸好有我每日5公里的加持,侥幸踩点进办公室,哈哈,真的好险! 我开发的功能不能用了 上午开始着手某功能的开发,还在写后台逻辑。 结果到了下午,由于前端同学的代码冲突,打包发布后,导致我写的功能直接不能用了,瞬间emo了…

手把手教你用VM搭建Linux系统

手把手教你用VM搭建Linux系统一、安装vm 查看是否安装成功,打开网络适配器(win+R+ncpa.cpl) 确保有 VMnet1 和 VMnet8二、创建虚拟机step01step02step03 密码123456(我怕我忘了),全名是对你的虚拟机的别称没什么太大作用,用户名代表你说什么用户会涉及到权限step04,位置…

kettle从入门到精通 第六十五课 ETL之kettle 执行动态SQL语句,轻松实现全量增量数据同步

本次课程的逻辑是同步t1表数据到t2表,t1和t2表的表机构相同,都有id,name,createtime三个字段。 CREATE TABLE `t1` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,`createtime` datetime DEFAUL…

HMI-Board之LVGL应用

LVGL应用示例移植 使用默认模板工程新建一个RT-Thread项目,BSP版本为1.1.1打开RT-Thread Settings,点击右侧箭头按钮进入详细页,在硬件栏开启以下几个配置选项(LCD、触摸屏、demo)此时,打开board文件夹,发现下面会有一个lvgl的目录,package目录下会有LVGL和lv-music两个…

升鲜宝牛奶溯源管理系统_2024年全网首发,针对牛奶行业特定的溯源解决方案_一码一物_升鲜宝_余东升_升鲜宝供应链管理系统团队再出新作。

升鲜宝牛奶溯源管理系统_2024年全网首发,针对牛奶行业特定的溯源解决方案_一码一物_升鲜宝_余东升_升鲜宝供应链管理系统团队再出新作。整套软件解决方案分三个端:1.PC后台溯源管理系统2.uniapp溯源小程序员工操作端3.vue3,h5溯源网页展示效果图主要功能:权限管理(组织机构、…