首页
论坛
课程
招聘
cradiator
雪    币: 278
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:220 )
在线值:
发帖
16
回帖
51
粉丝
0

[原创]FSD HOOK与SSDT HOOK恢复简单思路

2009-10-24 08:49 17014

[原创]FSD HOOK与SSDT HOOK恢复简单思路

2009-10-24 08:49
17014
这几天看了一下FSD HOOK与SSDT HOOK恢复相关的东西,都是众牛人玩腻了的技术了。大家莫笑。

首先是FSD HOOK。
网上比较容易找到的是sudami对360superkiller的逆向,映射大小计算上好像有些错误。

这里贴出我的想法,备忘 :)

1.       向ZwQuerySystemInformation传递11号参数,获得SYSTEM_MODULE_INFORMATION结构,通过结构查询ntfs和fastfat的基地址(lpModuleBase)。

2.       通过指定路径打开ntfs.sys和fastfat.sys对应的磁盘文件
L”\\SystemRoot\\system32\\drivers\\ntfs.sys”
L” \\SystemRoot\\system32\\drivers\\fastfat.sys”

3.       根据PE格式获得文件中镜像基地址(imageBase)

4.       使用特征码搜索ntfs.sys和fastfat.sys设置派遣路径的指令。

用IDA反汇编ntfs.sys(fastfat.sys类似)见指令和对应的机器码如下:

esi指向DriverObject结构,指令字结构分别为

c7 46 XX YY YY YY YY 

c7 86 XX XX XX XX YY YY YY YY (XX为esi的相对偏移,YY为真正的函数地址)

因此可以通过特征搜索此段指令:



获得指令后,根据上述结构分别获取IRP派遣序号index和原始派遣函数地址addr。

在这里真正index的计算方法如下:


同时由于ntfs.sys实际加载的位置和pe文件中存储的位置不同,所以需要重定位:


至此获得了派遣函数的原始路径。

5.       使用ObReferenceObjectByName分别获得

L”\\FileSystem\\Ntfs”

L”\\FileSystem\\Fastfat”

对应的驱动对象(DriverObject)。

将驱动对象中的派遣函数地址与从pe文件读取的地址进行比对,如果发现不同和进行修复。

-----------------------------------------------------------------------------------------

SSDT HOOK
1. 确定windows所使用内核文件时ntoskrnl.exe还是ntkrnlpa.exe。
当电脑内存大于512MB时windows开启PAE使用ntkrnlpa.exe否则使用ntoskrnl.exe这里并没有考虑支持多核处理器的内核。
所以我们只要检测PAE是否开启就能确定内核文件名了。
当cr4寄存器的5 bit置为时说明开启了PAE。


2.       将内核文件映射如内存,首地址为krnlImgBase。
3.       向ZwQuerySystemInformation传递11号参数,得到SYSTEM_MODULE_INFORMATION结构数组,遍历数组得到系统内核在内存中的基地址krnlBase。
4.       根据PE格式解析映射到内存中的文件,获得原始SSDT。
方法是:首先获得系统导出的SSDT表地址,减去基地址后得到SSDT的RVA


找出内存映射的内核文件的节表。
搜索SSDT的RVA处在文件那哪个节中。
内存映射文件的SSDT = SSDT RVA – 所在节 RVA + 所在节 RawOffset + krnlImgBase


5.       对比原始SSDT与当前SSDT内容,不同则替换。
这里存在一个重定位问题需要注意。
代码如下:


------------------------------------------------------------------------------------------
本人菜鸟一只,欢迎各位来拍砖、撞墙或者说“太挫了” :)
http://hi.baidu.com/index09

[看雪官方培训]《安卓高级研修班(网课)》9月班开始招生!挑战极限、工资翻倍!

上传的附件:
最新回复 (11)
sudami
雪    币: 481
活跃值: 活跃值 (26)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
71
回帖
1575
粉丝
5
sudami 活跃值 25 2009-10-24 09:10
2
0
360superkiller 是XIKUG大牛逆向的,和我无关. 我是菜B, 本来想一直潜水的,结果发现有人曲解了. 所以冒上来回复一下!

继续潜水!
sudami
雪    币: 481
活跃值: 活跃值 (26)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
71
回帖
1575
粉丝
5
sudami 活跃值 25 2009-10-24 09:13
3
0
btw:
楼主IDA 打开ntfs.sys,竟然没有符号,亏了....
cradiator
雪    币: 278
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:220 )
在线值:
发帖
16
回帖
51
粉丝
0
cradiator 活跃值 4 2009-10-24 09:16
4
0
多谢sudami大指点
ReturnsMe
雪    币: 253
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
6
回帖
162
粉丝
0
ReturnsMe 活跃值 2 2009-12-11 23:22
5
0
只判断这个搜不全吧?

INIT:00103E93                 mov     dword ptr [esi+7Ch], offset _NtfsFsdLockControl@8 ; NtfsFsdLockControl(x,x)
INIT:00103E9A                 mov     dword ptr [esi+68h], offset _NtfsFsdDirectoryControl@8 ; NtfsFsdDirectoryControl(x,x)
INIT:00103EA1                 mov     dword ptr [esi+50h], offset _NtfsFsdSetInformation@8 ; NtfsFsdSetInformation(x,x)
INIT:00103EA8                 mov     dword ptr [esi+38h], offset _NtfsFsdCreate@8 ; NtfsFsdCreate(x,x)
INIT:00103EAF                 mov     dword ptr [esi+40h], offset _NtfsFsdClose@8 ; NtfsFsdClose(x,x)
INIT:00103EB6                 mov     dword ptr [esi+44h], offset _NtfsFsdRead@8 ; NtfsFsdRead(x,x)
INIT:00103EBD                 mov     dword ptr [esi+48h], offset _NtfsFsdWrite@8 ; NtfsFsdWrite(x,x)
INIT:00103EC4                 mov     dword ptr [esi+5Ch], offset _NtfsFsdFlushBuffers@8 ; NtfsFsdFlushBuffers(x,x)
INIT:00103ECB                 mov     dword ptr [esi+6Ch], offset _NtfsFsdFileSystemControl@8 ; NtfsFsdFileSystemControl(x,x)
INIT:00103ED2                 mov     dword ptr [esi+80h], offset _NtfsFsdCleanup@8 ; NtfsFsdCleanup(x,x)
INIT:00103EDC                 mov     dword ptr [esi+78h], offset _NtfsFsdShutdown@8 ; NtfsFsdShutdown(x,x)
INIT:00103EE3                 mov     dword ptr [esi+0A4h], offset _NtfsFsdPnp@8 ; NtfsFsdPnp(x,x)
INIT:00103EED                 mov     dword ptr [esi+70h], offset _NtfsFsdDeviceControl@8 ; NtfsFsdDeviceControl(x,x)
INIT:00103EF4                 mov     dword ptr [esi+28h], offset _NtfsFastIoDispatch
INIT:00103EFB                 mov     eax, offset _NtfsFsdDispatchWait@8 ; NtfsFsdDispatchWait(x,x)
INIT:00103F00                 mov     [esi+4Ch], eax
INIT:00103F03                 mov     [esi+0A0h], eax
INIT:00103F09                 mov     [esi+9Ch], eax
INIT:00103F0F                 mov     [esi+58h], eax
INIT:00103F12                 mov     [esi+54h], eax
INIT:00103F15                 mov     eax, offset _NtfsFsdDispatch@8 ; NtfsFsdDispatch(x,x)
INIT:00103F1A                 mov     [esi+64h], eax
INIT:00103F1D                 mov     [esi+60h], eax
INIT:00103F20                 mov     [esi+8Ch], eax
INIT:00103F26                 mov     [esi+88h], eax

后面还有俩函数呢~~~当然搜到也很容易啦~~xp&vista下反正都没变,win7没看过
cvcvxk
雪    币: 2648
活跃值: 活跃值 (60)
能力值: ( LV12,RANK:750 )
在线值:
发帖
126
回帖
3102
粉丝
36
cvcvxk 活跃值 10 2009-12-12 00:57
6
0
NTFS和Fastfat现在基本都有代码了,可以轻易实现自己Mount自己绑定FSD,自己XX~~
skymelai
雪    币: 24
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
3
回帖
23
粉丝
0
skymelai 活跃值 2009-12-12 14:17
7
0
楼主如果能给一个demo出来就好了。。。。。
atkdef
雪    币: 224
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
1
回帖
6
粉丝
0
atkdef 活跃值 2010-3-20 22:47
8
0
内核文件,ZwQuerySystemInformation输出的第一个应该就是吧- -
没必要另外检测cr4?
shijiheima
雪    币: 147
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
10
回帖
58
粉丝
0
shijiheima 活跃值 2010-4-14 08:45
9
0
你做的已经很到位了  我也在研究ssdt!
wlb1357
雪    币: 207
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
3
回帖
22
粉丝
0
wlb1357 活跃值 2010-4-14 09:48
10
0
非常感谢,强帖留名!!
defddr
雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
5
回帖
49
粉丝
0
defddr 活跃值 2010-7-28 10:43
11
0
我没有恶意。
我不知道这位朋友是不是谦。
如果是谦虚是好事,
但是不要菜什么的叫来叫去,不管是称呼自己还是别人。挺。。恶心的。
yeweijun
雪    币: 235
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
5
回帖
43
粉丝
0
yeweijun 活跃值 2010-7-29 16:25
12
0
esi指向DriverObject结构,指令字结构分别为

c7 46 XX YY YY YY YY

c7 86 XX XX XX XX YY YY YY YY (XX为esi的相对偏移,YY为真正的函数地址)

你好。请问这个指令格式。你是如何查询的?
游客
登录 | 注册 方可回帖
返回