【问题标题】:How can I determine if Windows applies ASLR without rebooting?如何确定 Windows 是否在不重新启动的情况下应用 ASLR?
【发布时间】:2026-02-24 03:10:01
【问题描述】:

据我了解,ASLR 地址空间布局随机化只会在每次系统启动(每次重新启动)时进行随机重定位。

地址空间布局随机化 (ASLR)

当系统运行时,ASLR 将可执行映像移动到随机位置 靴子,使其更难被利用 可预测地运行的代码。 (...)

如果是这种情况,我该如何“测试”,或者更确切地说,检查我的 C++ 模块或系统模块(例如,kernel32.dll)是否正在发生 ASLR 而无需重复重新启动 Windows 并希望出现随机性?

【问题讨论】:

    标签: windows visual-c++ windows-7 aslr address-space


    【解决方案1】:

    这是我会尝试的:

    请记住,模块的HMODULE 句柄实际上是模块映像的基地址。您可以使用GetModuleHandle 获取此值。如果您将其与图像的可选标头值中的基地址进行比较,我们预计当 ASLR 开启时这两个值会有所不同。

    请记住,只有在某些系统 DLL 上使用 GetModuleHandle 时,这才是 ASLR 的明确指示;它适用于kernel32,因为它不是图像重定位的典型候选者:

    1. Microsoft 系统 DLL 都被赋予了唯一的推荐基地址;和
    2. 它是最早映射到进程地址空间的 DLL 之一。

    由于kernel32 通常不会被重定位,如果 ASLR 被关闭,期望它被加载到其推荐的基地址是合理的。

    如何从图像标头中获取推荐的基地址?最简单的方法是使用 Visual C++ 附带的DUMPBIN 实用程序。如果您希望以编程方式执行此操作,则需要对可执行映像的标头进行一些探索,直到找到IMAGE_OPTIONAL_HEADER 结构的ImageBase 字段。有关 PE 标头的更多信息,我推荐 Matt Pietrek 的 "An In-Depth Look into the Win32 Portable Executable File Format"

    【讨论】:

      最近更新 更多