2

来自微软文章

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

当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。对于支持 ASLR 的组件,它加载的所有组件也必须支持 ASLR。例如,如果 A.exe 使用 B.dll 和 C.dll,则这三个都必须支持 ASLR。默认情况下,Windows Vista 及更高版本将随机化系统 DLL 和 EXE,但 ISV 创建的 DLL 和 EXE 必须使用 /DYNAMICBASE 链接器选项选择支持 ASLR。

我不太明白。获取 Windows 上每个进程加载的基本系统 DLL:NtDll.dllkernel32.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 的启动(这个问题的范围),我将不得不改变重新启动之间的数据断点。)

4

2 回答 2

4

从技术上讲,无论系统 dll 是否被重定位,都无关紧要,因为链接器将绑定到符号,而不是地址。这些符号由运行时加载程序解析为实例化系统 dll 的地址,因此您的二进制文件不应该更明智。然而,据我所见,Windows 7 将在每次重新启动时重置基本随机化,包括系统 dll(注意:这是来自在 widows server 2008 R2 上调试 WOW64 应用程序)。您还可以通过一些注册编辑在系统范围内禁用 ASLR,但这并不真正相关......

更新:

本文中有关 ASLR 的部分解释了重定位的内容和时间。它没有提到基础是否会在每次重新启动时重置,但对于系统 dll,它永远不会保证在同一地址加载两次,重新启动或不重新启动。重要的是根据文章,一切都需要选择加入 ASLR 才能重新定位系统 dll。

于 2011-06-18T13:28:12.377 回答
1

您的程序将解析对系统 DLL 的调用,无论它们何时被加载。但是,除非您的可执行文件与 /DYNAMICBASE 链接,否则它不会被赋予随机基地址。换句话说,您的 exe 将始终加载到相同的基地址。

If you want your exe to load at a randomized address, then you have to link it with /DYNAMICBASE, and every DLL that it references must also have been linked with /DYANMICBASE. The system DLLs (starting in Vista) are all linked with /DYNAMICBASE.

于 2011-06-18T13:51:05.823 回答