gpt4 book ai didi

c - PEB(进程环境 block )无效的 DllBase 地址

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:04 24 4
gpt4 key购买 nike

我试图获得我自己的 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 。这是我在 MSVC 调试器的 dosHeader 变量中看到的:e_magic=???,e_cblp=???。为什么我不能得到自己的标题?我检查了所有内容,我正在按照文档进行所有操作,并且我可以在 pData->FullDllName 中看到我的 exe 名称,一切似乎都是正确的,并且 DllBase 有意义不为 null 或类似 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 中的节点是专用的,没有关联数据。您应该仅将它用作您已遍历整个列表的标志。

关于c - PEB(进程环境 block )无效的 DllBase 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38319593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com