AnT*_*AnT 14 c c++ visual-studio-2005 windows-vista
我已经在Windows XP Pro 64位下使用Visual Studio 2005进行C和C++项目一段时间了.我在调试器中不时使用的一个流行技巧是记住程序的先前调试运行中的数字指针值(比如说0x00000000FFAB8938),将其添加到具有正确类型转换(例如((MyObject *) 0x00000000FFAB8938)->data_field)的监视窗口,然后在下一次调试运行期间观察对象占用的内存.在许多情况下,这是一个非常方便和有用的事情,因为只要代码保持不变,就可以预期分配的内存布局也将保持不变.简而言之,它有效.
但是,最近我开始在64位Windows Vista(家庭高级版)的笔记本电脑上使用相同版本的Visual Studio.奇怪的是,在该设置中使用这个技巧要困难得多.实际的内存地址似乎经常在运行之间发生变化,没有明显的原因,即使程序的代码根本没有改变.看起来实际地址并没有完全随机变化,它只是从固定的或多或少稳定的值集中选择一个值,但无论如何它使得这种类型的内存观察变得更加困难.
有谁知道Windows Vista中此行为的原因?是什么导致内存布局的变化?是否有一些外部入侵进程的地址空间来自其他[系统]进程?或者是Vista下的Heap API实现的一些怪异/特征?有没有办法防止这种情况发生?
Mar*_*wis 30
Windows Vista实现了地址空间布局随机化,堆随机化和堆栈随机化.这是一种安全机制,试图防止依赖于每条代码和数据在内存中的位置的知识的缓冲区溢出攻击.
可以通过设置MoveImages注册表值来关闭ASLR .我找不到一种方法来禁用堆随机化,但是一些微软的人建议计算相对于的地址_crtheap.即使堆移动,相对地址也可能保持稳定.