Windows 微软';s ASLR很奇怪

Windows 微软';s ASLR很奇怪,windows,dll,portable-executable,aslr,Windows,Dll,Portable Executable,Aslr,我观看了一个ASLReddllimages基于32位进程的地址。 这不是完全随机的。它只是随机化了1/2的概率 例如,加载dll后,图像将加载到0x12345678 我再次加载图像,图像加载到0x23456789(基址已更改!) 但我再次加载图像 0x12345678 0x23456789 0x12345678 0x23456789 ... 他们为什么要这样实施? 它是用于崩溃报告的频率吗?(用于获取重新部署的DLL的相同崩溃地址)它被记录为处于 但我认为它甚至不适用于进程,而是适用于共享D

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

例如,加载dll后,图像将加载到0x12345678
我再次加载图像,图像加载到0x23456789(基址已更改!)
但我再次加载图像
0x12345678
0x23456789
0x12345678
0x23456789

...

他们为什么要这样实施?

它是用于崩溃报告的频率吗?(用于获取重新部署的DLL的相同崩溃地址)

它被记录为处于

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

ASLR:。这是一个选择加入的东西,为了兼容性

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

ASLR将可执行图像移动到 系统启动时的随机位置, 使利用代码进行攻击变得更加困难 可预见地运作。对于一个组件 为支持ASLR,所有 它还必须支持ASLR。对于 例如,如果A.exe使用B.dll和 C.dll,所有三个都必须支持ASLR。通过 默认情况下,Windows Vista和更高版本将 随机化系统DLL和EXE,但 ISV创建的DLL和EXE必须选择 在中,使用 /DYNAMICBASE链接器选项

ASLR还随机化堆和堆栈 内存:

  • 当应用程序在中创建堆时 Windows Vista及更高版本,堆 管理器将以最快的速度创建该堆 随机位置有助于减少 试图利用 基于堆的缓冲区溢出成功。 堆随机化是由 所有运行的应用程序的默认值 在Windows Vista和更高版本上

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


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


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

昨天安装了新的Win8 RC x64

小心


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

请给我文档的URL。谢谢。对于一个EXE-PE,我认为它可能是正确的。但是对于Dll,它仍然以1/2的概率工作。真奇怪。迈克尔·霍华德错了吗-我当然不认为他错了。可能有什么我误解了。