据我了解,ASLR 地址空间布局随机化只会在每次系统启动时进行随机重定位(每次重启)。
地址空间布局随机化(ASLR)
ASLR在系统时将可执行映像移动到随机位置 靴子,使其更难开发 代码以可预测的方式运行。 (...)
如果是这种情况,我怎么能“测试”,或者更确切地说,检查我的C ++模块或系统模块(例如kernel32.dll
)是否发生了ASLR没有反复重启Windows并希望随机性开始?
答案 0 :(得分:1)
这就是我想要的:
请记住,模块的HMODULE
句柄实际上是模块图像的基址。您可以使用GetModuleHandle
获取此值。如果将其与图像的可选标头值中的基地址进行比较,我们可以预期在打开ASLR时这两个值会不同。
请记住,当GetModuleHandle
用于某些系统DLL时,这只是ASLR的明确指标;它适用于kernel32
,因为它不是图像重定位的典型候选者:
由于kernel32
通常不会被重新定位,因此如果ASLR被关闭,那么期望将其加载到其建议的基址是合理的。
如何从图像标题中获取建议的基址?最简单的方法是使用Visual C ++中包含的DUMPBIN
实用程序。如果您宁愿以编程方式执行此操作,则需要通过可执行图像的标题进行一些搜索,直到找到IMAGE_OPTIONAL_HEADER
结构的ImageBase
字段。有关PE标头的更多信息,我建议使用Matt Pietrek的"An In-Depth Look into the Win32 Portable Executable File Format"。