我观看了一张ASLRed dll 图片基于32位进程的地址。
这不是完全随机化。它只是随机化了1/2概率。
例如,一旦我加载了一个dll,图像就会加载到 0x12345678 。
然后我再次加载图像,图像加载到 0x23456789 。(基地址已更改!)
但我再次加载图像
的 0×12345678
0x23456789
0×12345678
0x23456789
......
为什么他们这样做呢? 它是否适用于崩溃报告的频率?(用于获取重新部署的dll的相同崩溃地址)
答案 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了。