-
-
[原创]晒下我的第5题解法~
-
发表于:
2010-1-6 18:24
11009
-
这题是个文件保护,在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的加载基址):
[培训]科锐逆向工程师培训第53期2025年7月8日开班!