c++ - 无法读取 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 截屏:
有人可以解释一下它是如何工作的吗?难道我做错了什么?也许一些参考。
解决方案
问题出在这一行:
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
地址:
推荐阅读
- javascript - 在旧版本的 iOS Safari 中使用 Object.prototype.hasOwnProperty 是否安全?
- javascript - 我的 React 状态不会停留在我的组件上
- angular - 为什么这些嵌套的 Observables 只被调用一次?
- spring - 线程“主”java.lang.NoSuchMethodError 中的异常:org.springframework.core.ResolvableType
- javascript - 如何在javascript中更改输入元素占位符的颜色?
- c++ - 何时需要转换运算符 c++?
- python - 比较变量到多个字符串python3
- php - 如何限制来自 PHP 应用程序的外部 API 调用
- swift - Swift:Mac OSX:如何使用我的应用程序在 firebase 服务器中进行身份验证以写入/读取
- reactjs - reactjs条件渲染在第二次点击后工作