首页
社区
课程
招聘
[讨论]关于恢复inline hook在不同操作系统版本和不同系统中的问题
发表于: 2011-2-5 11:55 9781

[讨论]关于恢复inline hook在不同操作系统版本和不同系统中的问题

2011-2-5 11:55
9781

最近在做inline hook的恢复,在我的本机上面已经OK,包括SSDT,Shadow SSDT,和其他导出函数inline hook的恢复,因为只做恢复,而不是自己做Hook,所以难度相对较小,比较容易搞定。
    但是从我本机上移动到其他机器上进行使用出现了如下问题:
    1. 系统环境一样,比如我的机器:winxp + sp3,另外一台机器winxp + sp3,发现不能通用,我在本机上取的硬编码,把相关函数的前30个字节覆盖到已经Hook了的函数头部,但是发现在相同环境不同机器上相同的函数前30个字节的机器码不一样,这就有点晕了,如下
    (不过我发现不同的地方是一些变量或者函数的地址,应该是有办法解决的,请大牛们指点一下)

   
    2.系统环境不一样,比如winxp+sp3,winxp+sp2,win2000。这些环境下不仅仅一些变量或者函数的地址不一样,而且其实一些操作码都不一样。当然解决这个问题可以在不同环境中取不同的特征码,然后在程序中判断操作系统的版本,进行不同方式的操作。除了这个方法之外有没有其他能通用的方法呢?

    小弟新学习这么底层的东西,望大N们能指点一二


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
加载内核文件自己比对
2011-2-5 13:12
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
听起来有点抽象,我刚下载了PsNull的代码,听说里面有相关代码,不知道能不能请大N讲一下大概的原理和流程,我再根据代码学习一下,多谢了
2011-2-5 18:16
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
rrrfff ,能不能给个简单的实例看一看,这几天看那个PsNull的代码,没有文档,直接看,有点一头雾水......

因为我现在是恢复几类函数,一个是SSDT导出的函数,另一类是Shadow SSDT导出的函数,最后一类是在ntkrnlpa.exe里面导出了的函数。所以我需要加载两个内核文件,就是ntkrnlpa.exe和win32k.sys

比如我上面的图里面就是win32k.sys里面的函数,如果我的驱动自己加载映射到内存空间,那么基址肯定不一样,这样有些变量或者函数的地址需要重定位,那基址不一样,重定位后的这些值应该还是不一样?

不知道PsNull里面是如何实现inline hook的恢复,如果哪位想要PsNULL的代码请留下邮箱,我发给你们,还请帮忙看一下
2011-2-6 12:21
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我自己来解答一下吧,狂读了一下PsNull的代码,思路是有了,不过代码还没有出来,没有时间
只是想把VB的代码转换成VC,不过不懂VB的我始终有中困难
加载文件进行比对的思路:
1. 把内核文件和win32k.sys加载到内存
2. 重建里面的导出函数的地址和重定位表,按当前系统实际基址进行重建
3. 和当前内核所在内存进行比对,进行inline hook的恢复也很方便
2011-2-9 22:20
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
加载原始文件时最好不要用map原始文件的方法,对于win32k.sys会有些问题……直接read进来好了~
2011-2-10 21:09
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
恩,现在用的Read可以进来了,在修复重定位表时有个疑问:

KeServiceDescriptorTable 在 ntkrnlpa.exe 里面,指向函数的地址可以修复
但是
KeServiceDescriptorTableShadow 也在 ntkrnlpa.exe的内存里面,但是里面有些函数是指向win32k.sys的,根本就不是一个模块了,里面指向的函数地址怎么修复呢?
2011-2-14 00:40
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
KeServiceDescriptorTableShadow这个变量是在ntoskrnl.exe里,但是里面的函数表是在win32k.sys里,从win32k.sys里找原始函数表进行修复吧~~
2011-2-14 17:51
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
achillis,太感谢了,能理解你的意思,再请教一下,KeServiceDescriptorTable所导出的函数表可以直接在ntoskrnl.exe里进行修复,通过重定位表

你的意思是不用管KeSericeDescriptorTableShadow,直接在win32k.sys里面修复函数表,但是函数表的地址在哪儿找?

因为导出表没有导出这些函数,如果直接通过重定位表修复了这些函数,但是我从哪里找这些函数的地址,通过对比函数头部来进行inline hook的修复?

还请赐教
2011-2-15 00:38
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
恢复SSDT Shadow的HOOK和InlineHOOK与搞SSDT没什么不一样啊,自己按PE格式加载win32k.sys,按当前win32k.sys的真实加载基址做好重定位修复,然后根据W32pServiceTable的实际位置计算它相对于win32k.sys基址的偏移,按这个偏移到你自己加载的那份win32k.sys里面就可以找到函数表了~~恢复InlineHook同样对比就行了~
2011-2-15 12:46
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
还有,InlineHook不一定在函数头部。。。
2011-2-15 12:47
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
已经把SSDT的inline hook搞定,过几天再弄Shadow SSDT的,多谢achillis的指点
2011-2-21 02:16
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
SSDT,Shadow SSDT全部搞定,多谢achillis一直的指点
2011-2-22 02:47
0
游客
登录 | 注册 方可回帖
返回
//