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

蓝桥杯国赛C++ B组实战复盘:核心算法、解题策略与备赛指南 算法竞赛是检验编程能力与计算思维的重要途径,其核心在于将实际问题抽象为数学模型,并运用高效算法求解。动态规划、深度优先搜索等经典算法通过状态转移与剪枝优化,在解决最优化与组合问题时展现出强大的技术价值,广泛应用于路径规划、资源分配等场景。本文以蓝桥杯国赛为背景,深入剖析了动态规划的状态设计、DFS/BFS的剪枝艺术等高频考点,并结合精度处理、大数运算等实战技巧,为参赛者提供了一套从暴力破解到逐步优化的通用解题心法,旨在提升在有限时间内识别问题模型与严谨实现代码的综合能力。 阅读详情

以NtOpenProcess和ZwOpenProcess为例,结合Windbg的lkd调试来说明

1、Q:ntdll.dll中的Nt*和Zw*区别?

lkd> u ntdll!zwopenprocess l4
ntdll!ZwOpenProcess:
7c92d5fe b87a000000      mov     eax,7Ah           //函数服务号
7c92d603 ba0003fe7f       mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)     //函数地址
7c92d608 ff12                     call    dword ptr [edx]
7c92d60a c21000              ret     10h

lkd> u ntdll!ntopenprocess l4
ntdll!ZwOpenProcess:
7c92d5fe b87a000000      mov     eax,7Ah
7c92d603 ba0003fe7f       mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d608 ff12                    call    dword ptr [edx]
7c92d60a c21000              ret     10h
A:从反汇编代码来看,两者别无区别,都是通过SSDT服务表,通过系统服务调度程序KiSystemService调用ntoskrnl.exe中的中断处理程序Nt*函数。

2、Q:ntoskrnl.exe中的Nt*和Zw*有什么区别?

lkd> u nt!zwopenprocess l6
nt!ZwOpenProcess:
804e4c0a b87a000000      mov     eax,7Ah
804e4c0f 8d542404            lea     edx,[esp+4]
804e4c13 9c                        pushfd
804e4c14 6a08                    push    8
804e4c16 e8b69bffff           call    nt!KiSystemService (804de7d1)
804e4c1b c21000               ret     10h

lkd> u nt!ntopenprocess l20
nt!NtOpenProcess:
80582702 68c4000000      push    0C4h
80582707 68e8524f80      push    offset nt!ObWatchHandles+0x25c (804f52e8)
8058270c e87217f6ff      call    nt!_SEH_prolog (804e3e83)
80582711 33f6            xor     esi,esi
80582713 8975d4          mov     dword ptr [ebp-2Ch],esi
80582716 33c0            xor     eax,eax
80582718 8d7dd8          lea     edi,[ebp-28h]
8058271b ab              stos    dword ptr es:[edi]
8058271c 64a124010000    mov     eax,dword ptr fs:[00000124h]
80582722 8a8040010000    mov     al,byte ptr [eax+140h]
80582728 8845cc          mov     byte ptr [ebp-34h],al
8058272b 84c0            test    al,al
8058272d 0f840e7b0100    je      nt!NtOpenProcess+0xc0 (8059a241)
80582733 8975fc          mov     dword ptr [ebp-4],esi
80582736 a1d48e5680      mov     eax,dword ptr [nt!MmUserProbeAddress (80568ed4)]
8058273b 8b4d08          mov     ecx,dword ptr [ebp+8]
8058273e 3bc8            cmp     ecx,eax
80582740 0f8315170800    jae     nt!NtOpenProcess+0x40 (80603e5b)
80582746 8b01            mov     eax,dword ptr [ecx]
80582748 8901            mov     dword ptr [ecx],eax
8058274a 8b5d10          mov     ebx,dword ptr [ebp+10h]
8058274d f6c303          test    bl,3
80582750 0f850c170800    jne     nt!NtOpenProcess+0x4e (80603e62)
80582756 a1d48e5680      mov     eax,dword ptr [nt!MmUserProbeAddress (80568ed4)]
8058275b 3bd8            cmp     ebx,eax
8058275d 0f8309170800    jae     nt!NtOpenProcess+0x5c (80603e6c)
80582763 397308              cmp     dword ptr [ebx+8],esi
80582766 0f9545e6        setne   byte ptr [ebp-1Ah]
8058276a 8b4b0c          mov     ecx,dword ptr [ebx+0Ch]
8058276d 894dc8          mov     dword ptr [ebp-38h],ecx
80582770 8b4d14          mov     ecx,dword ptr [ebp+14h]
80582773 3bce            cmp     ecx,esi

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

3、Q:ntdll.dll中的ZW*和ntoskrnl.exe中的ZW*有什么区别呢?

A:

从发汇编代码来看:ntdll.dll:传入服务号到eax——>调用SharedUserData!SystemCallStub (7ffe0300)函数->KiSystemService---->Nt*(ntoskrnl)
ntoskrnl.exe:传入服务号eax——>KiSystemService--->Nt*(ntoshrnl)

S:从用户模式调用Nt和Zw API,如NtReadFile和ZwReadFile,连接ntdll.lib:
二者没有任何区别,通过设置系统服务表中的索引和在堆栈中设置参数,经由SYSENTER指令进入内核态(而不是象w2k中通过int 0x2e中断),并最终由KiSystemService跳转到KiServiceTable对应的系统服务例程中。由于是从用户模式进入内核模式,因此代码会严格检查用户空间传入的参数。

从内核模式调用Nt和Zw API,连接nooskrnl.lib:
Nt系列API将直接调用对应的函数代码,而Zw系列API则通过KiSystemService,最终跳转到对应的函数代码。
重要的是两种不同的调用对内核中previous mode的改变,如果是从用户模式调用Native API则previous mode是用户态,如果从内核模式调用Native API则previous mode是内核态。previous为用户态时Native API将对传递的参数进行严格的检查,而为内核态时则不会。
调用用户模式Nt API时不会改变previous mode的状态,调用Zw API时会将previous mode改为内核态,因此在进行Kernel Mode Driver开发时可以使用Zw系列API可以避免额外的参数列表检查,提高效率。

ntdll.dll导出函数统计 主要记录ntdll.dll导出的所有函数。可以查看所有导出的函数 立即下载

相关推荐

雷电模拟器9.0最新过检测实战:从修改Build.prop到Xposed模块配置全流程

本文提供了一套针对雷电模拟器9.0的深度伪装实战方案,旨在绕过应用检测。内容涵盖从理解检测机制、获取Root权限、修改Build.prop等静态伪装,到利用Xposed/LSPosed框架进行运行时Hook的动态伪装全流程,帮助用户构建无痕的“真机”环境以稳定运行应用。

z4a5b6的博客 868

了解Zw*与Nt*的区别

某些Zw*和Nt*函数既在ntdll.dll中导出又在ntoskrnl.exe中导出,他们有什么区别呢? 我们分三部分比较: step 1: ntdll.dll中的Zw*和Nt*有什么区别? step 2: ntoskrnl.exe中的Zw*和Nt*有什么区别? step 3: ntdll.dll中的Zw*与ntoskrnl.exe中的Zw*有什么区别? ntdll.dll中的Nt...

移动开发记录 409

UE5.6使用ndisplay,单窗口多画面(单机部署),配置、打包流程,无需switchboard

摘要:本文介绍了在UE5.6中使用ndisplay插件的完整流程。首先需要开启ndisplay和launch插件,创建ndisplay配置文件并设置本地单窗口多画面模式。随后通过Process Explorer获取启动命令用于制作bat文件。打包项目时需删除场景中的ndisplay文件,但保留内容浏览器中的配置,并设置为开发版打包。最后将ndisplay文件导出为.ndisplay格式,与bat文件一起放置在打包目录下,通过bat启动程序。注意修改路径和窗口大小时需保持纯英文路径,且bat代码需保持单行格式

weixin_43912248的博客 977

Windows深入了解故障恢复控制台5--控制台修复具体实例2-ntokrnl

Ntoskrnl.exe异常或丢失造成系统不能启动,截图如下 造成这个问题的原因是多种多样的,大体有这么2种原因 1. Ntoskrnl.exe 损坏或丢失 2. 硬件损坏或兼容性问题 硬件损坏或兼容性问题比较少见,但确实存在;硬件损坏多见于内存,我们可以将内存更换,来检查是否解决问题;兼容性问题则多见于兼容机, 像Dell, IBM, HP...

weixin_33883178的博客 349

京东技术产品经理面试全记录:从简历投递到一面45分钟实战复盘

本文深度复盘京东技术产品经理面试全流程,从策略准备、思维题拆解、项目阐述到反问谈判,提供了一套可演练的求职策略体系。文章强调该岗位需具备横跨技术与商业的枢纽能力,并通过“QQ分组vs微信标签”等案例,剖析了产品思维与结构化表达在面试中的关键作用,助力候选人将紧张转化为掌控感。

weixin_29275257的博客 630

独立站SaaS平台源码搭建全流程指南:从零到部署

一、什么是独立站SaaS?二、搭建前的准备工作技术选型建议模块 推荐方案 备选方案前端框架 React/Vue3 + TypeScript Angular后端框架 Spring Boot (Java)/Django (Python) Node.js (NestJS)数据库 MySQL + Redis PostgreSQL/MongoDB云服务 阿里云/腾讯云/AWS 华为云容器化 Docker + Kubernetes Docker Compose环境要求。

Vx18664956126的博客 1893

NT 函数原型

NTSYSAPI NTSTATUS NTAPI NtAcceptConnectPort( OUT PHANDLE PortHandle, IN PVOID PortIdentifier, IN PPORT_MESSAGE Message, IN BOOLEAN Accept, IN OUT PPORT_VIEW ServerView OPTIONAL, OUT PREMOTE_P

lei35151的专栏 4508

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

深入解析Windows操作系统——系统结构

系统结构

过好每一天的女胖子 1824

STM32-DAC定时器触发三角波生成【频率与幅度精准控制】

本文详细介绍了STM32 DAC定时器触发三角波生成的原理与实现方法,涵盖硬件配置、频率与幅度精准控制技巧及代码实现。通过定时器触发DAC模块,可灵活调节三角波的频率和幅度,适用于信号发生器等高精度应用场景。

weixin_29161785的博客 455

YOLOv8 超参数调优教程! 使用Ray Tune进行高效的超参数调优!

YOLOv8超参数调优教程!😎 使用Ray Tune进行高效的超参数调优!

Coding... 1万+

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

OpenProcess-->ntdll!NtOpenProcess-->ntdll!zwOpenProcess-->ntdll!KiFastSystemCall()                                   ↓mov edx, esp                  ...

weixin_30629977的博客 254

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

博主基于https://github.com/hpc203/GroundingDINO-onnxrun项目分享的onnx c++推理代码,修改为GroundingDINO模型的tensorrt推理代码。对于600x400的输入,在3060显卡下,cuda 12.1,TensorRT-10.4.0,window环境下53ms处理完一张图片。

a486259的博客 1221

Zw*与Nt*的区别

<br />某些Zw*和Nt*函数既在ntdll.dll中导出又在ntoskrnl.exe中导出,他们有什么区别呢?<br />我们分三部分比较:<br />step 1: ntdll.dll中的Zw*和Nt*有什么区别?<br />step 2: ntoskrnl.exe中的Zw*和Nt*有什么区别?<br />step 3: ntdll.dll中的Zw*与ntoskrnl.exe中的Zw*有什么区别? <br />        ntdll.dll中的Nt*与ntoskrnl.exe中的Nt*有什么区别

十年磨一剑,霜刃未曾试! 1553

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ZW与NT函数区别

区别: Ntdll.dll中:完全一样 Ntoskrnl.exe中: Zw*nt*,即nt函数更底层 Zw*函数会把PreviousMode设置为KernelMode  然后再调用Nt*函数,因此在Nt*函数中就不会进行参数检查。而如果直接调用Nt*函数的话 , 必须自己将PreviousMode设置为KernelMode,否则PreviousMode很可能仍然是UserMode, 这样

zhuhuibeishadiao 3185

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Nt*与Zw*的区别

今天在看Undocumented Windows 2000 Secrets的时候, 一段对于Nt*与Zw*的区别,看了很久,看得不是很明白,后来通过网上查阅,现在比较清楚了. 以下为原文: "一组与执行体的系统服务(executive's system services)平行的入口点.从内核模式的代码()中调用一个ZwXxx入口点将获得相应的系统服务...

weixin_30909575的博客 274

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ntoskrnl.exe中Zw*与Nt*的区别

某些Zw*和Nt*函数既在ntdll.dll中导出又在ntoskrnl.exe中导出,他们有什么区别呢? 我们分三部分比较: step 1: ntdll.dll中的Zw*和Nt*有什么区别? step 2: ntoskrnl.exe中的Zw*和Nt*有什么区别? step 3: ntdll.dll中的Zw*与ntoskrnl.exe中的Zw*有什么区别?          ntdll.d

shenjianxz的博客 974
上一篇: Zw*与Nt*的区别
下一篇: MFC 获取命令行参数
sysprogram
博客等级 码龄17年 298粉丝 442原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值