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



我有一个exe文件。这在Windows XP中运行良好,但在Windows 7 x86中不运行。我用Ida Pro。

分析了这一点

在XP中,这访问一个地址(0x7C80003C),在这里,它在kernel32.dll0x7C800000~0x7C801000)的第一部分中。

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

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

您要寻找的是 DllCharacteristics PE标头的flag(不要与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/mss680339(v=vs.85).aspx)。

最新更新