2009-06-11 21 views
6

定義済みのアドレスに達するとリモートプロセススレッドがブレークする(そのスレッドで実行を停止する)プログラムをウィンドウ下に書くことは可能ですか?非常に基本的なデバッガを書く

私はWindows Debug APIを試してきましたが、ブレークポイントの設定に関しては非常に制限されているようです。 DebugBreakProcess関数は有望だったようですが、このAPI呼び出しの使用方法に関する例は見つかりません。

答えて

12

アドレスにブレークポイント(x86では0xCCのオペコード)を書き込むには、WriteProcessMemoryを使用する必要があります。 x86では、debuggeeがコード内のそのポイントにヒットすると、0xCCはint 3例外を生成します。これはデバッガのWaitForDebugEventによって取得され、EXCEPTION_DEBUG_EVENTが設定されたDEBUG_EVENTが返されます。

次に、そのアドレスを元のコードに修正してから続行する必要があります。もう一度ブレークするには、シングルステップを実行してブレークポイントオペコードを再パッチする必要があります。シングルステップでは、スレッドコンテキストのEFlagでシングルステップフラグを設定する必要があります。

DebugBreakProcessは、デバッグ中のプロセスのリモートブレークを生成するために使用されます。デバッグは、コード内の任意のポイントでブレークするために使用することはできません。

+0

私は次のようにすることができます: 1.定義済みアドレス(PA)の現在のオペレーションを読み込み、それを に保存します。2. opを0xCCとNOPSに置き換えて、int 3例外を生成します実行を停止しますか?) 3. EXCEPTION_DEBUG_EVENTをキャッチ 4.スレッドの実行を正しく停止しましたが、コードの一部が置き換えられ、予期しない結果が発生します。私はPAで保存されたOPを書き直すことができましたが、それはすでに遅すぎるでしょうか?代わりにリモートスレッドがOPを手動で実行するように強制できますか? – ldog

+1

パッチを適用するのが遅すぎることはありません。ターゲットIPは変更されておらず、コードを変更していない場合は、Debugeeが例外を再発行します。 – Michael

+0

パッチの適用に問題があります。私はブレークポイントを設定することができますが、私はブレークポイントの例外をキャッチすることができますが、私はWriteProcessMemoryを元のオペコードに書き戻そうとすると、プログラムがコードを正しく実行しないというアクセス違反例外が発生します。私はWriteProcessMemoryの後にFlushInstructionCacheを実行しますが、それは役に立たないようです。 – ldog

1

マイケルが正しい - また、いったん接続したら(つまり、ユーザーが "プロセスにブレーク"すると突然)、デバッガの任意のプロセスに侵入したい場合、標準的な方法は、ルーチンがint3を発行するリモートスレッド。

+0

DebugBreakProcessは、壊れたリモートスレッドを作成するように見えます。 – Michael

+0

ああ、はい、それを使用する - CreateRemoteThreadを使用して正しくはかなり難しいです。 –

関連する問題