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
中的节点是专用的,没有关联数据。您应该仅将它用作您已遍历整个列表的标志。
我正在尝试获取我自己的 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
中的节点是专用的,没有关联数据。您应该仅将它用作您已遍历整个列表的标志。