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