穿过堆栈框架 - 在哪里停下来?

时间:2012-09-10 17:45:57

标签: windows x86 stack-trace callstack

在向量异常处理程序中,我正在遍历这样的堆栈帧(在32位进程中,假设没有FPO):

unsigned int *nextFrame;
unsigned int returnAddress;
__asm mov [nextFrame], ebp
while (!IsBadReadPtr(nextFrame, 8))
{
  nextFrame = (unsigned int *)*nextFrame;
  returnAddress = *(nextFrame + 1);
}

然而,IsBadReadPtr似乎不够好停止条件,因为经过多次迭代后,我在*(nextFrame + 1)处获得了访问冲突。

什么是正确的条件?

更新:事实证明IsBadReadPtr引发(并处理)异常,因此根本无法在VEH中使用。

Update2 最后,我尝试使用一些“启发式”来检测帧结束的位置:我将当前帧指针与前一帧指针进行比较,如果差异不对,则打破循环看似合理。

0 个答案:

没有答案