異常な分布(ユーザー異常)

コンテンツレビュー:

例外がカーネル層で送信される場合、例外処理関数もリング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)

  1. _KeContextFromKframesは、3番目のリングに戻る準備としてTrap_frameをコンテキストにバックアップします
  2. 前のモードを決定します0はカーネル呼び出し、1はユーザー呼び出しです
  3. 。それは最初のチャンスですか
  4. カーネルデバッガはありますか
  5. 3リングデバッグに送信
  6. 3リングデバッガーがこの例外を処理しない場合は、EIPをKiUserExceptionDispatcherに修正してください
  7. KiDispatchException関数の実行が終了します:CPU例外とシミュレートされた例外の戻り場所が異なり
    ますCPU例外:CPUが例外を検出しました-> IDTをチェックして処理関数を実行します
    -> CommonDispatchException-> KiDispatchExceptionがIRETDを介して3つのループシミュレーション例外を返します:CxxThrowException-> RaiseException-> RtlRaiseException ----> Nt!NtRaiseException—> Nt!KiRaiseException ----> KiDispatchExceptionは、システム呼び出しを介してリング3に戻ります
  8. いずれにしても、スレッドは再びループ3に戻り、KiUserExceptionDispatcher関数が実行されます。

おすすめ

転載: blog.csdn.net/CSNN2019/article/details/113837725