From c541b9d764b1171d46929b6f74c1b15ce3c31695 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 8 Dec 2014 23:37:59 +0100 Subject: [PATCH] resolved issue #44 (by removing the push ss, pop ss 'fix') + fixed SingleStep --- TitanEngine/Global.Debugger.cpp | 2 +- TitanEngine/Global.Debugger.h | 2 +- TitanEngine/TitanEngine.Debugger.Control.cpp | 34 ++++++------------- .../TitanEngine.Debugger.DebugLoop.cpp | 8 ++--- 4 files changed, 16 insertions(+), 30 deletions(-) diff --git a/TitanEngine/Global.Debugger.cpp b/TitanEngine/Global.Debugger.cpp index b5c7dc8..58a26df 100644 --- a/TitanEngine/Global.Debugger.cpp +++ b/TitanEngine/Global.Debugger.cpp @@ -30,7 +30,7 @@ DWORD ProcessExitCode = 0; HANDLE DBGFileHandle; std::vector tlsCallBackList; std::vector hListProcess; -int engineStepCount = INFINITE; +DWORD engineStepCount = 0; LPVOID engineStepCallBack = NULL; bool engineStepActive = false; bool engineProcessIsNowDetached = false; diff --git a/TitanEngine/Global.Debugger.h b/TitanEngine/Global.Debugger.h index 93da947..99bf8a0 100644 --- a/TitanEngine/Global.Debugger.h +++ b/TitanEngine/Global.Debugger.h @@ -29,7 +29,7 @@ extern DWORD ProcessExitCode; extern HANDLE DBGFileHandle; extern std::vector tlsCallBackList; extern std::vector hListProcess; -extern int engineStepCount; +extern DWORD engineStepCount; extern LPVOID engineStepCallBack; extern bool engineStepActive; extern bool engineProcessIsNowDetached; diff --git a/TitanEngine/TitanEngine.Debugger.Control.cpp b/TitanEngine/TitanEngine.Debugger.Control.cpp index cc34bd3..906ac99 100644 --- a/TitanEngine/TitanEngine.Debugger.Control.cpp +++ b/TitanEngine/TitanEngine.Debugger.Control.cpp @@ -50,27 +50,20 @@ __declspec(dllexport) void TITCALL ForceClose() __declspec(dllexport) void TITCALL StepInto(LPVOID StepCallBack) { ULONG_PTR ueCurrentPosition = GetContextData(UE_CIP); - unsigned char instr[32]; //two instructions + unsigned char instr[16]; MemoryReadSafe(dbgProcessInformation.hProcess, (void*)ueCurrentPosition, instr, sizeof(instr), 0); char* DisassembledString = (char*)StaticDisassembleEx(ueCurrentPosition, (LPVOID)instr); if(strstr(DisassembledString, "PUSHF")) StepOver(StepCallBack); else { - int len = StaticLengthDisassemble((LPVOID)instr); - DisassembledString = (char*)StaticDisassembleEx(ueCurrentPosition + len, (LPVOID)(instr + len)); - if(strstr(DisassembledString, "PUSHF")) //we wanna land on PUSHF safely (to prevent 'PUSH SS, POP SS' problems - SetBPX(ueCurrentPosition + len, UE_BREAKPOINT_TYPE_INT3 + UE_SINGLESHOOT, StepCallBack); - else - { - ULONG_PTR ueContext = NULL; - ueContext = (ULONG_PTR)GetContextData(UE_EFLAGS); - ueContext |= UE_TRAP_FLAG; - SetContextData(UE_EFLAGS, ueContext); - engineStepActive = true; - engineStepCallBack = StepCallBack; - engineStepCount = NULL; - } + ULONG_PTR ueContext = NULL; + ueContext = (ULONG_PTR)GetContextData(UE_EFLAGS); + ueContext |= UE_TRAP_FLAG; + SetContextData(UE_EFLAGS, ueContext); + engineStepActive = true; + engineStepCallBack = StepCallBack; + engineStepCount = 0; } } @@ -98,15 +91,8 @@ __declspec(dllexport) void TITCALL StepOut(LPVOID StepOut, bool StepFinal) __declspec(dllexport) void TITCALL SingleStep(DWORD StepCount, LPVOID StepCallBack) { - ULONG_PTR ueContext = NULL; - - ueContext = (ULONG_PTR)GetContextData(UE_EFLAGS); - ueContext |= UE_TRAP_FLAG; - SetContextData(UE_EFLAGS, ueContext); - engineStepActive = true; - engineStepCount = (int)StepCount; - engineStepCallBack = StepCallBack; - engineStepCount--; + StepInto(StepCallBack); + engineStepCount = StepCount - 1; //We already stepped once } __declspec(dllexport) void TITCALL SetNextDbgContinueStatus(DWORD SetDbgCode) diff --git a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp index 0363f46..2d85a66 100644 --- a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp +++ b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp @@ -681,7 +681,7 @@ __declspec(dllexport) void TITCALL DebugLoop() ResetBPX = false; if(engineStepActive) { - if(engineStepCount == NULL) + if(engineStepCount == 0) { myCustomBreakPoint = (fCustomBreakPoint)(engineStepCallBack); __try @@ -717,7 +717,7 @@ __declspec(dllexport) void TITCALL DebugLoop() SetHardwareBreakPoint(DebugRegisterX.DrxBreakAddress, DebugRegisterXId, DebugRegisterX.DrxBreakPointType, DebugRegisterX.DrxBreakPointSize, (LPVOID)DebugRegisterX.DrxCallBack); if(engineStepActive) { - if(engineStepCount == NULL) + if(engineStepCount == 0) { myCustomBreakPoint = (fCustomBreakPoint)(engineStepCallBack); __try @@ -746,7 +746,7 @@ __declspec(dllexport) void TITCALL DebugLoop() VirtualProtectEx(dbgProcessInformation.hProcess, (LPVOID)ResetMemBPXAddress, ResetMemBPXSize, NewProtect, &OldProtect); if(engineStepActive) { - if(engineStepCount == NULL) + if(engineStepCount == 0) { myCustomBreakPoint = (fCustomBreakPoint)(engineStepCallBack); __try @@ -898,7 +898,7 @@ __declspec(dllexport) void TITCALL DebugLoop() if(engineStepActive) { DBGCode = DBG_CONTINUE; - if(engineStepCount == NULL) + if(engineStepCount == 0) { myCustomBreakPoint = (fCustomBreakPoint)(engineStepCallBack); __try