首页
社区
课程
招聘
[求助]hook NtDeviceIoControlFile
发表于: 2010-4-8 22:02 15208

[求助]hook NtDeviceIoControlFile

2010-4-8 22:02
15208
#define SYSCALL(_function)  ServiceTable->ServiceTable[ *(PULONG)((PUCHAR)_function+1)]

VOID HookStart( void )
{
    if( !IsHooked ) {
        RealNtDeviceIoControlFile = SYSCALL( NtDeviceIoControlFile );
                SYSCALL( NtDeviceIoControlFile ) = (PVOID) HookNtDeviceIoControlFile;
        IsHooked = TRUE;
    }
}
兰屏
请问这样HOOK不行吗?把NtDeviceIoControlFile改ZwDeviceIoControlFile就不兰屏,为什么呀?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
用Zw*是因为要取服务号啊,先搞清楚Nt*和Zw*的区别再说。。。
2010-4-8 23:11
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能否给个连接呀?网上找了好久的说,Nt*是在Shadow SSDT里找函数地址的吗?
2010-4-9 00:07
0
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
我建议LZ先搞清楚为什么SYSCALL要写成下面的形式
*(PULONG)((PUCHAR)_function+1)] 你搞清楚就好了,有问题再找我!
2010-4-9 00:26
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
_function+1即ServiceID所在地址。整个表达式即取得_function对应的System Service的入口地址在线性内存中的位置
:u ZwOpenKey

ntoskrnl!ZwOpenKey

0008:80400E2A B867000000 MOV EAX,00000067
*(PULONG)((PUCHAR)_function 应该是80400e2a ,80400e2a+1应该是80400e2b地址里的直67,也就是ZwOpenKey的ServiceID。Nt*不也是这样确定的吗?
2010-4-9 00:57
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
SSDT 的话,就hook ZwDeviceIoControlFile
NtDeviceIoControlFile 一般都是inline hook居多。

ZwDeviceIoControlFile是通过中断进入ring0,NtDeviceIoControlFile是实际的ring0执行代码

ZwDeviceIoControlFile是user Mode application called,NtDeviceIoControlFile是Kernel Mode driver Called;
NtDeviceIoControlFile是ZwDeviceIoControlFile中断进入ring0的处理程序。。。

kd> u ZwDeviceIoControlFile l6
nt!ZwDeviceIoControlFile:
804ff2c0 b842000000      mov     eax,42h
804ff2c5 8d542404        lea     edx,[esp+4]
804ff2c9 9c              pushfd
804ff2ca 6a08            push    8
804ff2cc e8b0f10300      call    nt!KeReleaseInStackQueuedSpinLockFromDpcLevel+0x95d (8053e481)
804ff2d1 c22800          ret     28h

lkd> u NtDeviceIoControlFile l14
nt!NtDeviceIoControlFile:
8056f442 8bff            mov     edi,edi
8056f444 55              push    ebp
8056f445 8bec            mov     ebp,esp
8056f447 6a01            push    1
8056f449 ff752c          push    dword ptr [ebp+2Ch]
8056f44c ff7528          push    dword ptr [ebp+28h]
8056f44f ff7524          push    dword ptr [ebp+24h]
8056f452 ff7520          push    dword ptr [ebp+20h]
8056f455 ff751c          push    dword ptr [ebp+1Ch]
8056f458 ff7518          push    dword ptr [ebp+18h]
8056f45b ff7514          push    dword ptr [ebp+14h]
8056f45e ff7510          push    dword ptr [ebp+10h]
8056f461 ff750c          push    dword ptr [ebp+0Ch]
8056f464 ff7508          push    dword ptr [ebp+8]
8056f467 e8ac710000      call    nt!NtWriteFile+0x33d0 (80576618)
8056f46c 5d              pop     ebp
8056f46d c22800          ret     28h
8056f470 cc              int     3
8056f471 cc              int     3
8056f472 cc              int     3

由此可以看出,你用NtDeviceIoControlFile 是取不到服务号的,所以蓝屏很正常。。

因此你可以选择,SSDT hook ZwDeviceIoControlFile;inline hook NtDeviceIoControlFile 效果一样

大概就是这样 ~~
2010-4-9 02:18
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
我来凑凑热闹,在驱动中 使用
SYSCALL(_function) *(PULONG)((PUCHAR)_function+1) 获得服务号,正如楼上各位所说,这个_function只能是 Zw*

但这个Zw* 并不是 楼上所说的 “ZwDeviceIoControlFile是user Mode application called”,它是内核版的stub函数,内核版的stub函数和ntdll中的stub函数是有区别的。
抱歉啊,楼上,挑了点刺,呵呵
2010-4-9 10:32
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对各位的解答在下不胜感谢.
还有让我不解的是,是否Zw*都在Nt*之前执行的?也就是HOOK了Zw*,也就拦住了Nt*,如果不是,那又是什么情况下USER MODE APP 可以不通过Zw*而直接调用Nt*?
2010-4-9 11:02
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用户态一般都是通过zw到nt的。
HOOK了Zw*,不一定就HOOK了NT,因为有可能直接在内核态调用NT。
“Nt*是在Shadow SSDT里找函数地址的吗?”,这不是一个概念,Shadow SSDT是相对于SSDT而言,是WIN32.SYS相对于传统的系统调用表而言的。。
在用户态不通过ZW而调用NT,如果不切入内核态的话,不知道怎么调用。
2010-4-9 11:13
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

在这个图中,如果ring3调用ntdll!NtDeviceIoControlFile ,如果不通过SSDT,它是如何进入ring0去调用内核的nt!NtDeviceIoControlFile ?是否是通过nt!ZwDeviceIoControlFile 才最后到NtDeviceIoControlFile ?
ring3调用ntdll!NtDeviceIoControlFile 和调用ntdll!ZwDeviceIoControlFile 有何区别?
2010-4-9 11:35
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
ring3调用ntdll!NtDeviceIoControlFile 和调用ntdll!ZwDeviceIoControlFile 有何区别?

看看这个就知道了
lkd> u ntdll!ntopenprocess
ntdll!ZwOpenProcess:
7c92d5e0 b87a000000      mov     eax,7Ah
7c92d5e5 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d5ea ff12            call    dword ptr [edx]
7c92d5ec c21000          ret     10h
7c92d5ef 90              nop
额。我又跑进来了
2010-4-9 13:06
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Zwxx  --SSDT---> Ntxx
SYSCALL 从Zw**的mov eax,XX中获取XX。
在表中XX位置得到的是Nt**。
ntdll!Zw**;nt!Zw**都是stub
ntdll!Nt**=ntdllZw**;
nt!Nt**!=ntZw**,一般是函数的具体实现。
通常
ntdll!Zw**(ntdll!Nt**)-->nt!Zw** --->nt!Nt**
2010-4-9 14:30
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢各位的解惑,再次感谢
2010-4-9 15:12
0
游客
登录 | 注册 方可回帖
返回
//