如何在可执行文件中手动设置dll的基址

时间:2015-05-18 01:59:23

标签: dll windows-7 windows-xp ida base-address

我有exe个文件。这在Windows XP中运行良好,但在Windows 7 x86中运行不佳。我用IDA pro分析了这个。

在XP中,这会访问一个地址(0x7C80003C),此处位于kernel32.dll0x7C800000~0x7C801000)的第一部分。

但是在Windows 7中,它会访问相同的地址,但在那里,它是一个未分配的范围。

我希望手动设置kernel32.dll的基地址,并让它在Win7中运行良好。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您正在寻找的是PE标头的 DllCharacteristics 字段中的标记(不要与Characteristics字段混淆)。

Microsoft将此标记称为IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,并将其定义为0x40。正如您所猜测的,它指出图像是否应该加载到其首选基址以外的地址(在PE头的' ImageBase'字段中设置)。

如果您在DllCharacteristics中屏蔽了该标志,请仔细检查ImageBase是否正确,并且您应该将DLL正确加载到您需要的位置。如果这不起作用,您可能还需要将IMAGE_FILE_RELOCS_STRIPPED0x1)标记添加到Characteristics字段。

可能会出现并发症。我从未使用任何系统DLL测试过这种技术,因此如果最近的Windows版本不愿意加载修补后的图像,请不要感到惊讶。对于初学者,您可能需要更正标题中的CheckSum字段以反映修补程序,您可能还需要删除任何无效的数字签名。我现在还不知道模块加载器到底有多挑剔,但这些都是我预期的问题。

PE标题的官方文档可以在这里找到:https://msdn.microsoft.com/en-us/library/windows/desktop/ms680339%28v=vs.85%29.aspx(虽然它非常简短)。