据我了解,ASLR 地址空间布局随机化只会在每次系统启动(每次重新启动)时进行随机重定位。
地址空间布局随机化 (ASLR)
当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。(...)
如果是这种情况,我该如何“测试”,或者更确切地说,检查我的 C++ 模块或系统模块(例如kernel32.dll
)是否正在发生 ASLR,而不需要反复重新启动 Windows 并希望随机性出现?
据我了解,ASLR 地址空间布局随机化只会在每次系统启动(每次重新启动)时进行随机重定位。
地址空间布局随机化 (ASLR)
当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。(...)
如果是这种情况,我该如何“测试”,或者更确切地说,检查我的 C++ 模块或系统模块(例如kernel32.dll
)是否正在发生 ASLR,而不需要反复重新启动 Windows 并希望随机性出现?
这是我会尝试的:
请记住,模块的HMODULE
句柄实际上是模块映像的基地址。您可以使用GetModuleHandle
来获取此值。如果您将其与图像的可选标头值中的基地址进行比较,我们预计当 ASLR 开启时这两个值会有所不同。
请记住,只有GetModuleHandle
在某些系统 DLL 上使用时,这才是 ASLR 的明确指示;它会起作用,kernel32
因为它不是图像重定位的典型候选者:
由于kernel32
通常不会重新定位,因此如果关闭 ASLR,则可以合理地预期它会在其推荐的基地址处加载。
如何从图像头中获取推荐的基地址?最简单的方法是使用DUMPBIN
Visual C++ 附带的实用程序。如果您希望以编程方式执行此操作,则需要对可执行映像的标头进行一些探索,直到找到IMAGE_OPTIONAL_HEADER
结构的ImageBase
字段。有关 PE 标头的更多信息,我推荐Matt Pietrek 撰写的“深入了解 Win32 可移植可执行文件格式”。