私はC++で非常に単純なデバッガを作ったが、dwMilliseconds
の値を持つWaitForDebugEvent
を呼び出した場合を除いて問題なく動作するようだ。デバッガが例外時にdebugeeを停止しないC++
私はif
ステートメントを持っています。これは、例外アドレスがブレークポイントIのアドレスと一致するかどうかを確認します。if(ExceptionDebugInfo.ExceptionRecord.ExceptionAddress == lpBreakpoint)
です。
デクリメントeip
(wow64cntxt.Eip --;
)は、Wow64SetThreadContext
(、元の命令(WriteProcessMemory
)とブレークポイント(int3
)バイトを置き換え、命令キャッシュ(FlushInstructionCache
)をフラッシュし、その後、私は元の命令に置き換えブレークポイントを指すようにeip
を設定し、 )。
その後、メインのデバッグループ(break
)に戻り、デバッグを続けます(ContinueDebugEvent
)。
case EXCEPTION_BREAKPOINT:
{
WOW64_CONTEXT wow64cntxt = {0};
wow64cntxt.ContextFlags = WOW64_CONTEXT_ALL;
if(!Wow64GetThreadContext(hThread, &wow64cntxt))
{
printf("Error getting thread context: %lu\n", GetLastError());
}
//lpFunction is the address of a mov instruction I set a breakpoint on
if(excDbgInfo.ExceptionRecord.ExceptionAddress == lpBreakpoint)
{
printf("EIP-Before: 0x%X\n", wow64cntxt.Eip);
//Decrement eip value to point back to the opcode I wrote over with int3
wow64cntxt.Eip --;
printf("EIP-After: 0x%X\n", wow64cntxt.Eip);
//original opcode I replaced with int3(0xCC)
instr = 0x89;
//replace the breakpoint with the original instruction
if(!WriteProcessMemory(hProcess, lpBreakpoint, &instr, sizeof(CHAR), NULL))
{
printf("Error reversing breakpoint: %lu\n", GetLastError());
}
//Flush the instruction cache
FlushInstructionCache(hProcess, lpBreakpoint, 1);
//Set eip to previous instruction
if(!Wow64SetThreadContext(hThread, &wow64cntxt))
{
printf("Error setting thread context: %lu\n", GetLastError());
}
}
system("pause");
//Return to main debug loop, ContinueDebugEvent...
break;
}
私が設定されたブレークポイントの後にいくつかの時間を実行したアドレスに設定されているINFINITE
その後eip
WaitForDebugEvent
と以外のものを使用している場合。
INFINITE
とWaitForDebugEvent
を使用しないと、デバッガが例外をキャッチしたときにすでにeip
がブレークポイントを過ぎてしまっているという問題があります。 WaitForDebugEvent
が0ミリ秒間待っていてもすぐに復帰しても、デバッグ担当者はまだブレークポイントを過ぎて実行されます。
この結果、アクセス違反が発生します。ブレークポイントで置き換えられた命令の残りの半分が、それが許可されていないメモリを変更する新しいオペコードになるためです。
while(1)
{
WaitForDebugEvent(&dbgEvent, INFINITE);
ProcessDebugEvent(&dbgEvent);
ContinueDebugEvent(dbgEvent.dwProcessId, dbgEvent.dwThreadId, DBG_CONTINUE);
}
どれ情報、洞察、ヒント、説明などをいただければ幸いです。
はここに私のメインのデバッグループです。ありがとう。
あなたのコードで何がうまくいかないのですが、ブレークポイント例外がwow64コードデバッガビューの 'STATUS_WX86_BREAKPOINT'(0x4000001F)では' STATUS_BREAKPOINT'(0x80000003)ではなく 'normal 'コンテキストを使用できますGet [Set] ThreadContextしかし、wow64コード – RbMm
でも(STATUS_WX86_BREAKPOINTまたはSTATUS_BREAKPOINTがあなたのデバッガ64ビットまたは32ビットに依存しています) – RbMm
ところで、私はインデント編集を行ったときこれをアップしました。その理由は、これが簡単で面白い質問でも、あなたはそれをよく尋ねて、誰かがそれに答えるために必要なすべての情報を提示したからです。それをやってくれてありがとう、私たちの助けを読んでくれてありがとスタックオーバーフローへようこそ!あなたがこのような質問をし続ければ、ここではすばらしい時間を過ごすでしょう。 –