我有一个exe
文件。这在Windows XP中运行良好,但在Windows 7 x86中不运行。我用Ida Pro。
在XP中,这访问一个地址(0x7C80003C
),在这里,它在kernel32.dll
(0x7C800000~0x7C801000
)的第一部分中。
但是在Windows 7中,这访问了相同的地址,但是在那里,它是一个未分配的范围。
我希望手动设置kernel32.dll
的基本地址,并在Win7中运行良好。我该怎么做?
您要寻找的是 DllCharacteristics
PE标头的flag(不要与Characteristics
字段混淆)。
Microsoft调用此标志IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
,并将其定义为0x40
。您可以猜到,它说明图像是否应加载在其首选的基础地址以外的地址(设置在PE标头的" ImageBase"字段中)。
如果您在DllCharacteristics
中掩盖了该标志,请仔细检查ImageBase
是正确的,并且应该将DLL加载到需要的位置。如果不起作用,您也可能需要将IMAGE_FILE_RELOCS_STRIPPED
(0x1
)标志添加到Characteristics
字段。
并发症可能会出现。我从未使用任何系统DLL测试过此技术,因此,如果最近的Windows版本不愿加载修补的图像,请不要感到惊讶。对于初学者,您可能需要纠正标题中的CheckSum
字段以反射补丁,并且您还需要剥离任何无效的数字签名。我不知道当今模块加载器的挑剔是多么挑剔,但这是我期望的那种问题。
可以在此处找到PE标头的官方文档:https://msdn.microsoft.com/en-us/library/windows/desktop/mss680339(v=vs.85).aspx)。