事前定義されたアドレスに到達すると、リモート プロセス スレッドが中断する (そのスレッドでの実行が停止する) 原因となるプログラムを Windows で作成することは可能ですか?
Windows Debug API を試してみましたが、ブレークポイントの設定に関しては非常に制限されているようです。DebugBreakProcess 関数は有望に思えましたが、この API 呼び出しの使用例が見つかりません。
事前定義されたアドレスに到達すると、リモート プロセス スレッドが中断する (そのスレッドでの実行が停止する) 原因となるプログラムを Windows で作成することは可能ですか?
Windows Debug API を試してみましたが、ブレークポイントの設定に関しては非常に制限されているようです。DebugBreakProcess 関数は有望に思えましたが、この API 呼び出しの使用例が見つかりません。
WriteProcessMemory を使用してブレークポイント (x86 ではオペコード 0xCC) をアドレスに書き込む必要があります。x86 では、デバッグ対象がコード内のそのポイントに到達すると、0xCC によって int 3 例外が生成されます。これは、デバッガーの WaitForDebugEvent によって検出され、EXCEPTION_DEBUG_EVENT が設定された DEBUG_EVENT を返します。
次に、続行する前に、そのアドレスを元のコードにパッチする必要があります。再度ブレークしたい場合は、シングル ステップを実行してから、ブレークポイント オペコードを再パッチする必要があります。シングル ステップにするには、スレッド コンテキストの EFlag にシングル ステップ フラグを設定する必要があります。
DebugBreakProcess は、デバッグ中のプロセスのリモート ブレークを生成するために使用されます。コード内の任意のポイントでブレークするために使用することはできません。
Michael の言うとおりです。また、アタッチした後にデバッガーで任意のプロセスに侵入したい場合 (つまり、ユーザーが突然 [プロセスに侵入] をクリックした場合)、標準的な方法はリモート スレッドを作成することです。ルーチンは int3 を発行します。