【问题标题】:How do I determine if an EXE (or DLL) participate in ASLR, i.e. is relocatable?如何确定 EXE(或 DLL)是否参与 ASLR,即是否可重定位?
【发布时间】:2017-01-04 11:52:21
【问题描述】:

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

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

我知道链接器的默认行为是去除基址重定位,这样 EXE 就不能重定位?

如何通过 FileAlyzer 等工具查看图像是否参与 ASLR?

【问题讨论】:

  • IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE flag 已转。只有 EXE 标头中的标志很重要,DLL 通常是可重定位的。
  • @HansPassant - 为什么 EXE 会在 DllCharacteristics 字段中包含标志?这个字段不是只对DLL“有效”吗?我已经看到一些 EXE 在我的系统上参与了 ASLR,尽管大多数加载在 0x401000。
  • 如果您在 EXE 上启用 ASLR,它将有重定位。

标签: windows assembly linker portable-executable


【解决方案1】:

可重定位的模块(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)检查此标志集的存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多