0

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

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

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

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

4

1 回答 1

0

您正在寻找的是DllCharacteristicsPE 标头字段中的标志(不要与该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 (虽然很简短)。

于 2015-10-05T14:33:24.853 回答