首页 > 解决方案 > 使用 Module32First 获取模块的 modBaseAddr 不返回任何内容

问题描述

我想获得一个进程模块的基地址,这样我就可以开始在它的内存中搜索某些值。我正在使用 Module32First 获取第一个模块,然后从 MODULEENTRY32 中打印出 baseaddr,但没有出现任何内容。

我的目标是我编写的另一个过程,它只是打印出一些东西。我能够成功地获得它的句柄以及快照句柄。两个进程都是 32 位的。我尝试打印出 MODULEENTRY32 的其他成员,例如 th32ProcessID 和 modBaseSize,所有这些都返回值。只有 modBaseAddr 为空。

我一直在查看文档,我的代码一定有问题。这是相关的片段:

std::cout << "Modules Base Address: " << modStruc.modBaseAddr << std::endl;

我希望打印出第一个模块的基地址,但实际输出为空(因为没有显示任何内容)。我对 Module32First 的理解是,它将第一个模块条目复制到我的 MODULEENTRY32 modStruc,然后我打印出它的 modBaseAddr 成员。

有类似问题的任何人的更新:我还没有找到解决我特定困境的方法,但我已经切换到使用 GetModuleInformation,它还提供了模块加载地址、入口点和大小。

标签: c++winapi

解决方案


MODULEENTRY32::modBaseAddr是一个BYTE*实际上是unsigned char*

std::cout::operator<<有一个重载unsigned char*,它将尝试将其打印为字符串。

要打印实际地址,您需要将其转换为整数类型,例如:

std::cout << "Modules Base Address: " << reinterpret_cast<DWORD_PTR>(modStruc.modBaseAddr) << std::endl;

您可以在此处查看此操作的示例。


推荐阅读