地址空间布局随机化(ASLR)
ASLR在系统时将可执行映像移动到随机位置 靴子,使其更难开发 代码以可预测的方式运行。 对于一个 全部支持ASLR的组件 它加载的组件也必须 支持ASLR。例如,如果是A.exe 消耗B.dll和C.dll,这三个 必须支持ASLR。 默认情况下,Windows Vista及以后会随机化系统 DLL和EXE ,但DLL和EXE 由ISV创建必须选择支持 ASLR使用/ DYNAMICBASE链接器 选项。
我不太明白。获取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的推进(这个问题的范围)我会有在重新启动之间更改数据断点。)
答案 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链接。