首页
社区
课程
招聘
[求助]为什么inlink hook NtQueryDirectoryFile从第6字节跳老是出错呢
发表于: 2010-10-18 17:39 15609

[求助]为什么inlink hook NtQueryDirectoryFile从第6字节跳老是出错呢

2010-10-18 17:39
15609
为什么inlink hook NtQueryDirectoryFile从第5字节跳老是出错呢?
BYTE  OriginalBytes[7]={0};             //保存原始函数前五个字节           
BYTE JmpAddress[7]={0xE9,0,0,0,0,0x90,0x58}; //0x58就是pop eax

__declspec(naked) NTAPI OriginalNtQueryDirectoryFile(
  IN  HANDLE FileHandle,
  IN  HANDLE Event OPTIONAL,
  IN  PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN  PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN  ULONG Length,
  IN  FILE_INFORMATION_CLASS FileInformationClass,
  IN  BOOLEAN ReturnSingleEntry,
  IN  PUNICODE_STRING FileName OPTIONAL,
  IN  BOOLEAN RestartScan
  )
{

     _asm       
        {   
         
                         lea eax,[ebp+2Ch]  //恢复原指令
                         push eax
                         lea eax,[ebp+28h]
                         push eax
                         mov eax,NtQueryDirectoryFile
                         add eax,11   //如果JmpAddress[7]={0xE9,0,0,0,0,0x90,0x90}; 那么就要add eax,13,即把跳回来的push eax跳过
                         jmp eax               
                       
        }

}
我试了很多次,用双机windgb看JMP地址及代码都没问题,而且,jmp eax后的地址也正确。但就是蓝屏。太奇怪了。
lkd> u NtQueryDirectoryFile
nt!NtQueryDirectoryFile:
8056ef2e 8bff            mov     edi,edi
8056ef30 55              push    ebp
8056ef31 8bec            mov     ebp,esp
8056ef33 8d452c          lea     eax,[ebp+2Ch]
8056ef36 50              push    eax
8056ef37 8d4528          lea     eax,[ebp+28h]
8056ef3a 50              push    eax
8056ef3b 8d4524          lea     eax,[ebp+24h]
就是从红色这句跳。因为占了7字节,所以恢复三句。
     感觉一切正常,但是就是蓝屏。请高手指点一下。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
长跳转,一般情况要计算的, mov eax,NtQueryDirectoryFile 你这个 NtQueryDirectoryFile 貌似不行的
2010-10-18 19:08
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我调试的时候能够正常的跳回去的。只是再往下执行到一个函数的时候返回c0000005然后就蓝掉了,那个函数好象是叫nt!NtUnlockFile。估计是堆栈的问题,但是怎么看都找不出问题。
2010-10-18 19:19
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
kd> u NtQueryDirectoryFile
nt!NtQueryDirectoryFile:
8056ef2e 8bff            mov     edi,edi
8056ef30 55              push    ebp
8056ef31 8bec            mov     ebp,esp
8056ef33 e9d2754b78      jmp     hidefile!MyNtQueryDirectoryFile (f8a2650a)
8056ef38 90              nop
8056ef39 58              pop     eax

8056ef3a 50              push    eax
8056ef3b 8d4524          lea     eax,[ebp+24h]

kd> u OriginalNtQueryDirectoryFile
hidefile!OriginalNtQueryDirectoryFile [c:\hidefile\src2\hidefile.c @ 381]:
f8a264da 8d452c          lea     eax,[ebp+2Ch]
f8a264dd 50              push    eax
f8a264de 8d4528          lea     eax,[ebp+28h]
f8a264e1 50              push    eax
f8a264e2 a19869a2f8      mov     eax,dword ptr [hidefile!_imp__NtQueryDirectoryFile (f8a26998)]
f8a264e7 83c00b          add     eax,0Bh
f8a264ea ffe0            jmp     eax
f8a264ec ce              into

而且jmp eax以后,也能正确回到8056ef39 58              pop     eax,一切都感觉没问题,可是就是蓝屏。
2010-10-19 08:47
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
我给楼主传一个我写的吧。。。。
上传的附件:
2010-10-19 13:25
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上的的确可用。感谢!
2010-10-19 14:16
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请问大牛,你跳转到pop eax后你查看过eax寄存器内容么?你似乎处理过跳回来的eax寄存器,但是没有确保在弹出后作为参数再次压入栈后能与8056ef3b 8d4524          lea     eax,[ebp+24h]所要使用的保持一致性!
2010-10-19 17:35
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
8056ef2e 8bff            mov     edi,edi
8056ef30 55              push    ebp
8056ef31 8bec            mov     ebp,esp
8056ef33 e9d2754b78      jmp     hidefile!MyNtQueryDirectoryFile (f8a2650a)
在MyNtQueryDirectory里面
也有
push ebp
mov ebp,esp
然后你没恢复ebp就jmp到下面吧
hidefile!OriginalNtQueryDirectoryFile [c:\hidefile\src2\hidefile.c @ 381]:
f8a264da 8d452c          lea     eax,[ebp+2Ch]f8a264dd 50              push    eax
f8a264de 8d4528          lea     eax,[ebp+28h]
ebp的值不是原来的了
2010-10-19 18:21
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
函数中间hook的话必须保证返回到原始函数时各个寄存器的状态一样
jmp     hidefile!MyNtQueryDirectoryFile (f8a2650a)
可以改成 pushad/pushf/jmp/popf/popad
2010-10-19 18:29
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
pushad/pushf/jmp/popf/popad 这种方法我用过,还是不行。直接蓝掉。我甚至在
8056ef33 e9d2754b78      jmp     hidefile!MyNtQueryDirectoryFile (f8a2650a)
之前加入push eax或pushad,但是还是蓝屏。即:
BYTE JmpAddress[7]={0x50,0xE9,0,0,0,0x90,0x58}; //0x50为push eax
或:
BYTE JmpAddress[7]={0x60,0xE9,0,0,0,0x90,0x58}; //0x50为pushaf
        令我想不通的是,如果从函数入口就加入jmp一点问题都没有,一从中间,不管怎么平衡堆栈都不行。
2010-10-19 23:18
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=Prochg;874460]8056ef2e 8bff            mov     edi,edi
8056ef30 55              push    ebp
8056ef31 8bec            mov     ebp,esp
8056ef33 e9d2754b78      jmp     hidefile!MyNtQueryDirectoryFile (f8a2650a)
在MyNtQueryDirectory里面
也有
push ebp
mov ebp,esp
然后你没恢复ebp就jmp到下面吧
hidefile!OriginalNtQueryDirectoryFile [c:\hidefile\src2\hidefile.c @ 381]:
f8a264da 8d452c          lea     eax,[ebp+2Ch]f8a264dd 50              push    eax
f8a264de 8d4528          lea     eax,[ebp+28h]
ebp的值不是原来的了 [/QUOTE]
ebp的值我也考虑恢复过了,我在jmp之前用push ebp,然后跳过去以后用pop ebp也不行。
2010-10-19 23:24
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
12
楼主上代码吧。。
2010-10-20 12:43
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你跳到Hook函数后怎么处理的。
因为参数是在堆栈里面的,push ebp后堆栈改变了。
你jmp到HookXX后,里面的参数值也改变了。
2010-10-20 16:29
0
游客
登录 | 注册 方可回帖
返回
//