How do I determine if an EXE (or DLL) participate in ASLR, i.e. is relocatable?
我想检查我系统上的某些 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/