在向量异常处理程序中,我正在遍历这样的堆栈帧(在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 最后,我尝试使用一些“启发式”来检测帧结束的位置:我将当前帧指针与前一帧指针进行比较,如果差异不对,则打破循环看似合理。