0%
毅种循环

模块 12 - 未文档化的结构

恶意软件开发课程 - 未文档化的结构


模块 12 - 未文档化的结构#

[!IMPORTANT] 本知识库声明

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

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

未文档化的结构#

简介#

在查看 Windows 文档中的结构时,可能会遇到结构中的几个保留 (reserved) 成员。这些保留成员通常表示为 BYTEPVOID 数据类型的数组。Microsoft 实施此做法是为了保持机密性并防止用户了解结构以避免对这些保留成员进行修改。

话虽如此,在整个课程中,将需要使用这些未文档化的成员。因此,某些模块将避免使用 Microsoft 的文档,而是使用具有完整未文档化结构的其他网站,这些结构可能是通过逆向工程获得的。

💡 初学者提示:为什么Microsoft隐藏结构成员?

Reserved(保留)成员的真相:

// Microsoft 官方文档中的PEB
typedef struct _PEB {
  BYTE  Reserved1[2];        // 隐藏了什么?
  BYTE  BeingDebugged;
  BYTE  Reserved2[1];        // 又隐藏了什么?
  PVOID Reserved3[2];
  PPEB_LDR_DATA Ldr;
  ...
} PEB;
c

为什么要隐藏?

  1. 向后兼容性:微软可以自由更改这些成员
  2. 防止滥用:避免恶意软件利用
  3. 内部实现细节:不想公开的API
  4. 维护灵活性:不同Windows版本可能不同

类比理解:

手机 (Windows)
├── 公开功能:打电话、发短信 (文档化)
├── 隐藏功能:调试模式、工程菜单 (未文档化)
└── 为什么隐藏?避免普通用户误操作
plaintext

但对于我们(恶意软件开发/安全研究):

  • 需要访问这些隐藏成员
  • 用于实现高级技术
  • 例如:API Hashing、反调试、进程隐藏等

PEB 结构示例#

如前模块所述,进程环境块或 PEB 是一个包含有关 Windows 进程信息的数据结构。但是,Microsoft 的文档 中的 PEB 结构显示了几个保留成员。这使得访问结构的成员变得困难。

查找保留成员#

确定 PEB 的保留成员包含什么的一种方法是通过 WinDbg 中的 !peb 命令。

图片
图片

有关更完整的 PEB 结构,请参阅 Process Hacker 的 PEB structure

📚 知识扩展:如何找到未文档化的结构

方法1:使用WinDbg调试器

方法2:逆向工程

1. 在IDA Pro/Ghidra中打开 ntdll.dll
2. 查找使用PEB的函数
3. 分析偏移量和访问模式
4. 推断结构成员
plaintext

方法3:查阅第三方文档(推荐)

见下一节"替代文档"
plaintext

Reserved成员到底是什么?

// Microsoft 的 PEB
BYTE Reserved1[2];

// 实际上是(ntdll.dll 10.0.19041)
BYTE InheritedAddressSpace;    // +0x000
BYTE ReadImageFileExecOptions; // +0x001

// Microsoft 的 PEB
PVOID Reserved3[2];

// 实际上是
PVOID Mutant;                  // +0x004
PVOID ImageBaseAddress;        // +0x008
c

替代文档#

如前所述,某些模块将避免使用 Microsoft 的文档,而是使用其他文档源。

📚 知识扩展:推荐的文档资源详解

1. Process Hacker (phnt)

URL: https://github.com/winsiderss/systeminformer/tree/master/phnt/include

优点:
✅ 最完整、最新
✅ 主动维护
✅ 支持最新Windows版本
✅ 包含所有架构(x86, x64, ARM64)
✅ 社区验证

文件:
- ntpebteb.h  → PEB, TEB结构
- ntldr.h     → 模块加载器结构
- ntpsapi.h   → 进程/线程API
- ntexapi.h   → 执行API
plaintext

2. Vergilius Project

URL: https://www.vergiliusproject.com/

优点:
✅ 在线查询,无需下载
✅ 支持多个Windows版本对比
✅ 可视化偏移量
✅ 适合快速查询

使用示例:
搜索 "_PEB"
→ 选择Windows版本(10.0.19041 x64)
→ 查看完整结构定义
plaintext

3. ReactOS Documentation

URL: https://doxygen.reactos.org/

优点:
✅ 开源实现的Windows克隆
✅ 详细的注释
✅ 函数实现可参考

注意:
⚠️ 可能与真实Windows有细微差别
⚠️ 主要用于理解概念
plaintext

4. undocumented.ntinternals.net(历史资料)

注意:
⚠️ 网站已关闭(需要通过Wayback Machine访问)
⚠️ 信息可能过时(针对旧版本Windows)
⚠️ 仅作历史参考
plaintext

实用示例:对比不同来源

Microsoft官方(Winternl.h):

typedef struct _PEB {
  BYTE  Reserved1[2];
  BYTE  BeingDebugged;
  // ... 很多Reserved
} PEB;
c

Process Hacker(ntpebteb.h):

差距明显!

注意事项#

选择结构定义时,重要的是要注意以下几点。

  • 某些结构定义仅适用于特定架构,即 x86 或 x64。如果是这种情况,请确保选择适当的结构定义。
  • 在某些情况下,由于嵌套结构的概念,可能需要定义多个结构。例如,PEB 之类的结构可能包含一个充当指向另一个结构的指针的成员。因此,重要的是包括后一个结构的定义,以确保程序正确解释它。
  • 使用结构的自定义定义时,不可能同时包含其在 Windows SDK 中找到的原始定义。例如,Microsoft 的 PEB 结构定义位于 Winternl.h 中。如果打算使用上述文档源之一的不同定义,那么尝试在程序中包含 Winternl.h 将导致 Visual Studio 的编译器抛出重定义错误。为避免这种情况,请仅选择一个结构定义。

💡 初学者提示:使用未文档化结构的实践指南

常见问题1:架构不匹配

// ❌ 错误:在64位程序中使用32位结构
#ifdef _WIN64
    typedef struct _PEB {
        // ... 使用32位偏移量
    } PEB;
#endif

// ✅ 正确:根据架构选择
#ifdef _WIN64
    #include "peb64.h"   // 64位PEB定义
#else
    #include "peb32.h"   // 32位PEB定义
#endif
c

常见问题2:嵌套结构

常见问题3:重定义错误

推荐的项目结构:

MyMalware/
├── include/
│   ├── ntdefs.h        (基本NT定义)
│   ├── ntpebteb.h      (PEB/TEB完整定义)
│   ├── ntldr.h         (加载器结构)
│   └── ntstatus.h      (NTSTATUS值)
├── src/
│   └── main.c
└── README.md

// main.c
#define _WINTERNL_          // 阻止Windows SDK定义
#include <Windows.h>
#include "include/ntpebteb.h"  // 使用自定义定义
plaintext

实用模板:

// ntdefs.h - 基础定义
#pragma once
#define _WINTERNL_

#include <Windows.h>

// 防止重定义
#ifndef NT_SUCCESS
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
#endif

// ... 其他未文档化定义
c

版本兼容性检查:


🎯 本模块学习要点

关键概念:

  1. ✅ Microsoft 文档中的 Reserved 成员是未文档化的
  2. ✅ 需要使用第三方资源获取完整结构
  3. ✅ 注意架构差异(x86 vs x64)
  4. ✅ 处理嵌套结构定义
  5. ✅ 避免重定义错误

推荐资源(按优先级):

  1. ⭐⭐⭐⭐⭐ Process Hacker (phnt) - 最完整、最新
  2. ⭐⭐⭐⭐ Vergilius Project - 在线查询方便
  3. ⭐⭐⭐ ReactOS - 理解概念和实现
  4. ⭐⭐ undocumented.ntinternals.net - 历史参考

实践建议:

1. 创建统一的头文件目录
2. 从Process Hacker复制需要的结构
3. 添加 #pragma once 防止重复包含
4. 使用 #define _WINTERNL_ 防止冲突
5. 测试不同Windows版本的兼容性
plaintext

常用的未文档化结构:

  • _PEB - 进程环境块
  • _TEB - 线程环境块
  • _LDR_DATA_TABLE_ENTRY - 模块信息
  • _EPROCESS - 内核进程结构
  • _ETHREAD - 内核线程结构

下一步: 学习Payload在不同PE节中的存储