0%
毅种循环

模块 5 - Windows 架构

恶意软件开发课程 - Windows 架构


模块 5 - Windows 架构#

[!IMPORTANT] 本知识库声明

本知识库由本人整理自互联网 MalDev Academy 泄露资源,并由本人手动翻译为中文,过程中增加了大量关键技术提示实践心得

  1. 内容完整性:并未修改任何核心代码与技术逻辑,仅做汉化与注释加强。
  2. 版权归属:原始知识产权归原作者/官方所有。
  3. 支持正版:本仓库仅供内部学习交流,如果您有经济能力,请务必支持正版课程
  4. 权利申诉:如相关内容侵犯了您的权益,请联系我,我将立即核实并删除。

Windows 架构#

简介#

本模块解释 Windows 架构以及 Windows 进程和应用程序底层发生的事情。

💡 初学者提示:为什么要学习 Windows 架构?

理解 Windows 架构是恶意软件开发的基础:

  • 知道程序如何与操作系统交互
  • 理解用户模式和内核模式的区别
  • 学会如何绕过安全机制
  • 掌握系统调用 (Syscall) 的原理

Windows 架构#

运行 Windows 操作系统的计算机内的处理器可以在两种不同的模式下运行:用户模式 (User Mode)内核模式 (Kernel Mode)。应用程序在用户模式下运行,而操作系统组件在内核模式下运行。当应用程序想要完成一项任务(例如创建文件)时,它无法独自完成。能够完成该任务的唯一实体是内核,因此应用程序必须遵循特定的函数调用流程。下图显示了此流程的高级视图。

图片
图片

  1. 用户进程 (User Processes) - 由用户执行的程序/应用程序,如记事本、Google Chrome 或 Microsoft Word。

  2. 子系统 DLL (Subsystem DLLs) - 包含用户进程调用的 API 函数的 DLL。例如 kernel32.dll 导出 CreateFile Windows API (WinAPI) 函数,其他常见的子系统 DLL 包括 ntdll.dlladvapi32.dlluser32.dll

  3. Ntdll.dll - 一个系统级 DLL,是用户模式中可用的最低层。这是一个特殊的 DLL,可以创建从用户模式到内核模式的转换。这通常被称为原生 API 或 NTAPI。

  4. 执行内核 (Executive Kernel) - 这就是所谓的 Windows 内核,它调用内核模式中可用的其他驱动程序和模块来完成任务。Windows 内核部分存储在 “C:\Windows\System32” 下的一个名为 ntoskrnl.exe 的文件中。

📚 知识扩展:用户模式 vs 内核模式

用户模式 (User Mode):

  • 权限受限
  • 无法直接访问硬件
  • 崩溃只会影响当前程序
  • 所有普通应用程序都在这里运行

内核模式 (Kernel Mode):

  • 完全权限
  • 可以直接访问硬件和内存
  • 崩溃会导致蓝屏 (BSOD)
  • 操作系统核心和驱动程序在这里运行

为什么需要分离?

  1. 安全性:防止恶意程序直接控制硬件
  2. 稳定性:应用程序崩溃不会影响整个系统
  3. 隔离:每个应用程序有自己的内存空间

类比理解:

  • 用户模式 = 普通员工:只能使用办公室提供的工具
  • 内核模式 = 系统管理员:可以访问机房,配置服务器

函数调用流程#

下图显示了创建文件的应用程序示例。它从用户应用程序调用 kernel32.dll 中可用的 CreateFile WinAPI 函数开始。Kernel32.dll 是一个关键的 DLL,向应用程序公开 WinAPI,因此可以看到大多数应用程序都加载了它。接下来,CreateFile 调用其等效的 NTAPI 函数 NtCreateFile,该函数通过 ntdll.dll 提供。然后 Ntdll.dll 执行汇编 sysenter (x86) 或 syscall (x64) 指令,将执行转移到内核模式。然后使用内核 NtCreateFile 函数,该函数调用内核驱动程序和模块来执行请求的任务。

图片
图片

💡 初学者提示:理解函数调用层次

从上到下的调用链:

你的程序 (User Mode - 用户模式)

CreateFile() 在 kernel32.dll (高层 API)

NtCreateFile() 在 ntdll.dll (Native API)

syscall 指令 (切换到内核模式)

NtCreateFile() 在 ntoskrnl.exe (Kernel Mode - 内核模式)

文件系统驱动程序

硬盘驱动器
plaintext

每一层的作用:

  1. kernel32.dll:提供友好、易用的接口
  2. ntdll.dll:提供更底层的接口,准备系统调用
  3. syscall:切换 CPU 从用户模式到内核模式
  4. 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): 每个内核函数都有一个唯一的编号,例如:

mov r10, rcx
mov eax, 55h    ; NtCreateFile 的系统调用号 (Windows 10)
syscall         ; 执行系统调用
ret
plaintext

为什么这对恶意软件开发重要?

  1. 绕过 Hooking:许多 EDR/AV 会 hook ntdll.dll 中的函数
  2. 直接系统调用:跳过 ntdll,直接执行 syscall
  3. 隐蔽性:减少 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)
文档完善的官方文档未正式文档化
稳定性版本间保持兼容可能随时改变
易用性友好、易学复杂、难用
性能略慢(多一层包装)更快(直接调用)
检测容易被监控较难被监控
示例CreateFileNtCreateFile

什么时候使用 Native API?

  • ✅ 绕过 API Hook
  • ✅ 需要更精细的控制
  • ✅ 某些功能只有 Native API 提供
  • ✅ 规避 EDR/AV 监控

什么时候使用 Windows API?

  • ✅ 正常的应用程序开发
  • ✅ 需要兼容性和稳定性
  • ✅ 初学阶段

实际例子:


🎯 本模块学习要点

  1. ✅ 理解用户模式和内核模式的区别
  2. ✅ 掌握 Windows API 调用链条
  3. ✅ 了解 kernel32.dll、ntdll.dll 和 ntoskrnl.exe 的作用
  4. ✅ 理解 syscall 是如何工作的
  5. ✅ 知道 Windows API 和 Native API 的区别
  6. ✅ 了解为什么恶意软件开发者要直接调用 Native API

关键概念:

  • DLL (Dynamic-Link Library):动态链接库
  • Syscall:系统调用,从用户模式切换到内核模式的指令
  • NTAPI:Native API,原生 API
  • WinAPI:Windows API,高层 API

实践建议:

  1. 使用 x64dbg 调试一个简单的程序
  2. 观察 CreateFile 如何调用 NtCreateFile
  3. 找到 syscall 指令
  4. 理解寄存器中的系统调用号

下一步: 学习 Windows 内存管理