c++ - 使用 Module32First 获取模块的 modBaseAddr 不返回任何内容
问题描述
我想获得一个进程模块的基地址,这样我就可以开始在它的内存中搜索某些值。我正在使用 Module32First 获取第一个模块,然后从 MODULEENTRY32 中打印出 baseaddr,但没有出现任何内容。
我的目标是我编写的另一个过程,它只是打印出一些东西。我能够成功地获得它的句柄以及快照句柄。两个进程都是 32 位的。我尝试打印出 MODULEENTRY32 的其他成员,例如 th32ProcessID 和 modBaseSize,所有这些都返回值。只有 modBaseAddr 为空。
我一直在查看文档,我的代码一定有问题。这是相关的片段:
std::cout << "Modules Base Address: " << modStruc.modBaseAddr << std::endl;
我希望打印出第一个模块的基地址,但实际输出为空(因为没有显示任何内容)。我对 Module32First 的理解是,它将第一个模块条目复制到我的 MODULEENTRY32 modStruc,然后我打印出它的 modBaseAddr 成员。
有类似问题的任何人的更新:我还没有找到解决我特定困境的方法,但我已经切换到使用 GetModuleInformation,它还提供了模块加载地址、入口点和大小。
解决方案
MODULEENTRY32::modBaseAddr
是一个BYTE*
实际上是unsigned char*
。
std::cout::operator<<
有一个重载unsigned char*
,它将尝试将其打印为字符串。
要打印实际地址,您需要将其转换为整数类型,例如:
std::cout << "Modules Base Address: " << reinterpret_cast<DWORD_PTR>(modStruc.modBaseAddr) << std::endl;
您可以在此处查看此操作的示例。
推荐阅读
- javascript - 将控制台写入未链接的 html
- python - DataFrame 在对 groupby 值应用函数后创建新列
- java - 在没有 Java Object 类的情况下提取值的最佳方法是什么
- regex - 在 Perl 的正则表达式中使用“eval”时如何保存匹配的部分?
- mysql - 在 docker-compose 中,Mysql 连接被拒绝
- java - Tomcat 如何知道选择哪个 jar 来运行 servlet?
- html - (Tailwind - DaisyUI) 有没有办法改变下拉项目的悬停和活动颜色?
- javascript - 使用节点缓存更新缓存数据
- spring - 如何连接Spring和Oracle db(oracle cloud)19c
- spring-boot - springboot服务的Junit5测试用例如何调用repository的真实方法