模块 5 - Windows 架构
恶意软件开发课程 - Windows 架构
模块 5 - Windows 架构#
[!IMPORTANT] 本知识库声明
本知识库由本人整理自互联网 MalDev Academy 泄露资源,并由本人手动翻译为中文,过程中增加了大量关键技术提示与实践心得。
- 内容完整性:并未修改任何核心代码与技术逻辑,仅做汉化与注释加强。
- 版权归属:原始知识产权归原作者/官方所有。
- 支持正版:本仓库仅供内部学习交流,如果您有经济能力,请务必支持正版课程。
- 权利申诉:如相关内容侵犯了您的权益,请联系我,我将立即核实并删除。
Windows 架构#
简介#
本模块解释 Windows 架构以及 Windows 进程和应用程序底层发生的事情。
💡 初学者提示:为什么要学习 Windows 架构?
理解 Windows 架构是恶意软件开发的基础:
- 知道程序如何与操作系统交互
- 理解用户模式和内核模式的区别
- 学会如何绕过安全机制
- 掌握系统调用 (Syscall) 的原理
Windows 架构#
运行 Windows 操作系统的计算机内的处理器可以在两种不同的模式下运行:用户模式 (User Mode) 和内核模式 (Kernel Mode)。应用程序在用户模式下运行,而操作系统组件在内核模式下运行。当应用程序想要完成一项任务(例如创建文件)时,它无法独自完成。能够完成该任务的唯一实体是内核,因此应用程序必须遵循特定的函数调用流程。下图显示了此流程的高级视图。

-
用户进程 (User Processes) - 由用户执行的程序/应用程序,如记事本、Google Chrome 或 Microsoft Word。
-
子系统 DLL (Subsystem DLLs) - 包含用户进程调用的 API 函数的 DLL。例如
kernel32.dll导出 CreateFile ↗ Windows API (WinAPI) 函数,其他常见的子系统 DLL 包括ntdll.dll、advapi32.dll和user32.dll。 -
Ntdll.dll - 一个系统级 DLL,是用户模式中可用的最低层。这是一个特殊的 DLL,可以创建从用户模式到内核模式的转换。这通常被称为原生 API 或 NTAPI。
-
执行内核 (Executive Kernel) - 这就是所谓的 Windows 内核,它调用内核模式中可用的其他驱动程序和模块来完成任务。Windows 内核部分存储在 “C:\Windows\System32” 下的一个名为
ntoskrnl.exe的文件中。
📚 知识扩展:用户模式 vs 内核模式
用户模式 (User Mode):
- 权限受限
- 无法直接访问硬件
- 崩溃只会影响当前程序
- 所有普通应用程序都在这里运行
内核模式 (Kernel Mode):
- 完全权限
- 可以直接访问硬件和内存
- 崩溃会导致蓝屏 (BSOD)
- 操作系统核心和驱动程序在这里运行
为什么需要分离?
- 安全性:防止恶意程序直接控制硬件
- 稳定性:应用程序崩溃不会影响整个系统
- 隔离:每个应用程序有自己的内存空间
类比理解:
- 用户模式 = 普通员工:只能使用办公室提供的工具
- 内核模式 = 系统管理员:可以访问机房,配置服务器
函数调用流程#
下图显示了创建文件的应用程序示例。它从用户应用程序调用 kernel32.dll 中可用的 CreateFile WinAPI 函数开始。Kernel32.dll 是一个关键的 DLL,向应用程序公开 WinAPI,因此可以看到大多数应用程序都加载了它。接下来,CreateFile 调用其等效的 NTAPI 函数 NtCreateFile,该函数通过 ntdll.dll 提供。然后 Ntdll.dll 执行汇编 sysenter (x86) 或 syscall (x64) 指令,将执行转移到内核模式。然后使用内核 NtCreateFile 函数,该函数调用内核驱动程序和模块来执行请求的任务。

💡 初学者提示:理解函数调用层次
从上到下的调用链:
plaintext你的程序 (User Mode - 用户模式) ↓ CreateFile() 在 kernel32.dll (高层 API) ↓ NtCreateFile() 在 ntdll.dll (Native API) ↓ syscall 指令 (切换到内核模式) ↓ NtCreateFile() 在 ntoskrnl.exe (Kernel Mode - 内核模式) ↓ 文件系统驱动程序 ↓ 硬盘驱动器每一层的作用:
- kernel32.dll:提供友好、易用的接口
- ntdll.dll:提供更底层的接口,准备系统调用
- syscall:切换 CPU 从用户模式到内核模式
- ntoskrnl.exe:实际执行操作
为什么有这么多层?
- 抽象化:每一层隐藏下一层的复杂性
- 兼容性:高层 API 更稳定,底层可以改变
- 安全性:用户程序不能直接调用内核
函数调用流程示例#
此示例通过调试器显示函数调用流程。这是通过将调试器附加到通过 CreateFileW Windows API 创建文件的二进制文件来完成的。
用户应用程序调用 CreateFileW WinAPI。

接下来,CreateFileW 调用其等效的 NTAPI 函数 NtCreateFile。

最后,NtCreateFile 函数使用 syscall 汇编指令从用户模式转换到内核模式。然后内核将创建文件。

📚 知识扩展:什么是 Syscall?
Syscall (系统调用) 是从用户模式切换到内核模式的门户。
技术细节:
- x86 (32位):使用
sysenter指令- x64 (64位):使用
syscall指令Syscall 编号 (System Service Number - SSN): 每个内核函数都有一个唯一的编号,例如:
plaintextmov r10, rcx mov eax, 55h ; NtCreateFile 的系统调用号 (Windows 10) syscall ; 执行系统调用 ret为什么这对恶意软件开发重要?
- 绕过 Hooking:许多 EDR/AV 会 hook ntdll.dll 中的函数
- 直接系统调用:跳过 ntdll,直接执行 syscall
- 隐蔽性:减少 API 调用痕迹
警告: 直接使用 syscall 是高级技术,后续模块会详细讲解!
直接调用原生 API (NTAPI)#
重要的是要注意,应用程序可以直接调用系统调用(即 NTDLL 函数),而无需通过 Windows API。Windows API 只是充当原生 API 的包装器。话虽如此,原生 API 更难使用,因为它没有得到 Microsoft 的正式文档支持。此外,Microsoft 建议不要使用原生 API 函数,因为它们可以随时更改而不发出警告。
后续模块将探讨直接调用原生 API 的优势。
💡 初学者提示:Windows API vs Native API
对比表:
特性 Windows API (Win32) Native API (NTAPI) 文档 完善的官方文档 未正式文档化 稳定性 版本间保持兼容 可能随时改变 易用性 友好、易学 复杂、难用 性能 略慢(多一层包装) 更快(直接调用) 检测 容易被监控 较难被监控 示例 CreateFile NtCreateFile 什么时候使用 Native API?
- ✅ 绕过 API Hook
- ✅ 需要更精细的控制
- ✅ 某些功能只有 Native API 提供
- ✅ 规避 EDR/AV 监控
什么时候使用 Windows API?
- ✅ 正常的应用程序开发
- ✅ 需要兼容性和稳定性
- ✅ 初学阶段
实际例子:
c// Windows API - 简单易用 HANDLE hFile = CreateFileW( L"test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); // Native API - 更底层,更复杂 HANDLE hFile; UNICODE_STRING fileName; RtlInitUnicodeString(&fileName, L"\\??\\C:\\test.txt"); OBJECT_ATTRIBUTES objAttr; InitializeObjectAttributes(&objAttr, &fileName, ...); IO_STATUS_BLOCK ioStatusBlock; NtCreateFile( &hFile, GENERIC_WRITE, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 );
🎯 本模块学习要点
- ✅ 理解用户模式和内核模式的区别
- ✅ 掌握 Windows API 调用链条
- ✅ 了解 kernel32.dll、ntdll.dll 和 ntoskrnl.exe 的作用
- ✅ 理解 syscall 是如何工作的
- ✅ 知道 Windows API 和 Native API 的区别
- ✅ 了解为什么恶意软件开发者要直接调用 Native API
关键概念:
- DLL (Dynamic-Link Library):动态链接库
- Syscall:系统调用,从用户模式切换到内核模式的指令
- NTAPI:Native API,原生 API
- WinAPI:Windows API,高层 API
实践建议:
- 使用 x64dbg 调试一个简单的程序
- 观察 CreateFile 如何调用 NtCreateFile
- 找到 syscall 指令
- 理解寄存器中的系统调用号
下一步: 学习 Windows 内存管理