看流星社区

 找回密码
 注册账号
查看: 3294|回复: 7

Zw函数与Nt函数的分别与联系

[复制链接]

该用户从未签到

发表于 2011-8-7 14:00:58 | 显示全部楼层 |阅读模式
in ring3:
lkd> ? ntdll!ZwOpenProcess
Evaluate expression: 2089999739 = 7c92dd7b
lkd> ?ntdll!NtOpenProcess
Evaluate expression: 2089999739 = 7c92dd7b

可以看到,在ntdll中,ZwOpenProcess和NtOpenProcess其实是同一个函数,只不过拥有两个名称而已。
也就是说,在ring3环境中,Zw***系列函数和Nt***系列函数无区别。

in ring0:
lkd> u nt!ZwOpenProcess
nt!ZwOpenProcess:
804de044 b87a000000 mov eax,7Ah
804de049 8d542404 lea edx,[esp+4]
804de04d 9c pushfd
804de04e 6a08 push 8
804de050 e8dc150000 call nt!KiSystemService (804df631)
804de055 c21000 ret 10h

lkd> u nt!NtOpenProcess
nt!NtOpenProcess:
80573d06 68c4000000 push 0C4h
80573d0b 6810b44e80 push offset nt!ObWatchHandles+0x25c (804eb410)
80573d10 e826f7f6ff call nt!_SEH_prolog (804e343b)
80573d15 33f6 xor esi,esi
80573d17 8975d4 mov dword ptr [ebp-2Ch],esi
80573d1a 33c0 xor eax,eax
80573d1c 8d7dd8 lea edi,[ebp-28h]
80573d1f ab stos dword ptr es:[edi]

可以看得出,ZwOpenProcess函数很短,首先把0x7a(NtOpenProcess的服务号)存入eax,然后做一些保存现场的工作即KiSystemService——这个函数根据eax中的service id在SSDT中查找相应的系统服务,然后调用之。

而NtOpenProcess函数很长(反汇编结果只是一部分),事实上,NtOpenProcess便是真正执行打开进程操作的函数(在r0中通常称为服务,或例程),所以,若在驱动中直接调用Nt系列函数,是不会经过SSDT的,也就不会被SSDT HOOK所拦截。

简单总结如下:
r3下无论如何调用,均无法绕过SSDT HOOK,r0下调用Nt***可以绕过SSDT HOOK。




这里先说明下2000和XP系统用户模式到内核模式是通过软中断的方式进入的。2000下通过"int 2e",而XP下通过"sysenter"进入。


这里用WINDBG工具来说明区别:


1.在用户模式下ntdll.dll的Nt和Zw的区别


0:005> u ntdll!ZwCreateFile
ntdll!ZwCreateFile:
7c92d0ae b825000000 mov eax,25h
7c92d0b3 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d0b8 ff12 call dword ptr [edx]
7c92d0ba c22c00 ret 2Ch



0:005> u ntdll!NtCreateFile
ntdll!ZwCreateFile:
7c92d0ae b825000000 mov eax,25h
7c92d0b3 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d0b8 ff12 call dword ptr [edx]
7c92d0ba c22c00 ret 2Ch



函数先将0x25号放入eax,再将函数地址的指针放入edx,可以查看函数地址在7FFE03000为7C92E510

7FFE0300 : 10 E5 92 7C

进入7C92E510可以发现调用了sysenter,从用户态进入内核态。

7C92E510 > 8BD4 mov edx, esp
7C92E512 0F34 sysenter


纵观ntdll.dll里的Nt和Zw发现就是同一个函数,也就是ntdll.dll的Nt和Zw其实是一个函数的两个别名而已。


2.进入内核态查看:

lkd> u nt!ZwCreateFile
nt!ZwCreateFile:
80501020 b825000000 mov eax,25h
80501025 8d542404 lea edx,[esp+4]
80501029 9c pushfd
8050102a 6a08 push 8
8050102c e860140400 call nt!KiSystemService (80542491)
80501031 c22c00 ret 2Ch

lkd> u nt!NtCreateFile
nt!NtCreateFile:
8057a084 8bff mov edi,edi
8057a086 55 push ebp
8057a087 8bec mov ebp,esp
8057a089 33c0 xor eax,eax
8057a08b 50 push eax
8057a08c 50 push eax
8057a08d 50 push eax
8057a08e ff7530 push dword ptr [ebp+30h]
lkd> u
nt!NtCreateFile+0xd:
8057a091 ff752c push dword ptr [ebp+2Ch]
8057a094 ff7528 push dword ptr [ebp+28h]
8057a097 ff7524 push dword ptr [ebp+24h]
8057a09a ff7520 push dword ptr [ebp+20h]
8057a09d ff751c push dword ptr [ebp+1Ch]
8057a0a0 ff7518 push dword ptr [ebp+18h]
8057a0a3 ff7514 push dword ptr [ebp+14h]
8057a0a6 ff7510 push dword ptr [ebp+10h]
lkd> u
nt!NtCreateFile+0x25:
8057a0a9 ff750c push dword ptr [ebp+0Ch]
8057a0ac ff7508 push dword ptr [ebp+8]
8057a0af e868d8ffff call nt!IoCreateFile (8057791c)
8057a0b4 5d pop ebp
8057a0b5 c22c00 ret 2Ch


可以发现Zw内核态下调用了nt!KiSystemService (80542491) 调用SSDT
而Nt内核态下直接调用了nt!IoCreateFile (8057791c) 此函数直接实现了功能


所以不管是否在用户或者内核态Zw函数都是要经过SSDT 而Nt用户态经过,内核态就可以绕过SSDT


附:


操作系统根据是否是多处理器平台和是否支持PAE(Physical Address Extension)来选择合适的系统:


ntoskrnl.exe

单x86处理器,使用不超过4GB的物理内存。

ntkrnlpa.exe

单x86处理器,支持PAE。

ntkrnlmp.exe

多处理器,使用不超过4GB的物理内存。

ntkrpamp.exe

多处理器,支持PAE。


以NtOpenProcess和ZwOpenProcess为例,结合Windbg的lkd调试来说明

游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2011-12-3 17:20:58 | 显示全部楼层
谢谢分享谢谢分享

该用户从未签到

发表于 2012-1-14 22:20:28 | 显示全部楼层
回复 1# 舒天倦云


    dddddddddddd

该用户从未签到

发表于 2012-8-11 01:12:33 | 显示全部楼层
这个好啊棒棒

该用户从未签到

发表于 2014-6-9 22:36:44 | 显示全部楼层
今天签到了吗?请选择您此刻的心情图片并写下今天最想说的话!

该用户从未签到

发表于 2014-6-10 13:05:33 | 显示全部楼层
谢谢分享谢谢分享

该用户从未签到

发表于 2019-3-28 16:05:40 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!

该用户从未签到

发表于 2019-3-28 16:43:25 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 23:41

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表