mirror of https://github.com/x64dbg/TitanEngine
enable debug privilege when calling OpenThread too (closes pull request #11)
This commit is contained in:
parent
fd47444406
commit
c4e6afbd93
|
|
@ -1013,6 +1013,7 @@ __declspec(dllexport) long TITCALL GetActiveProcessId(const char* szImageName);
|
||||||
__declspec(dllexport) long TITCALL GetActiveProcessIdW(const wchar_t* szImageName);
|
__declspec(dllexport) long TITCALL GetActiveProcessIdW(const wchar_t* szImageName);
|
||||||
__declspec(dllexport) void TITCALL EnumProcessesWithLibrary(const char* szLibraryName, void* EnumFunction);
|
__declspec(dllexport) void TITCALL EnumProcessesWithLibrary(const char* szLibraryName, void* EnumFunction);
|
||||||
__declspec(dllexport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
__declspec(dllexport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
||||||
|
__declspec(dllexport) HANDLE TITCALL TitanOpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId);
|
||||||
// TitanEngine.TLSFixer.functions:
|
// TitanEngine.TLSFixer.functions:
|
||||||
__declspec(dllexport) bool TITCALL TLSBreakOnCallBack(LPVOID ArrayOfCallBacks, DWORD NumberOfCallBacks, LPVOID bpxCallBack);
|
__declspec(dllexport) bool TITCALL TLSBreakOnCallBack(LPVOID ArrayOfCallBacks, DWORD NumberOfCallBacks, LPVOID bpxCallBack);
|
||||||
__declspec(dllexport) bool TITCALL TLSGrabCallBackData(const char* szFileName, LPVOID ArrayOfCallBacks, LPDWORD NumberOfCallBacks);
|
__declspec(dllexport) bool TITCALL TLSGrabCallBackData(const char* szFileName, LPVOID ArrayOfCallBacks, LPDWORD NumberOfCallBacks);
|
||||||
|
|
|
||||||
|
|
@ -862,6 +862,7 @@ __declspec(dllimport) long TITCALL GetActiveProcessId(char* szImageName);
|
||||||
__declspec(dllimport) long TITCALL GetActiveProcessIdW(wchar_t* szImageName);
|
__declspec(dllimport) long TITCALL GetActiveProcessIdW(wchar_t* szImageName);
|
||||||
__declspec(dllimport) void TITCALL EnumProcessesWithLibrary(char* szLibraryName, void* EnumFunction);
|
__declspec(dllimport) void TITCALL EnumProcessesWithLibrary(char* szLibraryName, void* EnumFunction);
|
||||||
__declspec(dllimport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
__declspec(dllimport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
||||||
|
__declspec(dllexport) HANDLE TITCALL TitanOpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId);
|
||||||
// TitanEngine.TLSFixer.functions:
|
// TitanEngine.TLSFixer.functions:
|
||||||
__declspec(dllimport) bool TITCALL TLSBreakOnCallBack(LPVOID ArrayOfCallBacks, DWORD NumberOfCallBacks, LPVOID bpxCallBack);
|
__declspec(dllimport) bool TITCALL TLSBreakOnCallBack(LPVOID ArrayOfCallBacks, DWORD NumberOfCallBacks, LPVOID bpxCallBack);
|
||||||
__declspec(dllimport) bool TITCALL TLSGrabCallBackData(char* szFileName, LPVOID ArrayOfCallBacks, LPDWORD NumberOfCallBacks);
|
__declspec(dllimport) bool TITCALL TLSGrabCallBackData(char* szFileName, LPVOID ArrayOfCallBacks, LPDWORD NumberOfCallBacks);
|
||||||
|
|
|
||||||
|
|
@ -1164,6 +1164,10 @@ public:
|
||||||
{
|
{
|
||||||
return UE::ThreaderIsExceptionInMainThread();
|
return UE::ThreaderIsExceptionInMainThread();
|
||||||
}
|
}
|
||||||
|
static HANDLE OpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId)
|
||||||
|
{
|
||||||
|
return UE::TitanOpenThread(dwDesiredAccess, bInheritHandle, dwThreadId);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// --
|
// --
|
||||||
|
|
|
||||||
|
|
@ -2066,3 +2066,15 @@ HANDLE EngineOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwPro
|
||||||
SetLastError(dwLastError);
|
SetLastError(dwLastError);
|
||||||
return hProcess;
|
return hProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HANDLE EngineOpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId)
|
||||||
|
{
|
||||||
|
if(engineEnableDebugPrivilege)
|
||||||
|
EngineSetDebugPrivilege(GetCurrentProcess(), true);
|
||||||
|
HANDLE hThread = OpenThread(dwDesiredAccess, bInheritHandle, dwThreadId);
|
||||||
|
DWORD dwLastError = GetLastError();
|
||||||
|
if(engineEnableDebugPrivilege)
|
||||||
|
EngineSetDebugPrivilege(GetCurrentProcess(), false);
|
||||||
|
SetLastError(dwLastError);
|
||||||
|
return hThread;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,5 +54,6 @@ bool EngineGetLibraryOrdinalData(ULONG_PTR ModuleBase, LPDWORD ptrOrdinalBase, L
|
||||||
ULONG_PTR EngineGlobalAPIHandler(HANDLE handleProcess, ULONG_PTR EnumedModulesBases, ULONG_PTR APIAddress, const char* szAPIName, DWORD ReturnType);
|
ULONG_PTR EngineGlobalAPIHandler(HANDLE handleProcess, ULONG_PTR EnumedModulesBases, ULONG_PTR APIAddress, const char* szAPIName, DWORD ReturnType);
|
||||||
DWORD EngineSetDebugPrivilege(HANDLE hProcess, bool bEnablePrivilege);
|
DWORD EngineSetDebugPrivilege(HANDLE hProcess, bool bEnablePrivilege);
|
||||||
HANDLE EngineOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
HANDLE EngineOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
||||||
|
HANDLE EngineOpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId);
|
||||||
|
|
||||||
#endif //_GLOBAL_ENGINE_H
|
#endif //_GLOBAL_ENGINE_H
|
||||||
|
|
@ -349,7 +349,7 @@ __declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, D
|
||||||
|
|
||||||
__declspec(dllexport) ULONG_PTR TITCALL GetContextData(DWORD IndexOfRegister)
|
__declspec(dllexport) ULONG_PTR TITCALL GetContextData(DWORD IndexOfRegister)
|
||||||
{
|
{
|
||||||
HANDLE hActiveThread = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT, false, DBGEvent.dwThreadId);
|
HANDLE hActiveThread = EngineOpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT, false, DBGEvent.dwThreadId);
|
||||||
ULONG_PTR ContextReturn = GetContextDataEx(hActiveThread, IndexOfRegister);
|
ULONG_PTR ContextReturn = GetContextDataEx(hActiveThread, IndexOfRegister);
|
||||||
EngineCloseHandle(hActiveThread);
|
EngineCloseHandle(hActiveThread);
|
||||||
return ContextReturn;
|
return ContextReturn;
|
||||||
|
|
@ -918,7 +918,7 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD
|
||||||
|
|
||||||
__declspec(dllexport) bool TITCALL SetContextData(DWORD IndexOfRegister, ULONG_PTR NewRegisterValue)
|
__declspec(dllexport) bool TITCALL SetContextData(DWORD IndexOfRegister, ULONG_PTR NewRegisterValue)
|
||||||
{
|
{
|
||||||
HANDLE hActiveThread = OpenThread(THREAD_SUSPEND_RESUME | THREAD_SET_CONTEXT | THREAD_GET_CONTEXT, false, DBGEvent.dwThreadId);
|
HANDLE hActiveThread = EngineOpenThread(THREAD_SUSPEND_RESUME | THREAD_SET_CONTEXT | THREAD_GET_CONTEXT, false, DBGEvent.dwThreadId);
|
||||||
bool ContextReturn = SetContextDataEx(hActiveThread, IndexOfRegister, NewRegisterValue);
|
bool ContextReturn = SetContextDataEx(hActiveThread, IndexOfRegister, NewRegisterValue);
|
||||||
EngineCloseHandle(hActiveThread);
|
EngineCloseHandle(hActiveThread);
|
||||||
return ContextReturn;
|
return ContextReturn;
|
||||||
|
|
|
||||||
|
|
@ -453,7 +453,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
{
|
{
|
||||||
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
hActiveThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, DBGEvent.dwThreadId);
|
||||||
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
if(FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
if(FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
||||||
|
|
@ -583,7 +583,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hActiveThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_QUERY_INFORMATION, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_QUERY_INFORMATION, false, DBGEvent.dwThreadId);
|
||||||
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
|
@ -636,7 +636,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
else //no resetting needed (debugger reached hardware breakpoint or the user stepped)
|
else //no resetting needed (debugger reached hardware breakpoint or the user stepped)
|
||||||
{
|
{
|
||||||
//handle hardware breakpoints
|
//handle hardware breakpoints
|
||||||
hActiveThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, DBGEvent.dwThreadId);
|
||||||
myDBGContext.ContextFlags = CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL;
|
myDBGContext.ContextFlags = CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
if((ULONG_PTR)DBGEvent.u.Exception.ExceptionRecord.ExceptionAddress == myDBGContext.Dr0 || (myDBGContext.Dr6 & 0x1))
|
if((ULONG_PTR)DBGEvent.u.Exception.ExceptionRecord.ExceptionAddress == myDBGContext.Dr0 || (myDBGContext.Dr6 & 0x1))
|
||||||
|
|
@ -816,7 +816,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
}
|
}
|
||||||
if(bFoundBreakPoint) //found memory breakpoint
|
if(bFoundBreakPoint) //found memory breakpoint
|
||||||
{
|
{
|
||||||
hActiveThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, DBGEvent.dwThreadId);
|
||||||
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
DBGCode = DBG_CONTINUE; //debugger handled the exception
|
DBGCode = DBG_CONTINUE; //debugger handled the exception
|
||||||
|
|
@ -990,7 +990,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
{
|
{
|
||||||
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
hActiveThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_QUERY_INFORMATION, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_QUERY_INFORMATION, false, DBGEvent.dwThreadId);
|
||||||
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
if(FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
if(FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
||||||
|
|
|
||||||
|
|
@ -295,7 +295,7 @@ __declspec(dllexport) bool TITCALL DetachDebuggerEx(DWORD ProcessId)
|
||||||
int threadcount = (int)hListThread.size();
|
int threadcount = (int)hListThread.size();
|
||||||
for(int i = 0; i < threadcount; i++)
|
for(int i = 0; i < threadcount; i++)
|
||||||
{
|
{
|
||||||
HANDLE hActiveThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, hListThread.at(i).dwThreadId);
|
HANDLE hActiveThread = EngineOpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, false, hListThread.at(i).dwThreadId);
|
||||||
CONTEXT myDBGContext;
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
myDBGContext.ContextFlags = CONTEXT_CONTROL;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
|
|
||||||
|
|
@ -136,3 +136,8 @@ __declspec(dllexport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, boo
|
||||||
{
|
{
|
||||||
return EngineOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
|
return EngineOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__declspec(dllexport) HANDLE TITCALL TitanOpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId)
|
||||||
|
{
|
||||||
|
return EngineOpenThread(dwDesiredAccess, bInheritHandle, dwThreadId);
|
||||||
|
}
|
||||||
|
|
@ -112,7 +112,7 @@ __declspec(dllexport) bool TITCALL ThreaderImportRunningThreadData(DWORD Process
|
||||||
NewThreadData.WaitTime = pIterThread->WaitTime;
|
NewThreadData.WaitTime = pIterThread->WaitTime;
|
||||||
NewThreadData.dwThreadId = (DWORD)pIterThread->ClientId.UniqueThread;
|
NewThreadData.dwThreadId = (DWORD)pIterThread->ClientId.UniqueThread;
|
||||||
|
|
||||||
NewThreadData.hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, NewThreadData.dwThreadId);
|
NewThreadData.hThread = EngineOpenThread(THREAD_ALL_ACCESS, FALSE, NewThreadData.dwThreadId);
|
||||||
if(NewThreadData.hThread)
|
if(NewThreadData.hThread)
|
||||||
{
|
{
|
||||||
NewThreadData.TebAddress = GetTEBLocation(NewThreadData.hThread);
|
NewThreadData.TebAddress = GetTEBLocation(NewThreadData.hThread);
|
||||||
|
|
|
||||||
|
|
@ -350,6 +350,7 @@ __declspec(dllexport) long TITCALL GetActiveProcessId(char* szImageName);
|
||||||
__declspec(dllexport) long TITCALL GetActiveProcessIdW(wchar_t* szImageName);
|
__declspec(dllexport) long TITCALL GetActiveProcessIdW(wchar_t* szImageName);
|
||||||
__declspec(dllexport) void TITCALL EnumProcessesWithLibrary(char* szLibraryName, void* EnumFunction);
|
__declspec(dllexport) void TITCALL EnumProcessesWithLibrary(char* szLibraryName, void* EnumFunction);
|
||||||
__declspec(dllexport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
__declspec(dllexport) HANDLE TITCALL TitanOpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
|
||||||
|
__declspec(dllexport) HANDLE TITCALL TitanOpenThread(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwThreadId);
|
||||||
// TitanEngine.TLSFixer.functions:
|
// TitanEngine.TLSFixer.functions:
|
||||||
__declspec(dllexport) bool TITCALL TLSBreakOnCallBack(LPVOID ArrayOfCallBacks, DWORD NumberOfCallBacks, LPVOID bpxCallBack);
|
__declspec(dllexport) bool TITCALL TLSBreakOnCallBack(LPVOID ArrayOfCallBacks, DWORD NumberOfCallBacks, LPVOID bpxCallBack);
|
||||||
__declspec(dllexport) bool TITCALL TLSGrabCallBackData(char* szFileName, LPVOID ArrayOfCallBacks, LPDWORD NumberOfCallBacks);
|
__declspec(dllexport) bool TITCALL TLSGrabCallBackData(char* szFileName, LPVOID ArrayOfCallBacks, LPDWORD NumberOfCallBacks);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue