記事のディレクトリ
コンテンツレビュー:
例外がカーネル層で送信される場合、例外処理関数もリング0にあり、スタックを切り替える必要がないため、処理は比較的簡単ですが、例外がリング3で発生する場合は、処理機能を実行するには、スタックを切り替えてリング3に戻る必要があります。
スイッチングスタックの処理方法は、ユーザーAPCの実行プロセスとほぼ同じですが、唯一の違いは、ユーザーAPCが3番目のループに戻った後に実行される関数がKiUserApcDispatcherであり、例外としてリターンループ3の後に実行される関数です。処理はKiUserExceprionDispatcherです
したがって、ユーザーのAPCの実行プロセスを理解することは、3ループの例外処理を理解するための鍵となります。
ユーザー例外処理プロセス:
VOID KiDispatchException(ExceptionRecord、ExceptionFrame、TrapFrame、PreviousMode、FirstChance)
1._KeContextFromKframes 3番目のリングに戻る準備として、Trap_frameをコンテキストにバックアップします。
ステップ1:ユーザー例外またはカーネル例外に関係なく、最初にTrap_frameをバックアップし(現在のスレッドがループ3からループ0に入ると、eip実行場所の値であるレジスター領域の環境)、コンテキストにバックアップします(ループ3に戻るための準備)
この関数の2つの例外(ユーザー例外とカーネル例外)の分散は制御下にあるため、例外処理を3番目のリングに戻す必要があるかどうか、カーネル例外を戻す必要はありません(カーネル例外)。処理機能は0リングにあります)、ユーザー例外は戻る必要があります(ユーザーレイヤー処理機能は3番目のリング0にあります)。
2.ステップ2:前のモードを決定します。0はカーネル呼び出し、1はユーザー呼び出し、ユーザーレイヤーは異常であり、ジャンプします:0x4258C3
3番目のステップ:最初に実行されるときは、最初の呼び出しである必要があります(この関数は複数回実行されます)ので、次に進みます。
ここで、カーネルデバッガーが有効かどうかが判断されます。カーネルデバッガーがある場合、この値はゼロ以外です。カーネルデバッガーがある場合は、最初に例外情報を呼び出して例外デバッガーに送信します(次に、ここで、カーネル例外デバッガーがないか、カーネル例外デバッガーがそれを処理しなかったと仮定します)
4番目のステップ:3リングデバッガーを判断するために使用されます(3リングデバッガーが存在しない場合、または3リングデバッガーがそれを処理していない場合は、ダウンします)
ステップ5:サードリングロードに戻る準備をする
Trap_frameは最初にコンテキストにバックアップされ、その後、ここで好きなように変更できます。
最も重要な変更は、KeUserExceptionDispatcherの値をEipに上書きすることです。これは、現在の位置の3番目のリングに直接戻りません。ただし、現在のプログラムの実行を終了させます
総括する
VOID KiDispatchException(ExceptionRecord、ExceptionFrame、TrapFrame、PreviousMode、FirstChance)
- _KeContextFromKframesは、3番目のリングに戻る準備としてTrap_frameをコンテキストにバックアップします
- 前のモードを決定します0はカーネル呼び出し、1はユーザー呼び出しです
- 。それは最初のチャンスですか
- カーネルデバッガはありますか
- 3リングデバッグに送信
- 3リングデバッガーがこの例外を処理しない場合は、EIPをKiUserExceptionDispatcherに修正してください
- KiDispatchException関数の実行が終了します:CPU例外とシミュレートされた例外の戻り場所が異なり
ますCPU例外:CPUが例外を検出しました-> IDTをチェックして処理関数を実行します
-> CommonDispatchException-> KiDispatchExceptionがIRETDを介して3つのループシミュレーション例外を返します:CxxThrowException-> RaiseException-> RtlRaiseException ----> Nt!NtRaiseException—> Nt!KiRaiseException ----> KiDispatchExceptionは、システム呼び出しを介してリング3に戻ります - いずれにしても、スレッドは再びループ3に戻り、KiUserExceptionDispatcher関数が実行されます。