Nt* 与 Zw* 区别

以ReadFile为例

ntdll.dll导出了ZwReadFile和NtReadFile

在用户态

不管你调用ZwReadFile还是NtReadFile都是一样的

因为他们是同一个函数的两个不同名称而已....

而且他们最终都会调用到ntoskrnl中的NtReadFile中去

在内核态

ntoskrnl.exe导出了ZwReadFile和NtReadFile

Ntoskrnl导出的NtReadFile是真正的执行函数,ZwReadFile是一个stub函数

内核态调用ZwReadFile,会将Previous Mode设置为Kernel Mode,然后再调用NtReadFile

而在内核态直接调用NtReadFile,不会改变Previous Mode。

NtReadFile中会检测当前调用来自用户态还是内核态

如果是来自内核态,不会检测参数;而如果是来自用户态,就会做一系列的参数检测。

我们知道,内核组件可能运行在任意进程的上下文中,当它调用NtReadFile时,因为Previous Mode很可能是User Mode,

而我们的参数请求的内核态的地址,这时通常就会产 STATUS_ACCESS_VIOLATION 错误

所以内核态一般用Zw*系列的函数

关于Nt*与Zw*更为详细的介绍,请参考 Nt vs. Zw - Clearing Confusion On The Native API

时间: 2024-08-27 22:38:52

Nt* 与 Zw* 区别的相关文章

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

OpenProcess-->ntdll!NtOpenProcess-->ntdll!zwOpenProcess-->ntdll!KiFastSystemCall() ↓mov edx, esp ↓sysenter 用户层------------------------------------------------------------------------------------------------------ ↓ 内核层 nt!KiFastCallEntry()      

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

Windows本地操作系统服务API由一系列以Nt或Zw为前缀的函数实现的,这些函数以内核模式运行,内核驱动可以直接调用这些函数,而用户层程序只能通过系统进行调用.通常情况下用户层应用程序不会直接调用Nt和Zw系函数,更多的是通过直接调用Win32函数,这些Win32函数内部会调用Nt和Zw系函数,但也仅限于通常情况下,当Win32函数不支持一些操作时,用户层也会直接调用这些本地系统服务函数. Nt前缀是Windows NT的缩写,但Zw前缀并没有任何意义,使用Zw只是避免跟其他已存在和未来可能

Windows内核学习笔记之浅析系统调用

在潘老师<Windows内核原理与实现>一书,解析了Windows应用程序发出的系统调用.图示如下. 从图可看出,系统调用所提供的服务(函数)是运行在内核中的,也就是说,在"系统空间"中. 用户空间与系统空间所在的内存区间不一样,同样,对于这两种区间,CPU的运行状态也不一样. 在用户空间中,CPU处于"用户态":在系统空间中,CPU处于"系统态". CPU从系统态进入用户态是容易的,因为可以执行一些系统态特有的特权指令,从而进入用户

SSDT表概念详解

SSDT 的全称是 System Services Descriptor Table,系统服务描述符表. 这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来.Ring3下调用的所有函数最终都会先进入到ntdll里面的,比如ReadFile,就会进入ntdll的ZwReadFile SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址.服务函数个数等. 1. //系统服务描述符表-在ntoskrnl.exe中导

[转帖]Windows 内核说明

来源:https://zhidao.baidu.com/question/398191459.html 自己的理解. windows 的内核文件 是在 c:\windows\system32 目录下面的 最核心的文件 应该是 ntoskrnl.exe 文件属性为:NT Kernel & System linux的内核文件是在 /boot/ vmlinuz 就是压缩过后的内核文件. -rw-r--r--. 1 root root 135K Nov 23 2016 config-3.10.0-514

[转载]Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取

原文地址:点击打开链接 为什么要写这篇文章 1.      因为最近在学习<软件调试>这本书,看到书中的某个调试历程中讲了Windows的系统调用的实现机制,其中讲到了从Ring3跳转到Ring0之后直接进入了KiFastCallEntry这个函数. 2.      碰巧前天又在网上看到了一篇老文章介绍xxx安全卫士对Windows系统调用的Hook,主要就是Hook到这个函数 3.      刚刚做完毕业设计,对使用中断来实现系统调用的方式记忆犹新. 以上原因导致我最近眼前总是出现系统调用这

FlokiBot 银行木马详细分析

FlokiBot 是最近一款针对于欧洲和巴西联邦共和国的银行木马,作为一款恶意软件工具集,它在一些黑客论坛上被卖到$1000.它通过垃圾邮件和渗透代码工具包来传播.虽说它是继承于ZeuS(宙斯),FlokiBot 也做了很多有趣的改进.有诸如内存截取(RAM scraping),定制的 dropper 这样的新特性,还有似乎从泄露了源码的Carberp 那里借鉴了几行代码. FlokiBot 与其 dropper 都有很多常用或不常用的混淆技术,我们将解开它们的神秘面纱,并着重讨论如何使用 ID

【原创】《windows驱动开发技术详解》第4章实验总结二

1 实验要求(WDM驱动)   2 编写过程 2.1 确立整体架构 2.1.1 入口函数——DriverEntry (1)作用 设置pDriverObject结构体,注册AddDevice和相关PNP函数,包括IRP_MJ_PNP,IRP_MJ_CREATE等 (2)注意 AddDevice在Driver_Object结构体的DriverExtension->AddDevice,原型是NTSTATUS AddDevice (PDRIVER_OBJECT pDriverObject, PDEVIC

深入解析病毒(一)理论篇

猪年送安康,祝大家新一年健康.快乐.愿大家都做一个勤奋努力.真诚奉献的人,幸运会永远的眷顾你们.?引子:?某一天饶有兴趣在卡饭上浏览着帖子,故事的相遇就那么简单.当时一条评论勾起我的好奇心,那么好逆向开始.?根据我的习惯,拿到样本我会线上恶意代码分析,直接拉到virustotal之类的网站上,看看是否已经被大多数杀毒软件所能识别,看一些有价值的数据,如下图所示:??????????????????图片一:基本信息?当看到这个页面时候,看到最后的分析日期是18年11月,又看了一下导出表的函数信息,