Address Space Layout Randomization (ASLR)
ASLR moves executable images into random locations when a system
boots,making it harder for exploit
code to operate predictably. For a
component to support ASLR,all
components that it loads must also
support ASLR. For example,if A.exe
consumes B.dll and C.dll,all three
must support ASLR. By default,Windows
Vista and later will randomize system
DLLs and EXEs,but DLLs and EXEs
created by ISVs must opt in to support
ASLR using the /DYNAMICBASE linker
option.
我不太清楚.获取WIndows上的每个进程加载的基本系统DLL:NtDll.dll和kernel32.dll.
如果a具有不可识别的可执行文件,这些系统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上,如果没有为ASLR启用加载kernel32.dll的可执行文件,这个地址是否会在重新启动之间发生变化?
(注意:对我来说,atm.,这个地址只有一个小用例:在Visual Studio中,我只能为汇编级函数设置一个“数据断点”,即断点@ 0x7 .. . – 如果我想打破特定的ntdll.dll或kernel32.dll函数,在Windows XP中我不必在重新启动之间调整断点.随着ASLR的推进(这个问题的范围)我将不得不改变重新启动之间的数据断点.)
更新:
关于ASLR在this篇文章中的部分解释了重新定位的内容以及何时重新定位.它没有提到基数是否会重置每次重启,但对于系统dll,它永远不会保证在同一地址加载两次,重启或不重启.重要的是根据文章,一切都需要选择加入ASLR系统dll才能重新定位.