首页
社区
课程
招聘
[原创] (向量化异常处理)VEH hook
发表于: 2014-7-31 11:21 37733

[原创] (向量化异常处理)VEH hook

2014-7-31 11:21
37733

近期在研究VEH HOOK 参考了网上的网上的一些文章  讲解的均不怎么全 也遇到了部分问题
再次向:cvrock kuty bxc致谢。

本文章内容讲的比较细 请耐心观看。

VEH (向量化异常处理)


VEH 的中文名字: 向量化异常处理(Vectored Exception Handling)
1.VEH 最早出现在XP上 因为只有XP及以上Window版本才支持
目前 Windows 平台下实现和使用的异常处理机制主要有 4 种:
  筛选器异常处理,结构化异常处理(Structure Exception Handler, SEH),向量化异常处理(Vectored Exception Handler, VEH),C++异常处理(C++ Exception Handler, C++EH)。
其中 前三种为操作系统提供的异常处理机制,最后一种为C++提供的

VEH通过使用 Win32 API 函数 AddVectoredExceptionHandler可注册新的异常处理函数,函数的参数就是指向 EXCEPTION_POINTERS 结构的指针。同时,增加了函数地址的注册处理程序链表。由于系统中使用一个链表来存储矢量异常处理程序,程序可以安装尽可能多的向量处理器,只要有必要。
在用户模式下发生异常时,异常处理分发函数在内部会先调用遍历 VEH 记录链表的函数, 如果没有找到可以处理异常的注册函数,再开始遍历 SEH 注册链表。
二者之间具体联系:VEH优先权高于SHE,只有所有VEH全不处理某个异常的时候,异常处理权才会到达SHE。只要目标程序中没有利用VEH,那么,你所设计的VEH将是第一个得到控制者。现在采用SEH作为异常处理的普通C/C++程序对你将不会再有干扰,可以通过使用VEH来进行hook处理了。
如果存在调试器,那么控制权转向将会发生新的变化。当异常发生后,首先通知的将会是调试器,调试器不处理才会再返回控制权给VEH;如果VEH不处理,再返回给SHE;若SEH不处理,再给调试器一个机会,如果还不处理,则交由系统处理。

VEH由AddVectoredExceptionHandler添加处理函数 处理函数有一个参数 参数类型为PEXCEPTION_POINTERS结构体
结构PEXCEPTION_POINTERS中保存着当前异常的各个寄存器,堆栈,地址,等多种信息 以下是PEXCEPTION_POINTERS的展开图

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (37)
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
图挂了。
2014-7-31 11:24
0
雪    币: 2895
活跃值: (3929)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
图片看不到
2014-7-31 11:24
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
图片可以了  刚才空间禁止了
2014-7-31 11:32
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
图片可以了  刚才空间禁止了
2014-7-31 11:36
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
前排看加精
2014-7-31 11:40
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
我这么有面子啊
2014-7-31 12:29
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我们上面有设置CPU的寄存器为单步模式


是哪句代码?

。。。看到了。
2014-7-31 13:06
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
楼主的名字,曾几何时,貌似在广海看到过
忽然回忆起了,之前写的关于VEH 的东东
2014-7-31 14:10
0
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不错,支持一下
不过现在这种手法运用没多大用处了,现在crc改一字节照样查出来
2014-7-31 14:44
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
申精!!!!!!!!!!!!!!!!!!!!!!!!!!
2014-7-31 15:29
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
12
~我去验证下
2014-7-31 15:58
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
广海呆过一段时间  人少 没人交流技术  所以也就不去了
2014-7-31 17:34
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错的技术~
2014-8-1 14:46
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感觉来回修复函数头这个思路不太好
不过还是感谢楼主的整体思路
2014-8-1 18:35
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我也是这样感觉。可以把第一条指令放到一个置执行属性的buffer里面,后面跟个跳转用来跳转到第二指令,
int3不修复。Eip指向这个buffer,这样感觉会更好些。
2014-8-1 20:11
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
感谢LZ分享
2014-8-1 20:15
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
用缺页异常如何……
2014-8-2 19:12
1
雪    币: 995
活跃值: (669)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
觉得写入INT3 有的游戏会CRC扫描不安全 不知道设置内存页面不可执行可以吗
2014-8-3 14:28
1
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
这个只是我第一次研究学习而已  没太重视 技术学到了 剩下的就是思路了
2014-8-4 13:36
0
雪    币: 5203
活跃值: (3447)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
讲的比较接地气~支持下。
2014-11-19 12:43
0
雪    币: 5203
活跃值: (3447)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
+1  
2014-11-19 12:45
0
雪    币: 130
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
马克~~
2015-6-7 15:32
0
雪    币: 6911
活跃值: (9069)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
24
MessageBoxA_Addr=(PVOID)&MessageBoxA;
取出来的地址不一定是是MessageBoxA的真实地址吧?
2015-6-7 16:45
0
雪    币: 6911
活跃值: (9069)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
25
可以下硬件断点吧。
2015-6-7 17:01
0
游客
登录 | 注册 方可回帖
返回
//