ASLR和Windows系统DLL用于不知道的可执行文件?

时间:2011-06-18 13:10:12

标签: windows dll kernel32 aslr

来自Microsoft article

  

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

     

ASLR在系统时将可执行映像移动到随机位置   靴子,使其更难开发   代码以可预测的方式运行。 对于一个   全部支持ASLR的组件   它加载的组件也必须   支持ASLR。例如,如果是A.exe   消耗B.dll和C.dll,这三个   必须支持ASLR。 默认情况下,Windows   Vista及以后会随机化系统   DLL和EXE ,但DLL和EXE   由ISV创建必须选择支持   ASLR使用/ DYNAMICBASE链接器   选项。

我不太明白。获取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。如果我使用ASLR在Win7上,如果加载kernel32.dll的可执行文件而不是为ASLR启用,将在重新启动之间更改吗?

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

2 个答案:

答案 0 :(得分:4)

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

<强>更新

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

答案 1 :(得分:1)

您的程序将解决对系统DLL的调用问题。但是,除非您的可执行文件与/ DYNAMICBASE链接,否则不会给它一个随机的基址。换句话说,你的exe将始终加载到相同的基址。

如果您希望将exe加载到随机地址,则必须将其与/ DYNAMICBASE链接,并且它引用的每个DLL也必须与/ DYANMICBASE链接。系统DLL(从Vista开始)都与/ DYNAMICBASE链接。