我可以手动插入PE文件的ImageBase值吗?
基本上.. DLL的ImageBase = 10000000 EXE的图片库= 00400000
如果可以,我想将ImageBase更改为随机地址。 我不知道该怎么办。
答案 0 :(得分:1)
您可以轻松更改基址,并防止Windows将可执行模块重新定位为随机基址。我要强调的是,如果您有权访问构建环境,则应首选指定基地址,并避免在构建时从模块开始放置DYNAMICBASE标志,从而允许链接程序进行适当的优化。要使用MSVC做到这一点,您需要指定链接器标志:
/BASE:400000
/DYNAMICBASE:NO
可以完成更改基础图像的操作,并且可以在简单的模块上使用,但是在某些情况下,取决于代码的生成方式,可能会导致崩溃。有时,当人们无法访问原始源代码时,别无选择。
代码和数据访问可以基于与之链接的原始ImageBase对值进行硬编码。如果要在构建模块后对其进行修改,请继续阅读。
虽然Windows Vista中引入了地址空间布局随机化(ASLR)行为,但此处建议的修改将适用于任何版本的Windows。
注意:前面的语句假设Microsoft在将来不考虑头文件中的相关PE标志或不完全加载这些模块的情况下,就不开始对图像基址进行随机化。从Windows 10的当前版本开始,Windows当前认可不包含IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE标志的图像,以防止动态重定位。
使用十六进制编辑器,MSVC的editbin之类的工具,甚至您自己的代码,都应对所需模块的PE标头进行以下修改,以设置固定的基本加载地址:
-set desired IMAGE_OPTIONAL_HEADER -> ImageBase (e.g. 0x400000)
i.e. editbin.exe /rebase:base=0x400000 <YOUR_MODULE>
-remove the the 0x0040 (DYNAMIC_BASE) bit from the IMAGE_OPTIONAL_HEADER -> DllCharacteristics flags or use editbin:
i.e.: editbin /dynamicbase:no <YOUR_MODULE>
-if not using editbin, you will need to recalculate the header checksum or just leave at zero for any non-driver or start-up Windows service; editbin updates the checksum automatically.
注意: -手动更改模块的基地址可能要求您遍历.reloc节条目并以静态方式或在运行时为新的基地址执行手动修复(模拟Windows加载程序的作用);不这样做可能会导致崩溃。为了避免这种麻烦,只需删除DYNAMIC_BASE标志,并使基址与构建模块时的基址相同。这样,即使原始基址没有更改,您仍然可以防止ASLR。
-editbin版本必须来自MSVC 2005 SP1(8.0.50727.161),才能支持/ dynamicbase参数; MSVC C ++工具集的任何免费现代版本的editbin都将具有此功能;我的经验是,即使对于没有.reloc节的模块,/ rebase选项也可能报告神秘的“ LNK1175:无法重新建立基础;错误487”-这最终迫使您使用PE编辑器更改ImgBase。
-自从我们对原始文件进行修改以来,上述更改可能会破坏嵌入式数字签名检查或任何可验证原始文件完整性的内容。
答案 1 :(得分:0)
据我所知,Windows PE加载程序决定基本加载地址(您的问题中的ImageBase),除非您自己编写PE加载程序,否则无法手动选择它。
从Windows Vista开始,Windows使用地址随机化器来选择随机基本加载地址。因此,它不再像0x10000000或0x00400000一样,并且每次运行时都会改变,除非该进程在调试模式等特殊情况下启动。