微软的ASLR很奇怪

时间:2010-09-07 01:25:00

标签: windows dll portable-executable aslr

我观看了一张ASLRed dll 图片基于32位进程的地址。
这不是完全随机化。它只是随机化了1/2概率。

例如,一旦我加载了一个dll,图像就会加载到 0x12345678
然后我再次加载图像,图像加载到 0x23456789 。(基地址已更改!)
但我再次加载图像 的 0×12345678
0x23456789
0×12345678
0x23456789

......

为什么他们这样做呢? 它是否适用于崩溃报告的频率?(用于获取重新部署的dll的相同崩溃地址)

3 个答案:

答案 0 :(得分:12)

这是设计的。通常,Windows在首次加载DLL时为ASLR DLL选择首选基址,然后它会继续使用该地址,直到系统重新启动。这样,DLL将在加载它的每个进程中映射到相同的地址,从而允许共享代码页。

但是,如果已从每个进程卸载DLL,则系统有时可能在下次加载DLL时选择不同的基址。这样做是为了减少虚拟地址空间碎片,而不是出于安全原因。这就是你的情况似乎正在发生的事情。

答案 1 :(得分:2)

记录为one of 1 of 256 possible starting addresses

但我认为它甚至不适用于进程,而是应用于共享DLL。

ASLR:is not on by default for process images。对于兼容性而言,这是一个选择加入的东西。(3

  

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

     

ASLR将可执行图像移入   系统启动时的随机位置,   使得利用代码变得更难   可预测地运作。对于组件   支持ASLR,所有组件   它的加载也必须支持ASLR。对于   例如,如果A.exe消耗B.dll和   C.dll,这三个人都必须支持ASLR。通过   默认,Windows Vista及更高版本   随机化系统DLL和EXE,但是   ISV创建的DLL和EXE必须选择   用来支持ASLR   / DYNAMICBASE链接器选项。

     

ASLR还随机化堆和堆栈   存储器:

     
      
  • 当应用程序在中创建堆时   Windows Vista及更高版本的堆   经理将在a处创建该堆   随机位置,以帮助减少   试图利用的机会   基于堆的缓冲区溢出成功。   堆随机化是通过   默认运行所有应用程序   在Windows Vista及更高版本上。

  •   
  • 当a   线程在与之链接的进程中启动   / DYNAMICBASE,Windows Vista及更高版本   将线程的堆栈移动到随机   位置有助于减少机会   基于堆栈的缓冲区溢出   利用将成功。

  •   

答案 2 :(得分:0)

昨天安装了新的Win8 RC x64。

小心!

Kernel32.dll(64位版本)在不同进程中具有不同的基址(当然,在单个会话中)。只有ntdll.dll基地址保持不变。我不得不更改代码,你不能再依赖永久地址Loadlibrary了。