ハードウェアブレークポイントをゲームプロセスにアタッチしようとしています。それから、私は例外をループして、そこに入れたものを待っています。これもうまくいきます。問題はそれが起こった後、私はブレーキをかけることができない無限ループに入ります。アドバイスできますか? 私はこれをやっている理由は、この時点でスレッドを停止し、コンテキストを使用してEAX値を読み取り、プロセスを続行したいということです。スレッドをデバッグ中の無限ループ
Header.hには、ここで呼び出される関数が含まれており、これらはすべて正常に動作します。したがって、この時点ではそれを含めません。
の#include "HEADER.H" の#include
int型のmain(){
SetDebugPrivilege(TRUE);
DWORD dwProcessID = 0;
DWORD dwGame = 0;
printf("Looking for game process...\n");
while (dwProcessID == 0) {
dwProcessID = GetProcessID(L"PathOfExile.exe");
if (dwProcessID != 0)
dwGame = 1;
Sleep(100);
}
printf("dwProcessID = %p\n", dwProcessID);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
MODULEENTRY32 module;
module.dwSize = sizeof(MODULEENTRY32);
Module32First(snapshot, &module);
printf("PoE base address = %p\n", module.modBaseAddr);
hpChangeBreakpoint = (DWORD*)((char *)module.modBaseAddr + 0x1AAD20);
std::cout << hpChangeBreakpoint << std::endl;
//hpChangeBreakpoint = 0x013FB279;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessID);
BOOL bDebugging = DebugActiveProcess(dwProcessID);
printf("bDebugging = %d\n", bDebugging);
DWORD dwThreadID = GetProcessThreadID(dwProcessID);
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwThreadID);
CONTEXT parentCtx;
parentCtx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
if (GetThreadContext(hThread, &parentCtx))
{
parentCtx.Dr0 = (DWORD)hpChangeBreakpoint;
parentCtx.Dr7 = 0x00000001;
std::cout << "GetThreadContext successful" << std::endl;
SetThreadContext(hThread, &parentCtx);
}
DEBUG_EVENT DebugEvent;
DWORD dbgFlag = DBG_CONTINUE;
DWORD *currentHpPointerAddress = nullptr;
DWORD *maxHpPointerAddress = nullptr;
BOOLEAN bQuit = FALSE;
while (!bQuit && WaitForDebugEvent(&DebugEvent, INFINITE))
{
dbgFlag = DBG_CONTINUE;
switch (DebugEvent.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
switch (DebugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_SINGLE_STEP:
if (DebugEvent.u.Exception.ExceptionRecord.ExceptionAddress == (void*)hpChangeBreakpoint)
{
#define RESUME_FLAG 0x10000
CONTEXT childContext;
childContext.ContextFlags = CONTEXT_FULL;
if (GetThreadContext(hThread, &childContext))
{
childContext.EFlags |= RESUME_FLAG;
SetThreadContext(hThread, &childContext);
std::cout << "current HP: " << childContext.Ecx << std::endl;
currentHpPointerAddress = (DWORD*)((char *)childContext.Edi + 0x8E0);
maxHpPointerAddress = (DWORD*)((char *)childContext.Edi + 0x8E4);
}
if (GetThreadContext(hThread, &parentCtx))
{
parentCtx.Dr0 = 0;
parentCtx.Dr7 = 0x400;
SetThreadContext(hThread, &parentCtx);
bQuit = TRUE;
}
}
else
dbgFlag = DBG_EXCEPTION_NOT_HANDLED;
break;
default:
dbgFlag = DBG_EXCEPTION_NOT_HANDLED;
}
break;
case LOAD_DLL_DEBUG_EVENT:
{
CloseHandle(DebugEvent.u.LoadDll.hFile);
break;
}
case CREATE_PROCESS_DEBUG_EVENT:
{
CloseHandle(DebugEvent.u.CreateProcessInfo.hFile);
break;
}
case EXIT_PROCESS_DEBUG_EVENT:
break;
default:
__nop();
}
if (!ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, dbgFlag))
{
break;
}
if (bQuit)
DebugActiveProcessStop(dwProcessID);
}
while (1)
{
WORD currentHP = 0;
WORD maxHP = 0;
if (
ReadProcessMemory(hProcess, currentHpPointerAddress, ¤tHP, sizeof(currentHP), NULL) == 0
|| ReadProcessMemory(hProcess, maxHpPointerAddress, &maxHP, sizeof(maxHP), NULL) == 0
)
{
printf("Failed to read memory: %u\n", GetLastError());
}
else {
std::cout << "HP: " << currentHP << "/" << maxHP << std::endl;
}
Sleep(1000);
}
system("pause>nul");
return 0;
}
私はそれを実行すると、ブレークポイントが発生するまで、ゲームが正常に動作し、ときそれは、私は無限の "ブレークポイント"傷のスパムを取得し、私はそれをデバッグするとき、この行: if(DebugEvent.u.Exception.ExceptionRecord.ExceptionAddress ==(void *)hpChangeBreakpoint)
は常にtrueですが、dwFirstChanceフラグは1なので、常に新しい例外ですか?この無限ループで変化するのはhThreadだけですが、常に異なっています。私は知識の欠如のために何かを見逃しているように感じるので、正しい方向への助けやヒントを感謝するでしょう。ありがとうございました!
「バック被験者に行くには、無限ループは、まだここでアイブは、RFフラグを追加しました。」 - しかしあなたは "SetThreadContext"を呼び出さない!単純に 'CONTEXT Context'を初期化するのはどういう意味ですか?" SetThreadContext "を呼び出さずに、この問題を最初に解決してください。あなたはXPの下で実行されていない場合。 "SuspendThread' /' ResumeThread'を呼び出す必要はありません。 "メモリを変更しても、それらは必要ありません。 " - はい、必要はありません – RbMm
ああ私の犬、とても明白:)私はそれに乗ってみましょう、あなたを知らせる!ありがとうalb RbMm! – MTM
それは仲間を通り抜けているように見えます! :) ありがとうございました!あなたには別の問題があります。この例外を渡した後、EXCEPTION_ACCESS_VIOLATIONがあります。もしそれを処理しなければ、2回目にアプリケーションをクラッシュさせてください。私がやっていることに関連することができますか? – MTM