如何确定EXE(或DLL)是否参与ASLR,即可重定位?

如何确定EXE(或DLL)是否参与ASLR,即可重定位?

我想检查我的系统上的一些EXE是否可以重定位并参与ASLR。

我知道链接器的默认行为是剥离基重定位,以便EXE不可重定位?

我如何从FileAlyzer这样的工具看到图像是否参与ASLR?

可重定位模块(exe或dll)不一定需要启用ASLR,但启用了ASLR的模块需要可重定位。

启用了ASLR的模块(使用/ DYNAMICBASE链接器开关)将被加载到一个随机地址,而不管其ImageBase(首选加载地址),因此它必须是可重定位的或不能加载的。

如果一个模块不支持ASLR,那么加载器将首先尝试在ImageBase中加载它。 如果这是不可能的(内存已分配),它会尝试加载到另一个地址; 如果模块是可重定位的,它将成功,否则将失败。

如何识别可重定位模块?

不可重定位的模块将在其文件头的特征字段中设置IMAGE_FILE_RELOCS_STRIPPED(0x0001)位标志。 可重定位模块将清除该位,并且也将有一个重定位部分(如.reloc)。 您可以使用PEView或dumpbin /headers your_module.exe (或dll)检查该标志,

如何识别启用ASLR的模块?

启用ASLR的模块将可重定位(未设置relocs已剥离标志),并且还将在可选标头的DllCharacteristics字段中设置IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(0x0040)标志。 无论其名称如何,DllCharacteristics都用于EXE和DLL。

再一次,你可以检查PE文件浏览器如PEView或与dumpbin /headers your_module.dll (或EXE)设置此标志的存在。