能力值:
( LV9,RANK:610 )
|
-
-
2 楼
用Zw*是因为要取服务号啊,先搞清楚Nt*和Zw*的区别再说。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
能否给个连接呀?网上找了好久的说,Nt*是在Shadow SSDT里找函数地址的吗?
|
能力值:
( LV7,RANK:100 )
|
-
-
4 楼
我建议LZ先搞清楚为什么SYSCALL要写成下面的形式
*(PULONG)((PUCHAR)_function+1)] 你搞清楚就好了,有问题再找我!
|
能力值:
( 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*不也是这样确定的吗?
|
能力值:
( 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 效果一样
大概就是这样 ~~
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
我来凑凑热闹,在驱动中 使用
SYSCALL(_function) *(PULONG)((PUCHAR)_function+1) 获得服务号,正如楼上各位所说,这个_function只能是 Zw*
但这个Zw* 并不是 楼上所说的 “ZwDeviceIoControlFile是user Mode application called”,它是内核版的stub函数,内核版的stub函数和ntdll中的stub函数是有区别的。
抱歉啊,楼上,挑了点刺,呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
对各位的解答在下不胜感谢.
还有让我不解的是,是否Zw*都在Nt*之前执行的?也就是HOOK了Zw*,也就拦住了Nt*,如果不是,那又是什么情况下USER MODE APP 可以不通过Zw*而直接调用Nt*?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
用户态一般都是通过zw到nt的。
HOOK了Zw*,不一定就HOOK了NT,因为有可能直接在内核态调用NT。
“Nt*是在Shadow SSDT里找函数地址的吗?”,这不是一个概念,Shadow SSDT是相对于SSDT而言,是WIN32.SYS相对于传统的系统调用表而言的。。
在用户态不通过ZW而调用NT,如果不切入内核态的话,不知道怎么调用。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
在这个图中,如果ring3调用ntdll!NtDeviceIoControlFile ,如果不通过SSDT,它是如何进入ring0去调用内核的nt!NtDeviceIoControlFile ?是否是通过nt!ZwDeviceIoControlFile 才最后到NtDeviceIoControlFile ?
ring3调用ntdll!NtDeviceIoControlFile 和调用ntdll!ZwDeviceIoControlFile 有何区别?
|
能力值:
( 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
额。我又跑进来了
|
能力值:
( 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**
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
感谢各位的解惑,再次感谢
|
|
|