PEB(进程环境块)无效的 DllBase 地址

PEB (Process Environment Block) invalid DllBase address

我正在尝试获取我自己的 PEB 并获取我自己的模块地址。我写了这样一个简单的代码:

PLIST_ENTRY myModule = (PLIST_ENTRY)pebLdr->InMemoryOrderModuleList.Flink;

PLDR_DATA_TABLE_ENTRY myImageBase = (PLDR_DATA_TABLE_ENTRY)myModule;

PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)myImageBase->DllBase;

但我在 dosHeader 中没有看到合适的 PE header。这是我在 dosHeader 变量的 MSVC 调试器中看到的: e_magic=???,e_cblp=??? 。为什么我不能得到我自己的 header?我检查了所有内容,我按照记录做了所有事情,我可以在 pData->FullDllName 中看到我的 exe 名称,一切似乎都是正确的,并且 DllBase 有意义它不为空或类似 ffffff.有什么具体的事情需要做吗,也许是地址计算?

你做不到

PLDR_DATA_TABLE_ENTRY myImageBase = (PLDR_DATA_TABLE_ENTRY)myModule;

因为 InMemoryOrderLinks 不是 LDR_DATA_TABLE_ENTRY 中的第一个字段。相反,您应该涉及 CONTAINING_RECORD() 宏:

PLIST_ENTRY le = (PLIST_ENTRY)pebLdr->InMemoryOrderModuleList.Flink;
PLDR_DATA_TABLE_ENTRY mainModule = CONTAINING_RECORD(le, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)mainModule->DllBase;

最重要的是:您可以自由地遍历 LIST_ENTRY 的双向链接循环列表,并获得您应该使用 CONTAINING_RECORD() 的实际节点数据。请注意,位于 PEB_LDR_DATA 中的节点是专用的,没有关联数据。您应该仅将它用作您已遍历整个列表的标志。