首页 > 解决方案 > 无法读取 kernel32.dll 基地址上的内存

问题描述

我正在做一些研究,目前我需要获取 KERNEL32.dll 的基地址。

我已经做了什么:

// get PEB structure
PPEB peb = (PPEB)__readfsdword(0x30);

// get ldr linked list and go to kernel32 module
PLDR_DATA_TABLE_ENTRY ldrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)peb->Ldr->InMemoryOrderModuleList.Flink->Flink->Flink;

// get DllBase address from LDR_DATA_TABLE_ENTRY
HMODULE kernel32 = (HMODULE)ldrDataTableEntry->DllBase;

不幸的是,我无法读取该地址上的内存。这是我在调试时从 VS 截屏: 在此处输入图像描述

有人可以解释一下它是如何工作的吗?难道我做错了什么?也许一些参考。

标签: c++winapi

解决方案


问题出在这一行:

PLDR_DATA_TABLE_ENTRY ldrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)peb->Ldr->InMemoryOrderModuleList.Flink->Flink->Flink;

InMemoryOrderModuleList不是结构的第一个成员,LDR_DATA_TABLE_ENTRY所以需要使用CONTAINING_RECORD宏来获取正确的ldrDataTableEntry值。

PLDR_DATA_TABLE_ENTRY ldrDataTableEntry = CONTAINING_RECORD(peb->Ldr->InMemoryOrderModuleList.Flink->Flink->Flink, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);

现在您可以访问该DllBase地址:

在此处输入图像描述


推荐阅读