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

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

1. ntdll!NtOpenProcess() 会定向到 ntdll!zwOpenProcess() 里,它们是完全一样的,只是名字不同而已!
2. nt!ntopenprocess是实现函数具体过程, nt!zwopenprocess是在ring 0下通过SSDT服务表,KiSystemService调用ntoskrnl.exe中的中断处理程序Nt*函数。
3. 在用户层的 stub 函数会使用 sysenter 指令切入到内核层的 KiFastCallEntry() 函数,再由 KiFastCallEntry() 函数分发到相应的系统服务例程执行。

ntdll.dll和ntoskrnl.exe中的NT*和ZW*函数调用流程分析
NtOpenProcess和ZwOpenProcess为例,结合Windbg的调试来说明
1.ntdll.dll中的Nt*和Zw*区别?

0:000> u ntdll!zwopenprocess l4
ntdll!NtOpenProcess:
774d5e70 b8be000000 mov eax,0BEh
774d5e75 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
774d5e7a ff12 call dword ptr [edx]
774d5e7c c21000 ret 10h
0:000> u ntdll!ntopenprocess l4
ntdll!NtOpenProcess:
774d5e70 b8be000000 mov eax,0BEh
774d5e75 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
774d5e7a ff12 call dword ptr [edx]
774d5e7c c21000 ret 10h

A:从汇编代码来看,两者别无区别,都是通过系统服务调度程序KiSystemService调用ntoskrnl.exe中的中断处理程序Nt*函数。

lkd> u nt!zwopenprocess l6
nt!ZwOpenProcess:
8403ce58 b8be000000 mov eax,0BEh
8403ce5d 8d542404 lea edx,[esp+4]
8403ce61 9c pushfd
8403ce62 6a08 push 8
8403ce64 e8b5190000 call nt!KiSystemService (8403e81e)
8403ce69 c21000 ret 10h

lkd> u nt!ntopenprocess l20
nt!NtOpenProcess:
84217205 8bff mov edi,edi
84217207 55 push ebp
84217208 8bec mov ebp,esp
8421720a 51 push ecx
8421720b 51 push ecx
8421720c 64a124010000 mov eax,dword ptr fs:[00000124h]
84217212 8a803a010000 mov al,byte ptr [eax+13Ah]
84217218 8b4d14 mov ecx,dword ptr [ebp+14h]
8421721b 8b5510 mov edx,dword ptr [ebp+10h]
8421721e 8845fc mov byte ptr [ebp-4],al
84217221 ff75fc push dword ptr [ebp-4]
84217224 ff75fc push dword ptr [ebp-4]
84217227 ff750c push dword ptr [ebp+0Ch]
8421722a ff7508 push dword ptr [ebp+8]
8421722d e889510600 call nt!PsOpenProcess (8427c3bb)
84217232 c9 leave
84217233 c21000 ret 10h

从汇编代码可知 NT*是实现函数具体过程, 而ZW*函数是在ring 0下通过SSDT服务表,KiSystemService调用ntoskrnl.exe中的中断处理程序Nt*函数。

时间: 2024-08-17 23:05:22

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

vs 如何将dll打包到exe中

方法如下:首先需要安装NuGet 然后安装Fody.Costura 重新启动vs 编译项目即可 虽然根目录下还生成了dll但是你的程序已经可以脱离dll运行了,其实是将你的dll打入了exe中你可以看到exe的体积变大. 详细步骤参考:http://www.cnblogs.com/lonelyxmas/p/5568876.html(转自博客园) 安装包下载:https://www.nuget.org/packages/Fody/

.NET Winform 将引用的dll文件集成到exe中(转)

Winform程序经常需要引用一些第三方dll文件,这些dll在发布后与exe文件保存在同一目录下,虽然将dll文件集成到exe中会增大文件尺寸,但程序目录会相对整洁. 下面介绍一种比较简单的集成方法和注意事项. 第一步,将需要引用的dll文件复制到项目中 您可以:1.复制到项目根目录:2.复制到某个文件夹中. 此处以将dll复制到"lib"文件夹为例. 将要引用的dll文件复制到"lib"文件夹中 第二步,引用复制到项目中的dll文件 右键点击"引用&q

exe中嵌入dll和exe中释放dll

BinRes.h ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef _waxie_binary_resource_h_ #define _waxie_binary_resource_h_ #include <string> class BinRes  { public:     BinRes();     virtual ~BinRes(); public:     static void ExtractBinResour

WPF程序将DLL嵌入到EXE的两种方法

WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了>可以参看地下地址(两篇是一样的): 开源中国 http://my.oschina.net/chinesedragon/blog/308336 CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html 引言 前几一写了一个小工具----<Vi

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文

向自己的模块添加错误代码_使用vc自带的工具MC创建资源并将其添加至DLL或EXE中

本文主要介绍怎么使用Visual Studio自带的MC.exe工具来创建一个消息资源并将其添加到自己的DLL(或.exe)中,从而达到为自己的模块添加错误代码的目的. 一.MC工具介绍 Message Compiler(MC) 是用来创建消息资源的工具,这些消息资源被DLL(或EXE)模块引用.MC的输入是一个特定格式的文本文件,即*.mc文件,这种特定格式使得在一个文件中定义多种语言支持变得非常容易. 当编写完成一个*.mc文件之后,为了在程序中使用这个文件,你需要一些操作.首先,使用MC工

分析 kernel32.dll中函数调用流程分析

闲来无事,用IDA, windbg, OD分析kernel32.dll函数调用流程笔记 1.先用分析 CreateFileW,CreateFileA 函数: CreateFileA流程: kernel32.dll!CreateFileA 流程 kernel32.dll!Basep8BitStringToDynamicUnicodeString kernel32.dll!CreateFileWImplementation ; 实际就是导出表 CreateFil 地址 kernel32.dll!Rt

0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突。

下面的代码在编译,运行时没有问题,在输入内容是出现异常如下: 0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突. #include "stdafx.h"#include <conio.h>#include <stdio.h> int main(){ int NUM, I; struct STUDENT { char NAME[30]; int A

vs2010+qt5.40离线exe中dll配置

离线exe动态库环境配置需要采用下面方法 把exe所需要的dll剪切到外面一个文件夹中,然后点击运行exe,exe缺什么dll就往exe下面添加什么dll,有时可能系统下的dll名字相同, 可能dll名字相同但是不一定是自己想要的,可能会出错,需要做的是把其他名字相同的dll也拷贝到exe文件夹下试一试可能就会好 有时exe在自己的电脑下可以运行那是因为自己的电脑系统环境变量中已经有exe离线所需要的dll,但是移到别人的电脑上就会报错, 如果提示缺什么库就往上添什么库,如果程序无法启动很有可能