【问题标题】:Does ASLR mean rebasing dlls isn't required?ASLR 是否意味着不需要重新定位 dll?
【发布时间】:2015-09-03 15:48:25
【问题描述】:

如果我们使用ASLR,我是否认为在构建过程中重新定位我们的 dll 毫无意义,因为无论如何当内核开始加载它们时,这些 dll 都会再次重新定位?

我担心我们的应用程序经常在终端服务机器上使用。因此,如果在加载时发生 rebase,我们最终可能会为加载它们的每个进程重新设置 dll(每个会话将有一个进程)。这将导致比我们想要支付的更多的内存使用和分页。我需要担心吗?

我发现以下博客文章说变基只发生一次并且是系统范围的:Matt Evans - Enabling ASLR for memory savings?。我还没有看到任何关于此的其他参考资料,所以只是想确定如果我使用 ASLR 并且在我们的构建过程中不进行 rebase,我不会在终端服务框上造成内存问题?

【问题讨论】:

  • 另一个关于备份“一次和系统范围”位的参考:Windows Internals, Sixth Edition, Part 2, p.249 直接说明了这一点。
  • 您已经尝试将调试器附加到终端服务框中的多个进程(在不同的会话中)?这应该显示你的 DLL 的地址是什么。

标签: windows dll aslr


【解决方案1】:

所以根据我的阅读,您应该没有问题。 ASLR 导致 dll 被加载到半随机内存地址,并且不应该只是为每个进程开始变基。如果您想检查 dll 的内存使用情况,有一个名为 MassiveRebase 的免费工具可让您动态加载两个 dll 并查看有关其内存使用情况的信息。旨在查看 aslr 可能对内存产生的更改。 可以在此处找到该工具及其更多信息:http://www.tmurgent.com/appv/index.php/en/resources/tools/137-massive-rebase

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    变基仍然很有帮助。当操作系统加载时,它会将一个固定的随机值应用于 DLL 库。

    结果是 DLL 加载到的位置是单次引导的典型位置,但机器和引导之间的位置不同。

    这意味着许多进程中的给定 DLL 可以在进程之间共享,因为它的所有代码数据都以相同的值共享。

    当一个 DLL 因地址空间被占用而被移动时,它必须修改修复程序,并且共享的 DLL 更少,从而增加了系统负载。

    如果你的 DLL 没有被共享,那么它不会影响资源。

    如果将 DLL 加载到正确的位置,修复 DLL 的成本过去会更便宜,但不确定这是否适用于 ASLR,但仍可以节省资源加载时间。

    【讨论】:

    • 当您说“重新设置基准仍然有用”时,您的意思是在发送之前手动重新设置我的 dll 是否有用?如果是这样,为什么?或者,你的意思是它仍然有用,但我不需要自己做,因为 ASLR 总是在运行时进行变基,而不管我在发货前做或不做任何手动变基?
    • aslr 不会随机移动 DLL;是的。没有 aslr,如果你遇到冲突,那么你会用 aslr 得到它们。我相信这些会减慢加载速度并增加系统内存使用量(减少共享内存)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2017-01-04
    • 2014-11-02
    • 2010-10-17
    • 2013-02-05
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多