首页
社区
课程
招聘
[求助]如何hook整个虚函数表?
发表于: 2013-3-6 21:04 17784

[求助]如何hook整个虚函数表?

2013-3-6 21:04
17784
因为想hook的对象中有比较多的函数,一个一个用jmp的话,工作量有点大。

有没有比较简单点的方法,hook整个虚函数表中的函数?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (26)
雪    币: 354
活跃值: (301)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
虚表的长度是没法确定的,而且,虚表中的数据,可能是代表函数地址,或者是代表数据,或者可能是0,但虚表没有结束。所以,要hook整个虚表的函数,建议你考虑买本<<游戏外挂攻防艺术>>中hook大全中关于hook虚表的章节
2013-3-6 22:23
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
楼上这广告打的。。
难不成做个COM HOOK还得买你那书才行

hook 虚函数表就是指针替换,干么一个一个JMP。
得到vftable后,加上你要hook的函数索引号,直接替换指针就可以了。
2013-3-7 11:38
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
3楼能不能给个例子,我主要是想记录对方程序如何依次调用com中的一个对象

注明,我有这个com的全部头文件
2013-3-7 12:28
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
仅是记录程序调用COM的话你可以搞DispCallFunc
要么你搞定某对象的虚表指针,要么直接搞掉所有这类对象的虚表里的某个函数的指针,或者直接做个和他一样的COM组件,和JMP有毛线关系
2013-3-7 12:39
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
【我的对象指针】代替【原对象指针】,但对方程序之后调用应该会 call 【我的对象指针】+函数号*4

这样好像还是要构建虚函数表中的所有函数?
2013-3-7 12:40
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
7
头文件里有虚表结构的亲,你不知道COM In Plain C吗
2013-3-7 12:45
0
雪    币: 354
活跃值: (301)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
亲,我认为给一个虚函数的序号,然后,把虚表对应位置替换成jmp,这样单个hook,不是上策。
首先,序号可能会因软件版本而变化,你的hook就失效了,不能取得一劳永逸的效果。
第二,对应某个对象,如果其虚函数对应的序号不知道的情况下,你如何监控到它,这就需要你去调试。

我在<<游戏外挂攻防艺术>>里面对于虚表hook这块有一个比较好的方案。
就是采用模糊长度的假虚表来替换真虚表的方案,这样能做到监控任意虚函数的调用,一劳永逸。
下面是附图:


统一的监控函数,不仅可以看到调用顺序,而且,可以做差异分析,比如一个动作引发一个调用顺序,执行另外一个动作的时候
有一个不同的调用顺序,对两次调用顺序做差异分析,可以看出,两次动作特有的虚函数调用,和不同的虚函数调用。

这幅图,让我想起了老子<<道德经>>里面说的“道生一,一生二。。。。”和“负阴抱阳”,你看呢?
上传的附件:
2013-3-7 13:16
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
9
感觉楼上是搞传销的
还有你所谓CallStack检测是如何处理的,原虚函数你这么查CallStack也不一定都能查到的吧,保证稳定的话还不是要肉眼去看看
2013-3-7 13:22
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
10
想记录调用顺序那就调试吧,多下些日志断点
只是为了看调用顺序就hook,结果卡在hook上,舍本逐末了啊喂
2013-3-7 13:34
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
对主要的几个函数是要做大修改的,不过修改后发现原作者可能还调用了一其他的,所以就想来个全部记录,省得漏了

又谁有DispCallFunc的原形啊?
2013-3-7 14:40
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
winsunxs,你说的书,有没有详细的源代码啊?如果有,我就买一本
2013-3-7 14:42
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
HRESULT DispCallFunc(
  void *pvInstance,
  ULONG_PTR oVft,
  CALLCONV cc,
  VARTYPE vtReturn,
  UINT cActuals,
  VARTYPE *prgvt,
  VARIANTARG **prgpvarg,
  VARIANT *pvargResult
);

pvInstance
An instance of the interface described by this type description.
oVft
For FUNC_VIRTUAL functions, specifies the offset in the VTBL.
cc
The calling convention. One of the CALLCONV values, such as CC_STDCALL.
vtReturn
The variant type of the function return value. Use VT_EMPTY to represent void.
cActuals
The number of function parameters.
prgvt
An array of variant types of the function parameters.
prgpvarg
The function parameters.
pvargResult
The function result.

我想想了用DispCallFunc似乎比较适合调试时用,决定还是用winsunxs说的假虚表  

哪位有比较详细的代码啊?
2013-3-7 14:47
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
14
我是来参观潜水牛的
2013-3-7 17:06
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
15
对一个已经生成的静态代码而言 整个虚表的大小肯定是死的,不可能是动态的,这是编译器编译的时候就确定的~~
至于hook 全部虚表函数的话,对于非VM化的类体而言利用VEH+访问断点和适当的反汇编引擎就完全搞定...
2013-3-7 17:08
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
16
chrome的源码中就有VT hook的类 买毛线书 真心鄙视2楼打广告的 真怀疑你是搞技术还是搞传销的 就那么几页还是百度可以百度到的...
2013-3-7 17:27
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
17
头像.....
2013-3-7 18:54
0
雪    币: 69
活跃值: (41)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
2013-3-7 19:42
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
19
V神.....
2013-3-7 19:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
20
你头像是我头像的徒弟
2013-3-7 22:35
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
8楼的原理是很好理解,但具体细节怎么解决——
           假的虚函数表怎么构建?     
           构建好后,所有的函数指针都是指向同一个处理函数,那如何判断原程序究竟调用了哪一个函数?

2楼介绍的书,当中有没有具体的代码?
2013-3-7 23:38
0
雪    币: 354
活跃值: (301)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
22
书里面有源码和更详细介绍,谢谢支持

2013-3-8 09:57
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不错,有一点帮助。不过没有说监控整个虚函数表
2013-3-8 11:18
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
自己找到一篇相关的教程  http://bbs.pediy.com/showthread.php?t=71775
2013-3-9 13:18
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
他的书我买了,,上面有简单的介绍hook虚函数表,但源码包里没有提供详细代码
2013-3-22 16:05
0
游客
登录 | 注册 方可回帖
返回
//