ベクトル化された例外ハンドラーでは、次のようにスタック フレームをウォークスルーしています (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最後に、「ヒューリスティック」を使用してフレームの終了位置を検出しようとしました。現在のフレーム ポインターを前のフレーム ポインターと比較し、その差が妥当と思われない場合はループを中断します。