3

ドライバー開発を始めたばかりです。ロード、アンロード、およびデバッグのいくつかの実験のために、次の単純なドライバーを作成しました。

#include <ntddk.h> 

void DriverUnload(PDRIVER_OBJECT pDriverObject) 
{ 
    UNREFERENCED_PARAMETER(pDriverObject);
    DbgPrint("Driver unloading\n"); 
} 

NTSTATUS DriverEntry( 
    PDRIVER_OBJECT DriverObject, 
    PUNICODE_STRING RegistryPath) 
{ 
    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);

    DriverObject->DriverUnload = DriverUnload; 
    DbgPrint("Hello, World\n"); 

    return STATUS_SUCCESS; 
}

ターゲット システムである Windows 7 64 ビット用のドライバーをデバッグ シンボルを使用してコンパイルし、それをターゲット システムにコピーして、OSR Driver Loader でロードして実行しました。

すべてが正常に動作し、ドライバーをアンロードしてロードできます。ここに画像の説明を入力

シリアル接続を使用して WinDbg に接続でき、ターゲット システムを正常に中断して実行できます。ただし、ブレークポイントを設定しようとすると問題が発生します。

私は最初に次のようにブレークポイントを設定しようとしました:

kd> bp MyDriver1!DriverEntry

しかし、問題は、ドライバーをリロードしてブレークポイントをチェックした場合です。

kd> bl
0 e fffff880`03572010 0001 (0001) < Unloaded_MyDriver1.sys >+0x1010

初心者の私には見栄えが悪く(アンロード?)、ロード時に途切れることはありませんでした。

したがって、モジュールがロードされたときにブレークポイントを設定できることがわかりました。

kd> bu MyDriver1

0 e fffff880`03578000 0001 (0001) MyDriver1!DriverEntry < PERF > (MyDriver1+0x0)

上記のコマンドの後にシステムの実行を続行し、ドライバーをロードすると (net start MyDriver1)、システムがクラッシュします。

Break 命令の例外 - コード 80000003 (最初のチャンス)


  • *
  • どちらかを押したので、このメッセージが表示されています *
  • CTRL+C (コンソール カーネル デバッガーを実行している場合) または、*
  • CTRL+BREAK (GUI カーネル デバッガーを実行している場合)、*
  • デバッガー マシンのキーボードで。*
  • *
  • これはバグでもシステムクラッシュでもありません *
  • *
  • デバッガに侵入するつもりがなかった場合は、"g" キーを押してから *
  • 今すぐ「Enter」キーを押してください。このメッセージはすぐに再表示される場合があります。それであれば *
  • 「g」と「Enter」をもう一度押します。*
  • *

nt!RtlpBreakWithStatusInstruction: fffff800 028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff88003572010 0001

(0001) MyDriver1!DriverEntry < PERF > (MyDriver1+0x0)

kd > bc 0 kd> bl 1 e fffff880`03578000 0001 (0001)

MyDriver1!DriverEntry (MyDriver1+0x0)

kd> g アクセス違反 - コード c0000005 (!!! 二度目のチャンス!!!)

nt!IopUnloadDriver+0x327: fffff800`02cb8b29 0fb74844 movzx

ecx,word ptr [rax+44h]

最後に、今実行を続けると、BSOD が発生します...

ここで何が問題なのですか?私のコードは間違っていますか、それともブレークポイントを正しく設定していませんか?

4

1 に答える 1

5

探しているコマンドは sxe ld:MyDriver1 です

これは、ドライバーがメモリにマップされているが MyDriver1!DriverEntry を呼び出す前に壊れ、DriverEntry にブレークポイントを設定できるようになります。

このコマンドbu MyDriver1は、ドライバー イメージの PE ヘッダーの最初のバイトにブレークポイントを配置します。

また、ドライバーをアンロードした後にブレークポイントをクリーンアップします。そうしないと、デバッガーが他の何かに割り当てられる可能性のあるメモリを変更します。

于 2012-06-11T16:48:30.067 に答える