微软的ASLR很奇怪

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

例如,一旦我加载一个DLL然后图像加载在0x12345678
我再次加载图像,图像加载在0x23456789上 (基地址被改变!)
但我再次加载图像
0×12345678
0x23456789
0×12345678
0x23456789

为什么他们这样执行?
是否为崩溃报告的频率?(为了获得重新部署的dll的相同崩溃地址)

Solutions Collecting From Web of "微软的ASLR很奇怪"

这是设计。 通常情况下,Windows在首次加载DLL时为ASLR DLL选择一个首选基地址,然后使用该地址直到系统重新启动。 这样,DLL就会被加载到每个进程的相同地址,并允许代码页被共享。

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

它被记录为256个可能的起始地址之一 。

但我不认为它甚至应用于一个进程,但共享DLL的。

ASLR: 默认情况下,没有打开过程映像 。 ( 3 )为了兼容,

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

当系统引导时,ASLR将可执行映像移动到随机位置,使得利用代码难以可预测地运行。 对于支持ASLR的组件,它所加载的所有组件也必须支持ASLR。 例如,如果A.exe使用B.dll和C.dll,则三者都必须支持ASLR。 默认情况下,Windows Vista和更高版本将随机化系统DLL和EXE,但由ISV创建的DLL和EXE必须选择使用/ DYNAMICBASE链接器选项来支持ASLR。

ASLR也随机堆和堆栈内存:

  • 当应用程序在Windows Vista和更高版本中创建堆时,堆管理器将在随机位置创建堆,以帮助减少尝试利用基于堆的缓冲区溢出成功的机会。 在Windows Vista和更高版本上运行的所有应用程序默认启用堆随机。

  • 当线程在与/ DYNAMICBASE链接的进程中启动时,Windows Vista和更高版本将线程的堆栈移到随机位置,以帮助减少基于堆栈的缓冲区溢出攻击成功的可能性。

昨天安装了新的Win8 RC x64。

小心!

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