Ring3中的NATIVE API,和Ring0的系统调用,都有同名的Zw和Nt系列函数,初次接触会感到很迷茫。

现在就以ZwOpenProcess和NtOpenProcess函数为例,详细阐述下他们的分别和联系。 

ntdll.dll导出了NtOpenProcess和ZwOpenProcess两个函数,我们记为ntdll!NtOpenProcess和ntdll!ZwOpenProcess。仔细看一下,会发现他们的入口点实际上都是一样的,这就是说,ntdll!ZwOpenProcess仅仅是ntdll!NtOpenProcess函数的别名而已,实现如下: 
ZwOpenProcess

.text:7C92D5FE                mov     eax,7Ah         ; NtOpenProcess
.text:7C92D603                mov     edx, 7FFE0300h
.text:7C92D608                call     dword ptr [edx]
.text:7C92D60A                retn     10h 

7FFE0300h处是ntdll!KiFastSystemCall的入口,ntdll!KiFastSystemCall会保存起当前的栈指针,然后通过引发0x2e中断,陷入内核。 
  当触发0x2e中断后,CPU将执行环境切换到Ring0状态,然后去调用内核模块的0x2e处理例程nt!KiSystemService。nt!KiSystemService会在参数检查、栈拷贝等操作之后,根据Ring3代码传递过来的调用号0x7A,在SSDT中查找相应的函数地址,然后调用找到的函数。对于我们的例子来说,这个函数就是内核模块的导出函数nt!NtOpenProcess。nt!NtOpenProcess才是真正的打开进程实现函数。但是内核模块也导出了nt!ZwOpenProcess,这个nt!ZwOpenProcess,有什么用处呢?会不会像ntdll!ZwOpenProcess一样,也仅仅是ntdll!NtOpenProcess的一个别名?实际上,nt!ZwOpenProcess并不仅仅是nt!NtOpenProcess一个别名,我们可以看一下nt!ZwOpenProcess的实现:

kd> u nt!ZwOpenProcess
nt!ZwOpenProcess:
804fede8   mov     eax,7Ah
804feded   lea       edx,[esp+4]
804fedf1   pushfd
804fedf2   push     8
804fedf4   call      nt!KiSystemService (8053d891)
804fedf9   ret       10h 

   与ntdll.ZwOpenProcess是不是很接近?nt!ZwOpenProcess也只是让nt!KiSystemService调用SSDT中的第0x7A号函数,他自己本身没有进行任何打开进程的实现。 
  到这儿,就可以总结一下了:用户空间中的Zw***和Nt***的实现都是一样的,比如ntdll!ZwOpenProcess和ntdll!NtOpenProcess的入口都是0x7C92D5FE,ntdll!ZwOpenFile和ntdll!NtOpenFile的入口都是0f7C92D59E。内核空间中的Zw函数,是Nt函数的一个Stup,只是mov系统调用号到eax中,转而直接调用(注意,没有像ntdll!ZwOpenProcess)nt!KiSystemService去从SSDT中找到相应号码的函数再调用之,真正的实现都在Nt***函数中。下面是一个流程图,仅供参考。

【驱动之四】Nt和Zw相关推荐

  1. Nt*和Zw*开头的函数

    原文链接:http://blog.csdn.net/tianzhhy/article/details/6184265 http://blog.csdn.net/evi10r/article/detai ...

  2. 本地系统服务例程:Nt和Zw系列函数

    Windows本地操作系统服务API由一系列以Nt或Zw为前缀的函数实现的,这些函数以内核模式运行,内核驱动可以直接调用这些函数,而用户层程序只能通过系统进行调用.通常情况下用户层应用程序不会直接调用 ...

  3. Nt*和Zw*系列函数的区别

    ntdll.dll和ntoskrnl.exe的Nt和Zw系列函数区别 in ring3: lkd> ? ntdll!ZwOpenProcess Evaluate expression: 2089 ...

  4. ntdll.dll和ntoskrnl.exe中的NT*和ZW*函数区别

    以NtOpenProcess和ZwOpenProcess为例,结合Windbg的lkd调试来说明 1.Q:ntdll.dll中的Nt*和Zw*区别? lkd> u ntdll!zwopenpro ...

  5. Linux ALSA声卡驱动之四:Codec 以及Codec_dai

    ALSA声卡驱动: 1.Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介 2.Linux ALSA声卡驱动之二:Platform 3. Linux ALSA声卡驱动之三:Platf ...

  6. Nt**、Zw**和Rtl** 开头的函数介绍

    首先他们都是微软未公开的函数,之所以未公开主要是因为这些函数大部分功能太强大了,把他们公开会让一些别有用心的人利用.9x下的我不知道,NT(含2000/xp)下你可以参考<Windows NT ...

  7. 驱动拦截NT的API实现隐藏木马客户端

    目前NT下有很多种隐藏文件和目录的方法,其中最简单的一种是给文件和文件夹加上系统属性和隐藏属性,操作系统就会不在显示了,而且查找也找不到了,但是这种方法一点都不彻底,没有可用性!下面我们来介绍用NT驱 ...

  8. Linux ALSA声卡驱动之四:Control设备的创建

    声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢! Control接口 Control接口主要让用户空间的应用程序(alsa-lib)可以访问 ...

  9. Windows驱动_WSK驱动之四WSK例程

    最近看了好多文章,也写了好多博客,但是,最近少了很多实践的关系,这一部分是项目的问题,其实大部分还是自己的问题,今天,竟然,知道,随便修改一点微软的例子还可以赚钱,之前自己还真是没有想到的.后续,自己 ...

最新文章

  1. java练气期(1)----java高级(JDBC)
  2. 【社招持续篇】云和恩墨虚位以待,你来不来!
  3. Spring Boot学习
  4. 【读书笔记】C#高级编程 第九章 字符串和正则表达式
  5. Mathematica处理高斯光束的分布图像
  6. java dns 解析域名解析_JavaWeb(3)DNS域名解析
  7. docker push received unexpected HTTP status: 503 Service Unavailable
  8. 《HarmonyOS开发 - 小凌派-RK2206开发笔记》第3章 应用开发
  9. 蓝桥杯——罗马数字转换器
  10. 字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?
  11. 五一国际劳动节知多少!祝五一劳动节快乐! Happy International Workers‘Day!
  12. 门禁系统布线的十点注意事项
  13. python中numpy zeros_为什么numpy.zeros和numpy.zeros的性能不同?
  14. Bessie Goes Moo(暴力)
  15. 最新斩获2022字节暑期实习生 一二三面(已过|新鲜面经)
  16. 樱花FRP内网穿透登录群晖相册ds photo
  17. html页面等级划分,100分数等级划分
  18. kicad 自动生成封装库_【工具】KiCad版本嘉立创SMT贴片库及问题说明
  19. js的单双引号嵌套问题
  20. centos建立回收站

热门文章

  1. 51xunji双PWM 002 蓝牙 L9110电机驱动
  2. HTML学生个人网站作业设计——html css javascript简单的大学生书店网页制作(13页) web期末作业设计网页 web结课作业的源码 web网页设计实例作业
  3. 计算机图形学【GAMES-101】6、阴影映射(Shadow Mapping)
  4. 《SAP CRM管理与实施指南》一一1.2 SAP CRM解决方案概述
  5. 推出营销云和IoT云 打造CRM全流程解决方案
  6. ubuntu10.04下设置桌面特效
  7. 2021一款精美图片压缩网站源码
  8. 用VC++6.0编写拨号程序 作者:陈晓东 (转)
  9. 示波器相关术语介绍(上)
  10. LG. Hankson 的趣味题,C语言