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

标签 windows assembly linker portable-executable

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/

相关文章:

windows - Powershell:查找已安装的防病毒软件,过滤掉 Windows Defender

windows - 如何在一个窗口内运行多个进程的 Delphi 中创建类似 Chrome 的应用程序?

c - 如何正确链接 *.asm 文件?

linker - 将嵌入式程序拆分为内存中的多个部分

c - VS2012 静态库的一部分时未找到标识符

Cygwin 或 Gnuwin32 或 MYSYS?

Windows 批处理文件命令和变量

c - 在 Assembly x86 中获取三个数字的最大值时出现段错误

assembly - 8086内存到内存指令。它们存在的目的是什么?

assembly - 4.5 毫秒内可以处理多少个数组元素?