【发布时间】:2009-08-05 09:18:56
【问题描述】:
Windows 7 具有 堆随机化 和 堆栈随机化 功能。我怎么能管理它?它们如何影响我的应用程序的性能?在哪里可以找到有关其工作原理的更多信息?
我正在使用 Visual Studio 2008 开发 C++ 程序。我找不到该功能的任何编译器选项。
【问题讨论】:
标签: c++ windows visual-c++ heap-randomization aslr
Windows 7 具有 堆随机化 和 堆栈随机化 功能。我怎么能管理它?它们如何影响我的应用程序的性能?在哪里可以找到有关其工作原理的更多信息?
我正在使用 Visual Studio 2008 开发 C++ 程序。我找不到该功能的任何编译器选项。
【问题讨论】:
标签: c++ windows visual-c++ heap-randomization aslr
好的,堆随机化和堆栈随机化是 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。此外,如果攻击正在对整个可能的堆地址范围进行暴力扫描,则会手动释放堆基地址之前的范围以尝试强制访问冲突。
【讨论】:
肯定它只是一个操作系统功能?它不应该打扰你。操作系统会移动您的应用程序,只要您不假设您的应用程序已加载到特定的内存地址(无论如何您都不应该假设),您就不会遇到任何问题。
【讨论】: