diff --git a/SDK/C/TitanEngine.h b/SDK/C/TitanEngine.h index 9368d7d..9cdc845 100644 --- a/SDK/C/TitanEngine.h +++ b/SDK/C/TitanEngine.h @@ -706,6 +706,7 @@ __declspec(dllexport) void TITCALL SetCustomHandler(DWORD ExceptionId, LPVOID Ca __declspec(dllexport) void TITCALL ForceClose(); __declspec(dllexport) void TITCALL StepInto(LPVOID traceCallBack); __declspec(dllexport) void TITCALL StepOver(LPVOID traceCallBack); +__declspec(dllexport) void TITCALL StepOut(LPVOID StepOut, bool StepFinal); __declspec(dllexport) void TITCALL SingleStep(DWORD StepCount, LPVOID StepCallBack); __declspec(dllexport) bool TITCALL GetUnusedHardwareBreakPointRegister(LPDWORD RegisterIndex); __declspec(dllexport) bool TITCALL SetHardwareBreakPointEx(HANDLE hActiveThread, ULONG_PTR bpxAddress, DWORD IndexOfRegister, DWORD bpxType, DWORD bpxSize, LPVOID bpxCallBack, LPDWORD IndexOfSelectedRegister); diff --git a/SDK/CPP/TitanEngine.h b/SDK/CPP/TitanEngine.h index 54657ef..d83d299 100644 --- a/SDK/CPP/TitanEngine.h +++ b/SDK/CPP/TitanEngine.h @@ -705,6 +705,7 @@ __declspec(dllimport) void TITCALL SetCustomHandler(DWORD ExceptionId, LPVOID Ca __declspec(dllimport) void TITCALL ForceClose(); __declspec(dllimport) void TITCALL StepInto(LPVOID traceCallBack); __declspec(dllimport) void TITCALL StepOver(LPVOID traceCallBack); +__declspec(dllexport) void TITCALL StepOut(LPVOID StepOut, bool StepFinal); __declspec(dllimport) void TITCALL SingleStep(DWORD StepCount, LPVOID StepCallBack); __declspec(dllimport) bool TITCALL GetUnusedHardwareBreakPointRegister(LPDWORD RegisterIndex); __declspec(dllimport) bool TITCALL SetHardwareBreakPointEx(HANDLE hActiveThread, ULONG_PTR bpxAddress, DWORD IndexOfRegister, DWORD bpxType, DWORD bpxSize, LPVOID bpxCallBack, LPDWORD IndexOfSelectedRegister); diff --git a/SDK/CPP/TitanEngine.hpp b/SDK/CPP/TitanEngine.hpp index 5dae21d..fef1760 100644 --- a/SDK/CPP/TitanEngine.hpp +++ b/SDK/CPP/TitanEngine.hpp @@ -1384,6 +1384,10 @@ protected: { UE::StepOver((void*)traceCallBack); } + static void StepOut(fBreakPointCallback StepOutCallBack) + { + UE::StepOut((void*)StepOutCallBack); + } static void SingleStep(DWORD StepCount, fBreakPointCallback StepCallBack) { UE::SingleStep(StepCount, (void*)StepCallBack); @@ -1565,6 +1569,7 @@ public: using DebuggerX::ForceClose; using DebuggerX::StepInto; using DebuggerX::StepOver; + using DebuggerX::StepOut; using DebuggerX::SingleStep; using DebuggerX::GetUnusedHardwareBreakPointRegister; using DebuggerX::SetHardwareBreakPointEx; diff --git a/TitanEngine/Global.Debugger.cpp b/TitanEngine/Global.Debugger.cpp index 49073cf..ba020ad 100644 --- a/TitanEngine/Global.Debugger.cpp +++ b/TitanEngine/Global.Debugger.cpp @@ -36,6 +36,8 @@ bool engineFileIsBeingDebugged = false; ULONG_PTR engineFakeDLLHandle = NULL; LPVOID engineAttachedProcessDebugInfo = NULL; wchar_t szDebuggerName[512]; +bool DebugStepFinal = false; +LPVOID StepOutCallBack = NULL; // Global.Debugger.functions: long DebugLoopInSecondThread(LPVOID InputParameter) @@ -71,3 +73,27 @@ void ClearProcessList() { std::vector().swap(hListProcess); } + +void StepOutStepCallBack() +{ + BYTE cipch = 0x90; + MemoryReadSafe(dbgProcessInformation.hProcess, (void*)GetContextData(UE_CIP), &cipch, sizeof(cipch), 0); + if(cipch == 0xC3 || cipch == 0xC2) //ret + { + if(DebugStepFinal) + StepOver(StepOutCallBack); + else + { + typedef void(TITCALL *fCustomBreakPoint)(); + __try + { + ((fCustomBreakPoint)StepOutCallBack)(); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + } + } + } + else + StepOver(StepOutStepCallBack); +} diff --git a/TitanEngine/TitanEngine.Debugger.Control.cpp b/TitanEngine/TitanEngine.Debugger.Control.cpp index 448c34f..3f24c6e 100644 --- a/TitanEngine/TitanEngine.Debugger.Control.cpp +++ b/TitanEngine/TitanEngine.Debugger.Control.cpp @@ -79,6 +79,13 @@ __declspec(dllexport) void TITCALL StepOver(LPVOID StepCallBack) StepInto(StepCallBack); } +__declspec(dllexport) void TITCALL StepOut(LPVOID StepOut, bool StepFinal) +{ + DebugStepFinal = StepFinal; + StepOutCallBack = StepOut; + StepOver(StepOutStepCallBack); +} + __declspec(dllexport) void TITCALL SingleStep(DWORD StepCount, LPVOID StepCallBack) { diff --git a/TitanEngine/definitions.h b/TitanEngine/definitions.h index 4dbf099..3b868df 100644 --- a/TitanEngine/definitions.h +++ b/TitanEngine/definitions.h @@ -211,6 +211,7 @@ __declspec(dllexport) void TITCALL SetCustomHandler(DWORD ExceptionId, LPVOID Ca __declspec(dllexport) void TITCALL ForceClose(); __declspec(dllexport) void TITCALL StepInto(LPVOID traceCallBack); __declspec(dllexport) void TITCALL StepOver(LPVOID traceCallBack); +__declspec(dllexport) void TITCALL StepOut(LPVOID StepOut, bool StepFinal); __declspec(dllexport) void TITCALL SingleStep(DWORD StepCount, LPVOID StepCallBack); __declspec(dllexport) bool TITCALL GetUnusedHardwareBreakPointRegister(LPDWORD RegisterIndex); __declspec(dllexport) bool TITCALL SetHardwareBreakPointEx(HANDLE hActiveThread, ULONG_PTR bpxAddress, DWORD IndexOfRegister, DWORD bpxType, DWORD bpxSize, LPVOID bpxCallBack, LPDWORD IndexOfSelectedRegister);