首页
社区
课程
招聘
[原创]晒下我的第5题解法~
发表于: 2010-1-6 18:24 11006

[原创]晒下我的第5题解法~

2010-1-6 18:24
11006

这题是个文件保护,在Hijack.sys保护C:\windows\system32\360safe.txt成功后把它删掉。
HijackFile.sys的关键代码VM过了,所以只能黑盒之。
刚开始我的虚拟机中C盘是FAT32,还得我转成NTFS的。
然后加载HijackFile.sys,结果蓝掉了...
查看了一下dump,在调用栈中发现了HijackFile.sys的踪迹,根据调用关系直接锁定ntfs.sys进行分析,也算意外收获。
其实就算没有这个意外,多检查一下基本也能发现它动手脚的地方,如果再参考一下sudami的《NTFS文件系统底层挖掘》的话,就更简单了。
检查Hook我用的是Windbg
lkd> !chkimg -d !ntfs
    f82fd55a-f82fd55e  5 bytes - Ntfs!NtfsCheckValidAttributeAccess
        [ 8b ff 55 8b ec:e9 07 89 e0 89 ]
    f82fe1fe-f82fe201  4 bytes - Ntfs!NtfsOpenAttributeInExistingFile+b (+0xca4)
        [ 1e c1 fd ff:3c 5f ec 89 ]
9 errors : !ntfs (f82fd55a-f82fe201)
再细看一下:
第一个钩子:
lkd> u NtfsCheckValidAttributeAccess
Ntfs!NtfsCheckValidAttributeAccess:
f82fd55a e90789e089      jmp     82105e66
f82fd55f 8b4508          mov     eax,dword ptr [ebp+8]
f82fd562 53              push    ebx
f82fd563 56              push    esi
f82fd564 0fb6700b        movzx   esi,byte ptr [eax+0Bh]
lkd> u 82105e66
82105e66 e9d509f973      jmp     f6096840
82105e6b 8bff            mov     edi,edi //可以借用这部分代码跳回去~~
82105e6d 55              push    ebp
82105e6e 8bec            mov     ebp,esp
82105e70 e9ea761f76      jmp     Ntfs!NtfsCheckValidAttributeAccess+0x5 (f82fd55f)
lkd> u f6096840 //这个就是Fake函数了,被VM过
HijackFile+0x1840:
f6096840 8bff            mov     edi,edi
f6096842 55              push    ebp
f6096843 8bec            mov     ebp,esp
第二个钩子:
lkd> u NtfsOpenAttributeInExistingFile
Ntfs!NtfsOpenAttributeInExistingFile:
f82fe1f3 68ac000000      push    0ACh
f82fe1f8 68f0252ff8      push    offset Ntfs!`string'+0x12c (f82f25f0)
f82fe1fd e83c5fec89      call    821c413e //被替换了,这里本应是call Ntfs!_SEH_prolog
f82fe202 8365dc00        and     dword ptr [ebp-24h],0
f82fe206 8b7510          mov     esi,dword ptr [ebp+10h]
lkd> u 821c413e
821c413e e9ed28ed73      jmp     HijackFile+0x1a30 (f6096a30)
821c4143 e9d8611176      jmp     Ntfs!_SEH_prolog (f82da320)

基本上就很明确了。这两个函数
调用NtfsCheckValidAttributeAccess的地方有NtfsOpenFcbById,NtFsOpenExistingPrefixFcb,NtfsOpenFile,NtfsCreateNewFile
NtfsOpenAttributeInExistingFile的地方有NtfsOpenFile,NtFsOpenExistingPrefixFcb,NtfsOpenFile

要打开存在的文件需要调用NtfsOpenFile,而这个函数里有这样两个钩子,所以文件无法打开。
因为不能对它的钩子做任何改动,所以方法无非是能绕就绕,绕不过就自己实现。
对于经常搞Hook的,想到的第一个方法就是以Hook绕过Hook。
对NtfsCheckValidAttributeAccess处的钩子,因为它已经是在函数头了,在这里已经无法再Hook,所以直接查找所有对NtfsCheckValidAttributeAccess的Call,也就是上面四个函数中,替换Call的地址到我们自己的函数中,然后执行覆盖掉的三句指令后再跳到NtfsCheckValidAttributeAccess+5处就可以了(注意看那个Pool的代码,也可以直接修正call到82105e6b,借用sudami的代码跳回去。。。).
对NtfsOpenAttributeInExistingFile处的钩子,因为采用的是替换Call的方法,而前面还有10个字节没有动,所以可以Hook在NtfsOpenAttributeInExistingFile头部,或者NtfsOpenAttributeInExistingFile+5的地方来跳过HijackFile.sys的钩子。
这种方法不难,写过Hook的基本都会,关键是需要得到几个NtfsXx函数的地址,本来自己找挺麻烦的,无非栈回溯而已。但是既然sudami已经帮我们找好了,为什么不用呢?看下面对部分数据的分析(f8844000是HijackFile.sys的加载基址):


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
顶下。
2010-1-6 18:30
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
不错,,只能围观。。。。。
2010-1-6 18:43
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
4
我挂载的时候,自己的IopMountVolume失败了,
但系统的马上又一次IopMountVolume却成功了,真是费解,看来还得跟踪一下。
2010-1-6 18:45
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
至今不会手动挂载。。。
2010-1-6 18:48
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
自己实现一份挂载就行了~
另外最简单的方式就是自己实现个卷驱动(代码直接抄DDK里的)挂自己的硬盘(更深层次可以有自己的ATAPI下层处理,太深了不好说了),然后挂自己的文件系统(嘿嘿,FsRecoXXX过滤,对于新增磁盘做处理就好了)~

具体可以抄抄机器狗怎么挂载原始C盘到虚拟盘,日本人的那个叫dokan的FS里怎么挂FS到虚拟盘的~
2010-1-6 19:13
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
7
V大简直是开源人肉大师啊……啥好东西都知道。。。。。膜拜
2010-1-6 19:34
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
其实我只是觉得我的思路一定有人想过,有人想过,就有强大的靠donate生活的coder写过open source的,所以搜索先来一下,结果果然存在。
2010-1-6 19:43
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
比天书还难看啊,,,,功力不够,
好文章也没法吸引。
2010-1-6 20:01
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
看来找资料范围不能太局限啊,有时得看看老毛子的,有时得看看小鬼子的~~
2010-1-6 20:01
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
写完之后我自己都不想看。。。
2010-1-6 20:02
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
12
看来意淫的范围不能太局限啊,有时得YY老毛子的,有时得YY小鬼子的~~
2010-1-6 21:26
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
13
DeleteFile(".\\360safe.txt")
这个精简~
2010-1-6 22:08
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
未测试请不要乱讲, 随便操作一下360safe.txt,再 DeleteFile 无法删除!
未操作360safe.txt 的情况下,文件系统内部有些东西暂时未处理,过滤不到,出现删掉文件的情况很正常!

2010-1-7 00:49
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
15
操作?你是说自己到资源管理器里打开一次,还是开IE那个?
2010-1-7 02:54
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
按照题目的流程是没问题,题目说了打开IE出现ProtectOK就可以了,没说再打开360safe.txt,也怪不得某些人钻空子啊
2010-1-7 07:44
0
游客
登录 | 注册 方可回帖
返回