我想检查我系统上的一些 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 剥离标志),并且还将在可选 header 的 DllCharacteristics 字段中设置 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (0x0040) 标志。无论名称如何,DllCharacteristics 都用于 EXE 和 DLL。

同样,您可以使用 PE 文件浏览器(如 PEView)或 dumpbin /headers your_module.dll(或 exe)检查此标志集是否存在。

关于windows - 如何确定 EXE(或 DLL)是否参与 ASLR,即是否可重定位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39189477/

10-11 19:04