如何在不重新启动的情况下确定Windows是否应用ASLR?

时间:2011-08-22 06:08:07

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

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

  

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

     

ASLR在系统时将可执行映像移动到随机位置   靴子,使其更难开发   代码以可预测的方式运行。 (...)

如果是这种情况,我怎么能“测试”,或者更确切地说,检查我的C ++模块或系统模块(例如kernel32.dll)是否发生了ASLR没有反复重启Windows并希望随机性开始?

1 个答案:

答案 0 :(得分:1)

这就是我想要的:

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

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

  1. Microsoft系统DLL都被赋予了唯一的推荐基址;和
  2. 它是映射到进程地址空间的第一个DLL之一。
  3. 由于kernel32通常不会被重新定位,因此如果ASLR被关闭,那么期望将其加载到其建议的基址是合理的。

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