首页
社区
课程
招聘
[转帖]Nt系列函数与Zw系列函数的关系
发表于: 2015-7-8 11:18 4268

[转帖]Nt系列函数与Zw系列函数的关系

2015-7-8 11:18
4268
常有人搞不清这两组函数的关系,因为调用接口和实现功能一样,有些人就认为他们是同一个函数的不同名称。实际上他们是有区别的,借助windbg这个工具,我们就可以一探究竟。

        在ring3层,这两组函数确实是同一个函数,用u命令对NtReadFile以及ZwReadFile反汇编发现,他们的起始地址是一样的。调用ntdll.dll这个动态库的函数时,声明成这两种形式都可以,不过按照微软的说法,声明成Nt函数更恰当些,Zw开头的函数表示的是内核函数。熟悉ntdll.dll这个动态库的人都知道,其实这个库里面的函数都是stub函数,并不做实际功能,只是系统调用进入内核的入口。

        到了ring0层情况就不同了,两种形式的函数是不同的函数,Nt开头的函数是真正执行功能的函数。应用层所用的系统API都会通过int 2e或者sysenter指令切换到内核,然后调用内核导出的Nt系列函数。分析SSDT表即可以得出这个结论。

        而对于内核态的Zw开头的函数,通过汇编也可以发现,它的结构与ntdll.dll里面的函数类似,最后都会调用对应的内核nt函数,只不过已经在内核态,就没有int 2e这种切换状态的指令,也没有陷阱帧,但调用形式差不多,都是通过调用号来从SSDT中找到实现功能的Nt函数。微软建议内核开发者使用Zw系列的函数,因为这些函数多了一些参数检查的代码。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 5
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了 内核很有趣
2015-7-8 11:20
0
雪    币: 2291
活跃值: (933)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
Kernel中Zw调Nt要从KiSystemService经过。KiSystemService入口就会建立陷阱帧。
2015-7-8 13:40
0
游客
登录 | 注册 方可回帖
返回
//