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

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

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

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

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

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

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

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

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

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


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

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

又谁有DispCallFunc的原形啊?
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kankan山石 2013-3-7 14:42
12
0
winsunxs,你说的书,有没有详细的源代码啊?如果有,我就买一本
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kankan山石 2013-3-7 14:47
13
0
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说的假虚表  

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

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

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