抵消内存中加载的DLL与HDD之间的不匹配

时间:2014-11-16 13:11:18

标签: c++ dll

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

但是因为你似乎总是得到相同的偏移差异,所以我想到的另一件事是在加载过程中对齐部分。

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

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

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

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

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

但这只是假设,你必须检查自己是否完全确定。