来自微软文章:
地址空间布局随机化 (ASLR)
当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。对于支持 ASLR 的组件,它加载的所有组件也必须支持 ASLR。例如,如果 A.exe 使用 B.dll 和 C.dll,则这三个都必须支持 ASLR。默认情况下,Windows Vista 及更高版本将随机化系统 DLL 和 EXE,但 ISV 创建的 DLL 和 EXE 必须使用 /DYNAMICBASE 链接器选项选择支持 ASLR。
我不太明白。获取 Windows 上每个进程加载的基本系统 DLL:NtDll.dll
和kernel32.dll
.
如果有一个不知道的可执行文件,这些系统 DLL 会使用 ASLR 吗?也就是说,在 Win 7 上每次系统重新启动后,它们会在不同的基地址加载此可执行文件,还是在系统重新启动后总是在相同的基地址加载,就像在 Win XP 上一样?
为了更清楚我的意思:我的典型虚拟程序的启动堆栈将如下所示:
write_cons.exe!wmain() Line 8 C++
write_cons.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C
write_cons.exe!wmainCRTStartup() Line 403 C
> kernel32.dll!_BaseProcessStart@4() + 0x23 bytes
查看 asm BaseProcessStart
,我在我的 XP 框中看到:
_BaseProcessStart@4:
7C817054 push 0Ch
7C817056 push 7C817080h
7C81705B call __SEH_prolog (7C8024D6h)
7C817060 and dword ptr [ebp-4],0
...
现在我感兴趣的是以下内容:
在 Windows XP 上,无论我重新启动这台机器多少次,地址都将始终为 0x7C817054。如果我在带有 ASLR 的 Win7 上,如果加载 kernel32.dll 的可执行文件没有为 ASLR 启用,这个地址会在重新启动之间改变吗?
(注意:对我来说,atm.,这个地址只有一个小用例有用:在 Visual Studio 中,我只能为程序集级函数设置一个“数据断点”,即断点@0x7.. . - 如果我想中断特定的 ntdll.dll 或 kernel32.dll 函数,在 Windows XP 中我不必在重新启动之间调整断点。随着 ASLR 的启动(这个问题的范围),我将不得不改变重新启动之间的数据断点。)