c++ - 内存中加载的 DLL 与 HDD 中加载的 DLL 之间的偏移量不匹配

标签 c++ dll

基本上我想做的是更改 DLL(运行时)中的某些字符串,为此,我使用“hxd”打开了 DLL 并找到了我稍后要更改的字符串,复制了从每个字符串的 DLL 开头偏移并保存它。

在运行时,我使用了 LoadLibrary() 并使用 GetModuleInformation() 检索了模块的详细信息。这是在内存中找到DLL的绝对起点。我使用 GetModuleInformation() 检索的“lpBaseOfDll”和我之前找到的偏移量计算了字符串的真实地址。由于我无法成功完成这项任务,我决定在运行时检查这些地址,并意识到与我期望看到的有 6000~ 字节的偏移量,我已经读到在 DLL 加载期间,windows 分配了额外的 4Kb 用于分页等等,但我不确定是否是这种情况。

感谢您的帮助!

最佳答案

如果您的应用程序启用了它,则可能是 ASLR,但我不确定它是否也会影响您的字符串或仅影响堆栈、堆、TIB 等。

但是由于您似乎总是得到相同的偏移差,所以我立即想到的另一件事是加载期间各部分的对齐。

当您的程序/库被加载并复制到内存中时,所有部分都将对齐到某个边界 - 如果您愿意,它们会“扩展”。因此,内存中复制的文件实际上变得比您存储在硬盘上的文件大。参见本文的图 1:

http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

由于这不仅仅是整个程序/库的整体文件对齐,而是每个部分的对齐校正,因此您将在每个部分获得不同的偏移量。您的字符串存储在一个部分中,并且由于前面的部分按照描述进行了扩展,因此您得到了 6000~ 的差异。

PE 格式知道每个部分的原始地址 (RA) 和虚拟地址(VA [或 RVA for relative-virtual-address])。 RA 是您文件中的偏移量(您的手动计算工作正常),但 VA 是在运行时很重要的偏移量。正如旁注:部分对齐本身存储在图像的“可选标题”中(参见 http://msdn.microsoft.com/en-us/library/windows/desktop/ms680339%28v=vs.85%29.aspx )。

所以我建议你找出你的字符串存储在哪个部分,然后自己计算部分偏移量(运行时的 VA),或者解析 PE 头并直接查找所述部分的 VA。然后,您可以从那里计算字符串在内存中的绝对偏移量(section base VA + string offset relative to section base VA)。

但这只是假设,您必须亲自检查才能完全确定。

关于c++ - 内存中加载的 DLL 与 HDD 中加载的 DLL 之间的偏移量不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26957285/

相关文章:

C++11:map::lower_bound 在 Linux 中对于 2 个或更少的元素不能正常工作

c++ - 我将如何使用带有 QVector 的模板?

c# - 原生 64 位 dll 的 32 位 Dll 包装器

c# - HIDAPI - 在 c# 项目中使用

javascript - IntelliJ 中的自定义关键字建议

c++ - 链接旧服务器 c++ 时出错

dll - 是否可以在一个项目中混合使用静态、多线程、DLL 库?

opengl - FreeGLUT编译dll+lib?

c++ - 未找到包含 <QtCore/qglobal.h>

c++ - 显示正面和反面被抛出的时间 C++