首页
社区
课程
招聘
如此 inline hook SSDT
发表于: 2010-11-19 13:05 5491

如此 inline hook SSDT

2010-11-19 13:05
5491

如图,别人HOOK SSDT都是修改前10个字节,我是直接修改第十一个字节的call后面的地址,修改为自己的函数的地址,windbg自动断下来了,提示说 我自定义的函数地址是无效的地址,途中是修改之后的call后面就是我自定义的函数地址,windbg中按g也运行不起来,一直异常.忽略异常就蓝屏了,小弟初涉ring0,
还有另外一个就是我不是lpbase + 0x7a *4来查找NtOpenProcess的地址,而是比较低一个字节是不是0c4,0x7a*4定位到的地址不是NtOpenProcess.
这样比较之后发现NtCreateKey函数的第一个字节也是0C4,这个是为什么呢,这个序号是唯一的吗?

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 8333
活跃值: (2911)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
kd> u NtOpenProcess
nt!NtOpenProcess:
805c2296 68c4000000      push    0C4h
805c229b 68a8aa4d80      push    offset nt!ObWatchHandles+0x25c (804daaa8)
805c22a0 e86b6cf7ff      call    nt!_SEH_prolog (80538f10)

内核下函数都是高地址.(0x80XXXX以上).
Call的地址居然在78XXX的地址上..
很显然.你在进行Call Replace的时候计算错偏移了.
2010-11-19 13:33
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
你不能靠68C4000000来确定NtOpenProcess。0xC4这个值对NtOpenProcess来说,不属于它的特征码。

另外,既然你使用inline hook的话,NtOpenProcess是导出的。你只需要直接使用这个地址就可以了。
当然,在编译的时候需要把链接器增量连接去掉(/INCREMENTAL:NO),这样NtOpenProcess的地址才会正确。
所以你根本不需要去SSDT表中找NtOpenProcess地址,转一大圈,无用功。

如楼上所说,你的CALL地址竟然是0x78XXXXXXX,这是一个用户地址,无论你OFFSET是否计算正确,都是错误的。内核代码竟然CALL回用户层代码,实在是要雷倒一帮人。

你inline hook取的位置很悬,把hook下在一个有相对偏移的地址,真是算你狠。这种下法,背后所要做的工作比在其它地址下hook要复杂很多。一个细节没做好,就要蓝。
NtOpenProcess还有很多可以做inline hook的地方,何苦挑这个位置呢。。。
2010-11-19 15:40
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
初学驱动,没想到这些内核函数也需要导出,当初看了很多函数开头的几个字节都是push xxx然后  call某个地址,以为这个xxx就类似函数的序号一样,所以有了这种定位的方法,不知有什么其他方法吗?                驱动加载到内存之后他的地址应该在驱动卸载之前是不变的,我在驱动里面定义的裸体函数的地址怎么不是0x80xxx以上的呢?
2010-11-20 01:56
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
顶顶。。膜拜。。。。。
2010-12-29 18:54
0
游客
登录 | 注册 方可回帖
返回
//