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.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。 如果我在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?