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

前端之家收集整理的这篇文章主要介绍了ASLR和Windows系统DLL用于不知道的可执行文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Microsoft article

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的推进(这个问题的范围)我将不得不改变重新启动之间的数据断点.)

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

更新:

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

猜你在找的Windows相关文章