代码之家  ›  专栏  ›  技术社区  ›  Benjamin

微软的ASLR很奇怪

  •  4
  • Benjamin  · 技术社区  · 14 年前

    32位进程的基于图像的地址。
    这不是完全随机的。它只是随机化了1/2的概率。

    例如,一旦我加载了一个dll,图像就被加载到 0x12345678 .
    0x23456789
    但我再次加载图像
    0x12345678
    0x23456789
    0x12345678
    0x23456789

    他们为什么要这么做?
    是为了车祸报告的频率吗?(用于获取重新部署的DLL的相同崩溃地址)

    3 回复  |  直到 10 年前
        1
  •  13
  •   Pavel Lebedinsky    14 年前

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

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

        2
  •  2
  •   Ian Boyd    14 年前

    one of 1 of 256 possible starting addresses .

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

    is not on by default for process images . 这是一个选择加入的东西,为了兼容性( 3 )

    (ASLR公司)

    ASLR将可执行映像移动到 使代码更难利用 可预见地运作。对于组件 为了支持ASLR,所有组件 它还必须支持ASLR。为了 C.dll,所有三个都必须支持ASLR。由 默认情况下,Windows Vista和更高版本将 随机化系统DLL和EXE,但是 ISV创建的DLL和EXE必须选择 以支持ASLR使用

    内存:

    • Windows Vista及更高版本,堆 随机位置有助于减少 一次企图利用 堆随机化由 所有运行的应用程序的默认值 在Windows Vista和更高版本上。

    • 当 线程在与 将线程的堆栈随机移动 位置有助于减少

        3
  •  0
  •   Maximus    13 年前

    昨天安装了新的Win8 RC x64。

    小心!