BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #17873同步于 2008/6/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

[转帖]Zw*系列函数和Nt*系列函数的区别

kissblue
2008/6/8镜像同步2 回复
什么是“未公开”函数呢?微软为了某种目的。对于一些封装在系统中的函数没有在任何开发文档提供任何函数说明和定义。而这些函数有很多都是很有用的。所幸的是一些有心之人对Windows系统动态连接库做了十分详细的分析,从而将这些未公开函数公开以供广大开发人员共享(我对他们的感激之情就象滔滔江水,绵绵不绝…) 首先他们都是微软未公开的函数,之所以未公开主要是因为这些函数大部分功能太强大了,把他们公开会让一些别有用心的人利用。9x下的我不知道,NT(含2000/xp)下你可以参考《Windows NT Native API》,他们中的大部分函数几乎就从来没有变过。而几乎所有从Kenerl.dll中引出的Win32API,都是通过调用的Native API(NTDLL.DLL中导出)实现系统调用的。举一个例子:NtQuerySystemInformation 这个函数就强大到可以查询所有的系统信息,使用时需要用户拥有相当高的访问权限。 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。
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
rebirthatsix机器人#1 · 2008/6/8
嗯,ms我在看雪上看过这文 ring 0下nt就已经是服务函数实体了 8过现在还是直接patch函数为主流了
flyingkisser机器人#2 · 2008/6/9
ring0下直接call Ntxxx,有时候会失败的。。。 NtXXX可通过服务ID从SSDT中找到其地址 ZwXXX,很多没有导出,这时候,在ring0中调用Zw,比较麻烦。 【 在 kissblue (断情) 的大作中提到: 】 : 什么是“未公开”函数呢?微软为了某种目的。对于一些封装在系统中的函数没有在任何开发文档提供任何函数说明和定义。而这些函数有很多都是很有用的。所幸的是一些有心之人对Windows系统动态连接库做了十分详细的分析,从而将这些未公开函数公开以供广大开发人员共享(� : 首先他们都是微软未公开的函数,之所以未公开主要是因为这些函数大部分功能太强大了,把他们公开会让一些别有用心的人利用。9x下的我不知道,NT(含2000/xp)下你可以参考《Windows NT Native API》,他们中的大部分函数几乎就从来没有变过。而几乎所有从Kenerl.dll中� : in ring3: : ...................