ASLR和非Windows系统DLL

从微软的文章:

地址空间布局随机化(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    

看看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。 如果我在Win7上使用ASLR,如果加载kernel32.dll的可执行文件未启用ASLR,此地址是否会在重新启动之间发生变化?

(注意:对于我来说,只有一个次要的用例,这个地址对于以下情况很有用:在Visual Studio中,我只能为汇编级函数设置一个“数据断点”,即断点@ 0x7 .. 。 - 如果我想打破一个特定的ntdll.dll或kernel32.dll功能,在Windows XP中,我不必在重启之间调整我的断点。随着ASLR踢(这个问题的范围),我将不得不改变重新启动之间的数据断点。)


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

更新:

本文中关于ASLR的章节解释了什么时候重新定位和何时。 它没有提到基地是否会重新设置每次重新启动,但对于系统dll,它永远不会保证两次加载相同的地址,重新启动或不重新启动。 根据文章,重要的是,所有的东西都需要选择加入ASLR以便系统DLL被重新定位。


您的程序会将调用解析为系统DLL,无论它们是在何处加载。 但是,除非您的可执行文件与/ DYNAMICBASE链接,否则不会获得随机的基址。 换句话说,你的exe文件总是会载入相同的基地址。

如果你想让你的exe加载到一个随机地址,那么你必须将它与/ DYNAMICBASE链接起来,并且它引用的每个DLL也必须与/ DYANMICBASE链接。 系统DLL(从Vista开始)全部与/ DYNAMICBASE链接。

链接地址: http://www.djcxy.com/p/62191.html

上一篇: ASLR and Windows System DLLs for non

下一篇: How do we compare ASLR across different Operating Systems?