【问题标题】:Heap randomization in WindowsWindows 中的堆随机化
【发布时间】:2009-08-05 09:18:56
【问题描述】:

Windows 7 具有 堆随机化堆栈随机化 功能。我怎么能管理它?它们如何影响我的应用程序的性能?在哪里可以找到有关其工作原理的更多信息?

我正在使用 Visual Studio 2008 开发 C++ 程序。我找不到该功能的任何编译器选项。

【问题讨论】:

    标签: c++ windows visual-c++ heap-randomization aslr


    【解决方案1】:

    好的,堆随机化和堆栈随机化是 Windows 功能,但必须在链接时为每个进程显式启用。 Mark Russinovich 在他的 5-th Windows Internals 书中描述了它是如何工作的。

    堆栈随机化包括首先选择由 64 KB 或 256 KB 分隔的 32 个可能的堆栈位置之一。这个基地址是通过找到第一个合适的空闲内存区域然后选择第 x 个可用区域来选择的,其中 x 是根据当前处理器的 TSC 移位和再次生成的掩码为 5 位值。<...>

    最后,当在用户模式下创建时,ASLR 会随机化初始进程堆(以及后续堆)的位置。 RtlCreateHeap 函数使用另一个伪随机、TSC 派生值来确定堆的基址。这个值,这次是 5 位,乘以 64 KB 以生成最终的基地址,从 0 开始,初始堆的可能范围为 0x00000000 到 0x001F0000。此外,如果攻击正在对整个可能的堆地址范围进行暴力扫描,则会手动释放堆基地址之前的范围以尝试强制访问冲突。

    【讨论】:

      【解决方案2】:

      肯定它只是一个操作系统功能?它不应该打扰你。操作系统会移动您的应用程序,只要您不假设您的应用程序已加载到特定的内存地址(无论如何您都不应该假设),您就不会遇到任何问题。

      【讨论】:

      • 我的问题不是关于地址随机化,而是关于堆随机化。我可以在程序生命的任何时候创建新堆。随机化可能是一个繁重的过程。我想确保它不会在没有我的批准的情况下发生。
      • AFAIK 堆随机化只是意味着如果你执行 malloc,它在一次运行时返回的内存块将与它在下一次运行时返回的内存块不同......它只发生在无论如何,进程的虚拟地址空间......不是吗?
      • 我不知道。这就是我要问的原因:)“Windows 7 客户端软件徽标”文档中提到了这些功能。我找不到任何其他信息。
      • 这就是他们所能做的。他们不能破坏旧的应用程序。这一切都是为了让黑客更难进行代码注入,因为黑客不再知道内存中的位置。
      猜你喜欢
      • 2014-11-22
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多