【问题标题】:How to manually set a base address of dll in Executable file如何在可执行文件中手动设置dll的基地址
【发布时间】:2015-07-29 10:03:36
【问题描述】:

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

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

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

希望手动设置kernel32.dll的基址,让它在Win7下也能正常运行。我该怎么做?

【问题讨论】:

  • 我想用十六进制编辑器更改 EXE 的 PE 头。

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


【解决方案1】:

您要查找的是 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(虽然很简短)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多