news 2026/5/1 18:35:25

Windows逆向实战:手把手教你用PEB_LDR_DATA结构体手动遍历进程模块(附完整C++代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows逆向实战:手把手教你用PEB_LDR_DATA结构体手动遍历进程模块(附完整C++代码)

Windows逆向工程实战:PEB_LDR_DATA结构体深度解析与模块遍历技术

逆向工程师和安全研究员经常需要在不触发常规API调用的情况下枚举进程加载的模块。本文将深入探讨如何通过直接解析Windows内核数据结构PEB_LDR_DATA来实现这一目标,并提供完整的C++实现方案。

1. Windows进程内存结构基础

在深入PEB_LDR_DATA之前,我们需要理解几个关键概念:

  • PEB(Process Environment Block):每个Windows进程都有一个PEB结构,包含进程运行时的各种环境信息
  • TEB(Thread Environment Block):每个线程对应的数据结构,包含线程特定信息
  • LDR_DATA_TABLE_ENTRY:描述已加载模块信息的结构体

在32位系统中,FS寄存器指向TEB结构,而PEB指针位于TEB偏移0x30处。64位系统则使用GS寄存器,PEB指针位于偏移0x60处。

// 获取PEB指针的示例代码 #ifdef _WIN64 PPEB peb = (PPEB)__readgsqword(0x60); #else PPEB peb = (PPEB)__readfsdword(0x30); #endif

2. PEB_LDR_DATA结构详解

PEB_LDR_DATA是PEB中负责管理已加载模块的核心数据结构。它包含三个重要的双向链表:

  1. InLoadOrderModuleList:按加载顺序排列的模块链表
  2. InMemoryOrderModuleList:按内存中排列顺序的模块链表
  3. InInitializationOrderModuleList:按初始化顺序排列的模块链表
typedef struct _PEB_LDR_DATA { ULONG Length; BOOLEAN Initialized; PVOID SsHandle; LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA;

每个链表节点实际上是LDR_DATA_TABLE_ENTRY结构的一部分,通过LIST_ENTRY结构连接起来。

3. 链表遍历的核心技术

遍历这些链表的关键在于理解Windows如何通过LIST_ENTRY结构连接各个模块信息。每个LDR_DATA_TABLE_ENTRY包含三个LIST_ENTRY成员,分别对应三种排序方式。

typedef struct _LDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; LIST_ENTRY InInitializationOrderLinks; PVOID DllBase; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; // ... 其他成员省略 } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

要获取完整的LDR_DATA_TABLE_ENTRY结构,我们需要使用CONTAINING_RECORD宏:

#define CONTAINING_RECORD(address, type, field) \ ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))

这个宏可以根据结构体成员的地址计算出整个结构体的起始地址。

4. 完整实现代码

以下是手动遍历进程模块的完整C++实现:

#include <windows.h> #include <winternl.h> #include <iostream> // 自定义PEB和PEB_LDR_DATA结构定义 typedef struct _MY_PEB_LDR_DATA { ULONG Length; BOOLEAN Initialized; PVOID SsHandle; LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; } MY_PEB_LDR_DATA, *PMY_PEB_LDR_DATA; typedef struct _MY_PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[1]; PVOID Reserved3[2]; PMY_PEB_LDR_DATA Ldr; // ... 其他成员省略 } MY_PEB, *PMY_PEB; void EnumerateModules() { PMY_PEB peb = nullptr; PMY_PEB_LDR_DATA ldrData = nullptr; PLIST_ENTRY listHead = nullptr; PLIST_ENTRY listEntry = nullptr; // 获取PEB指针 #ifdef _WIN64 peb = (PMY_PEB)__readgsqword(0x60); #else peb = (PMY_PEB)__readfsdword(0x30); #endif ldrData = peb->Ldr; listHead = &ldrData->InMemoryOrderModuleList; listEntry = listHead->Flink; while (listEntry != listHead) { // 获取LDR_DATA_TABLE_ENTRY结构 PLDR_DATA_TABLE_ENTRY moduleEntry = CONTAINING_RECORD( listEntry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks ); // 输出模块信息 wprintf(L"模块名称: %s\n", moduleEntry->BaseDllName.Buffer); wprintf(L"完整路径: %s\n", moduleEntry->FullDllName.Buffer); printf("基址: 0x%p\n", moduleEntry->DllBase); printf("大小: 0x%X\n\n", moduleEntry->SizeOfImage); // 移动到下一个节点 listEntry = listEntry->Flink; } } int main() { EnumerateModules(); return 0; }

5. 实际应用中的注意事项

在实际逆向工程和安全研究中,手动遍历模块有几个关键优势:

  1. 规避API Hook:不调用EnumProcessModules等API,避免被安全软件检测
  2. 获取更底层信息:直接访问内核数据结构,获取更详细的信息
  3. 跨版本兼容性:虽然结构体可能变化,但基本思路保持稳定

需要注意的几个问题:

  • 32/64位差异:结构体偏移和指针大小不同
  • Windows版本差异:不同Windows版本结构体可能有变化
  • 链表完整性:确保正确遍历整个环形链表

6. 高级技巧:处理不同Windows版本

由于PEB结构在不同Windows版本中可能有变化,我们可以采用更健壮的遍历方法:

// 动态获取结构体偏移的方法 ULONG GetLdrDataOffset() { // 这里可以根据Windows版本返回不同的偏移量 // 实际实现可能需要通过特征码搜索等方式 return 0x0c; // Windows 10 x86的PEB.Ldr偏移 } // 更健壮的模块遍历函数 void RobustEnumerateModules() { ULONG ldrOffset = GetLdrDataOffset(); PBYTE peb = nullptr; #ifdef _WIN64 peb = (PBYTE)__readgsqword(0x60); #else peb = (PBYTE)__readfsdword(0x30); #endif PMY_PEB_LDR_DATA ldr = *(PMY_PEB_LDR_DATA*)(peb + ldrOffset); // ... 其余遍历逻辑相同 }

7. 性能优化与错误处理

在实际应用中,我们还需要考虑:

  1. 异常处理:访问无效内存时的保护
  2. 性能优化:减少不必要的操作
  3. 结果缓存:避免重复遍历
// 带错误处理的模块遍历 bool SafeEnumerateModules() { __try { PMY_PEB peb = nullptr; #ifdef _WIN64 peb = (PMY_PEB)__readgsqword(0x60); #else peb = (PMY_PEB)__readfsdword(0x30); #endif if (!peb || !peb->Ldr) return false; PLIST_ENTRY head = &peb->Ldr->InMemoryOrderModuleList; PLIST_ENTRY entry = head->Flink; while (entry != head) { PLDR_DATA_TABLE_ENTRY module = CONTAINING_RECORD( entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks ); if (!module->DllBase || !module->BaseDllName.Buffer) { entry = entry->Flink; continue; } // 处理模块信息... entry = entry->Flink; } return true; } __except(EXCEPTION_EXECUTE_HANDLER) { return false; } }

通过PEB_LDR_DATA手动遍历进程模块是Windows逆向工程中的一项基础但强大的技术。它不仅帮助我们理解Windows内部机制,还能在安全研究中避开常规API监控。掌握这项技术需要深入理解Windows内存结构和链表操作,但一旦掌握,将大大提升逆向分析的能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 18:26:25

3种高效方法获取智慧教育平台电子教材:离线学习资源一键下载指南

3种高效方法获取智慧教育平台电子教材&#xff1a;离线学习资源一键下载指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。 …

作者头像 李华
网站建设 2026/5/1 18:23:33

为初创项目设计基于 Taotoken 统一 API 的多模型降本增效方案

为初创项目设计基于 Taotoken 统一 API 的多模型降本增效方案 1. 初创团队的 AI 需求与挑战 初创团队在原型开发阶段往往面临资源有限但需求多样的矛盾。产品可能需要同时处理对话交互、文本生成、代码补全等多种 AI 任务&#xff0c;而不同任务对模型能力的要求存在显著差异…

作者头像 李华
网站建设 2026/5/1 18:20:17

别再死记命令了!用Wireshark抓包带你理解DHCP交互全过程(eNSP环境)

用Wireshark透视DHCP&#xff1a;从报文交互看华为eNSP中的地址分配艺术 当我们在eNSP中键入dhcp enable命令时&#xff0c;背后究竟发生了什么&#xff1f;这个看似简单的地址分配过程&#xff0c;实际上隐藏着一场精妙的网络协议芭蕾。本文将带您用Wireshark的"显微镜&q…

作者头像 李华
网站建设 2026/5/1 18:18:35

如何高效加速网盘下载:免费工具完整指南

如何高效加速网盘下载&#xff1a;免费工具完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云…

作者头像 李华
网站建设 2026/5/1 18:17:23

PPTAgent终极指南:如何用AI在5分钟内制作专业演示文稿

PPTAgent终极指南&#xff1a;如何用AI在5分钟内制作专业演示文稿 【免费下载链接】PPTAgent An Agentic Framework for Reflective PowerPoint Generation 项目地址: https://gitcode.com/gh_mirrors/pp/PPTAgent PPTAgent是一款革命性的AI演示文稿生成框架&#xff0c…

作者头像 李华
网站建设 2026/5/1 18:16:23

一锅一码一匠心,从泥到火可追溯,京尚以数字化升级厨房品质

近日&#xff0c;京尚智慧厨房凭借“一锅一码一匠心”创新溯源模式引发行业关注。通过数字化技术打通生产全流程&#xff0c;实现从原料到成品的全程可追溯&#xff0c;京尚以公开透明的生产管理&#xff0c;重构消费者信任&#xff0c;引领陶瓷炊具行业迈入品质新时代。民以食…

作者头像 李华