如何确定EXE(或DLL)是否参与ASLR,即是否可重定位?
我想在我的系统上检查一些EXE是否可以重新定位并参与ASLR。
我知道链接器的默认行为是剥离基址重定位,以便EXE不可重定位?
如何从FileAlyzer这样的工具中看到图像是否参与ASLR?
答案 0 :(得分:6)
可重定位模块(exe或dll)不一定需要启用ASLR,但启用了ASLR的模块需要可重定位。
启用ASLR的模块(使用/ DYNAMICBASE链接器开关)将以随机地址加载,无论其ImageBase(首选加载地址)如何,因此它必须是可重定位的或无法加载。
如果模块未启用ASLR,则加载程序将首先尝试将其加载到ImageBase。如果这不可能(内存已经分配),它将尝试将其加载到另一个地址;如果模块是可重定位的,它将成功,否则它将失败。
不可重定位的模块将在其文件头的“特性”字段中设置IMAGE_FILE_RELOCS_STRIPPED(0x0001)位标志。可重定位模块将清除此位,并且还将具有包含重定位的部分(如.reloc)。您可以使用PEView或dumpbin /headers your_module.exe
(或dll)
启用ASLR的模块将是可重定位的(未设置relocs剥离标志),并且还将在可选标头的DllCharacteristics字段中设置IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(0x0040)标志。无论名称如何,DllCharacteristics都用于EXE和DLL。
您可以再次检查是否存在使用PE文件浏览器(如PEView)或dumpbin /headers your_module.dll
(或exe)设置的此标志。