非常简单地说,如果一个C++程序执行以下函数(比如在Windows 7上,使用任何VS版本进行编译),然后崩溃,然后您使用WER附加调试器,或者WER生成崩溃转储并稍后分析崩溃转储。是否可以直接识别覆盖整个堆栈的错误代码?
是从垃圾堆里的信息有可能,以直接推断,这个功能被执行,也就是找到属于那个执行它,这个函数在执行线程痕迹。
或者当我损坏整个堆栈时,所有的执行轨迹都消失了吗?
void bye_bye_stack() {
int local = 42;
int* stackaddr = &local;
while(time(NULL) != NULL) { // prevent optimizations via call to time()
++stackaddr; // stack grows towards smaller addresses, so increasing the pointer will point to info we already put on the stack
*stackaddr = local; // destroy stack content
// program will (likely) crash here once we reach a read-only page
}
}
使用valgrind? (填充物) – 2013-01-18 14:12:35
不,这是极端的痛苦。 EIP和EBP是垃圾,ESP指向爆炸的堆栈帧,许多可能已经丢失。你所能做的就是回去尝试找到一个没有踩踏的返回地址。这仍然只给你一小部分调用堆栈。接下来您考虑使用安全的CRT功能。 –