0

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

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

当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。(...)

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

4

1 回答 1

1

这是我会尝试的:

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

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

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

由于kernel32通常不会重新定位,因此如果关闭 ASLR,则可以合理地预期它会在其推荐的基地址处加载。

如何从图像头中获取推荐的基地址?最简单的方法是使用DUMPBINVisual C++ 附带的实用程序。如果您希望以编程方式执行此操作,则需要对可执行映像的标头进行一些探索,直到找到IMAGE_OPTIONAL_HEADER结构的ImageBase字段。有关 PE 标头的更多信息,我推荐Matt Pietrek 撰写的“深入了解 Win32 可移植可执行文件格式”

于 2011-08-22T15:31:32.817 回答