我有exe
个文件。这在Windows XP中运行良好,但在Windows 7 x86中运行不佳。我用IDA pro分析了这个。
在XP中,这会访问一个地址(0x7C80003C
),此处位于kernel32.dll
(0x7C800000~0x7C801000
)的第一部分。
但是在Windows 7中,它会访问相同的地址,但在那里,它是一个未分配的范围。
我希望手动设置kernel32.dll
的基地址,并让它在Win7中运行良好。我怎么能这样做?
答案 0 :(得分:0)
您正在寻找的是PE标头的 DllCharacteristics
字段中的标记(不要与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/ms680339%28v=vs.85%29.aspx(虽然它非常简短)。