【发布时间】:2011-09-17 18:46:41
【问题描述】:
地址空间布局随机化 (ASLR)
当系统运行时,ASLR 将可执行映像移动到随机位置 靴子,使其更难被利用 可预测地运行的代码。 对于一个 支持 ASLR 的组件,所有 它加载的组件也必须 支持 ASLR。 例如,如果 A.exe 消耗 B.dll 和 C.dll,所有三个 必须支持 ASLR。 默认情况下,Windows Vista 及更高版本将随机化系统 DLL 和 EXE,但 DLL 和 EXE 由 ISV 创建的必须选择支持 使用 /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
查看BaseProcessStart 的asm,我在我的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 的启动(这个问题的范围)我会在重新启动之间更改数据断点。)
【问题讨论】:
-
调试 + Windows + 模块,地址栏。重启几次,让我们知道你发现了什么。
-
@Hans:这只是引起了我的兴趣。不幸的是,我个人可以使用的唯一 Win7 Dev 盒子,atm。是 2008R2 服务器,我不会为了尝试而重新启动我们的 CI 服务器 ;-)
-
+1 因为我想问同样的问题。我在 Windows 7 64 位上进行了一些实验,在阅读了答案和 cmets 之后,我得出的结论是系统 DLL 的基础在每次重新启动时都会重新定位。我的可执行文件中未与
/DYNAMICBASE链接的其他非系统DLL 的基础不会重定位。