mirror of https://github.com/x64dbg/TitanEngine
resolved issue #39 (hardware breakpoints on all threads)
This commit is contained in:
parent
d777ee3590
commit
dfbf4a48c5
|
|
@ -5,6 +5,7 @@
|
||||||
#include "Global.Engine.h"
|
#include "Global.Engine.h"
|
||||||
#include "Global.Engine.Threading.h"
|
#include "Global.Engine.Threading.h"
|
||||||
#include "Global.Engine.Importer.h"
|
#include "Global.Engine.Importer.h"
|
||||||
|
#include "Global.Threader.h"
|
||||||
|
|
||||||
static long engineDefaultBreakPointType = UE_BREAKPOINT_INT3;
|
static long engineDefaultBreakPointType = UE_BREAKPOINT_INT3;
|
||||||
static BYTE UD2BreakPoint[2] = {0x0F, 0x0B};
|
static BYTE UD2BreakPoint[2] = {0x0F, 0x0B};
|
||||||
|
|
@ -605,8 +606,11 @@ __declspec(dllexport) bool TITCALL SetHardwareBreakPoint(ULONG_PTR bpxAddress, D
|
||||||
dr7.HWBP_SIZE[hwbpIndex]=hwbpSize;
|
dr7.HWBP_SIZE[hwbpIndex]=hwbpSize;
|
||||||
dr7.HWBP_TYPE[hwbpIndex]=hwbpType;
|
dr7.HWBP_TYPE[hwbpIndex]=hwbpType;
|
||||||
|
|
||||||
SetContextData(UE_DR7, dr7uint(&dr7)); //NOTE: MUST SET THIS FIRST FOR X64!
|
for(int i=0; i<hListThread.size(); i++)
|
||||||
SetContextData(IndexOfRegister, (ULONG_PTR)bpxAddress);
|
{
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR7, dr7uint(&dr7)); //NOTE: MUST SET THIS FIRST FOR X64!
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, IndexOfRegister, bpxAddress);
|
||||||
|
}
|
||||||
|
|
||||||
DebugRegister[hwbpIndex].DrxBreakPointType=bpxType;
|
DebugRegister[hwbpIndex].DrxBreakPointType=bpxType;
|
||||||
DebugRegister[hwbpIndex].DrxBreakPointSize=bpxSize;
|
DebugRegister[hwbpIndex].DrxBreakPointSize=bpxSize;
|
||||||
|
|
@ -733,8 +737,11 @@ __declspec(dllexport) bool TITCALL DeleteHardwareBreakPoint(DWORD IndexOfRegiste
|
||||||
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 0);
|
HardwareBPX = HardwareBPX &~ (1 << 0);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 1);
|
HardwareBPX = HardwareBPX &~ (1 << 1);
|
||||||
SetContextData(UE_DR0, (ULONG_PTR)bpxAddress);
|
for(int i=0; i<hListThread.size(); i++)
|
||||||
SetContextData(UE_DR7, HardwareBPX);
|
{
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR0, bpxAddress);
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR7, HardwareBPX);
|
||||||
|
}
|
||||||
DebugRegister[0].DrxEnabled = false;
|
DebugRegister[0].DrxEnabled = false;
|
||||||
DebugRegister[0].DrxBreakAddress = NULL;
|
DebugRegister[0].DrxBreakAddress = NULL;
|
||||||
DebugRegister[0].DrxCallBack = NULL;
|
DebugRegister[0].DrxCallBack = NULL;
|
||||||
|
|
@ -745,8 +752,11 @@ __declspec(dllexport) bool TITCALL DeleteHardwareBreakPoint(DWORD IndexOfRegiste
|
||||||
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 2);
|
HardwareBPX = HardwareBPX &~ (1 << 2);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 3);
|
HardwareBPX = HardwareBPX &~ (1 << 3);
|
||||||
SetContextData(UE_DR1, (ULONG_PTR)bpxAddress);
|
for(int i=0; i<hListThread.size(); i++)
|
||||||
SetContextData(UE_DR7, HardwareBPX);
|
{
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR1, bpxAddress);
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR7, HardwareBPX);
|
||||||
|
}
|
||||||
DebugRegister[1].DrxEnabled = false;
|
DebugRegister[1].DrxEnabled = false;
|
||||||
DebugRegister[1].DrxBreakAddress = NULL;
|
DebugRegister[1].DrxBreakAddress = NULL;
|
||||||
DebugRegister[1].DrxCallBack = NULL;
|
DebugRegister[1].DrxCallBack = NULL;
|
||||||
|
|
@ -757,8 +767,11 @@ __declspec(dllexport) bool TITCALL DeleteHardwareBreakPoint(DWORD IndexOfRegiste
|
||||||
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 4);
|
HardwareBPX = HardwareBPX &~ (1 << 4);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 5);
|
HardwareBPX = HardwareBPX &~ (1 << 5);
|
||||||
SetContextData(UE_DR2, (ULONG_PTR)bpxAddress);
|
for(int i=0; i<hListThread.size(); i++)
|
||||||
SetContextData(UE_DR7, HardwareBPX);
|
{
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR2, bpxAddress);
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR7, HardwareBPX);
|
||||||
|
}
|
||||||
DebugRegister[2].DrxEnabled = false;
|
DebugRegister[2].DrxEnabled = false;
|
||||||
DebugRegister[2].DrxBreakAddress = NULL;
|
DebugRegister[2].DrxBreakAddress = NULL;
|
||||||
DebugRegister[2].DrxCallBack = NULL;
|
DebugRegister[2].DrxCallBack = NULL;
|
||||||
|
|
@ -769,8 +782,11 @@ __declspec(dllexport) bool TITCALL DeleteHardwareBreakPoint(DWORD IndexOfRegiste
|
||||||
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
HardwareBPX = (ULONG_PTR)GetContextData(UE_DR7);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 6);
|
HardwareBPX = HardwareBPX &~ (1 << 6);
|
||||||
HardwareBPX = HardwareBPX &~ (1 << 7);
|
HardwareBPX = HardwareBPX &~ (1 << 7);
|
||||||
SetContextData(UE_DR3, (ULONG_PTR)bpxAddress);
|
for(int i=0; i<hListThread.size(); i++)
|
||||||
SetContextData(UE_DR7, HardwareBPX);
|
{
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR3, bpxAddress);
|
||||||
|
SetContextDataEx(hListThread.at(i).hThread, UE_DR7, HardwareBPX);
|
||||||
|
}
|
||||||
DebugRegister[3].DrxEnabled = false;
|
DebugRegister[3].DrxEnabled = false;
|
||||||
DebugRegister[3].DrxBreakAddress = NULL;
|
DebugRegister[3].DrxBreakAddress = NULL;
|
||||||
DebugRegister[3].DrxCallBack = NULL;
|
DebugRegister[3].DrxCallBack = NULL;
|
||||||
|
|
|
||||||
|
|
@ -222,6 +222,22 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
NewThreadData.ThreadLocalBase = (void*)DBGEvent.u.CreateThread.lpThreadLocalBase;
|
NewThreadData.ThreadLocalBase = (void*)DBGEvent.u.CreateThread.lpThreadLocalBase;
|
||||||
hListThread.push_back(NewThreadData);
|
hListThread.push_back(NewThreadData);
|
||||||
|
|
||||||
|
//Set hardware breakpoints to all threads
|
||||||
|
HANDLE hThread = NewThreadData.hThread;
|
||||||
|
if(DebugRegister[0].DrxEnabled)
|
||||||
|
SetHardwareBreakPointEx(hThread, DebugRegister[0].DrxBreakAddress, UE_DR0, DebugRegister[0].DrxBreakPointType, DebugRegister[0].DrxBreakPointSize, (void*)DebugRegister[0].DrxCallBack, 0);
|
||||||
|
if(DebugRegister[1].DrxEnabled)
|
||||||
|
SetHardwareBreakPointEx(hThread, DebugRegister[1].DrxBreakAddress, UE_DR1, DebugRegister[1].DrxBreakPointType, DebugRegister[1].DrxBreakPointSize, (void*)DebugRegister[1].DrxCallBack, 0);
|
||||||
|
if(DebugRegister[2].DrxEnabled)
|
||||||
|
SetHardwareBreakPointEx(hThread, DebugRegister[2].DrxBreakAddress, UE_DR2, DebugRegister[2].DrxBreakPointType, DebugRegister[2].DrxBreakPointSize, (void*)DebugRegister[2].DrxCallBack, 0);
|
||||||
|
if(DebugRegister[3].DrxEnabled)
|
||||||
|
SetHardwareBreakPointEx(hThread, DebugRegister[3].DrxBreakAddress, UE_DR3, DebugRegister[3].DrxBreakPointType, DebugRegister[3].DrxBreakPointSize, (void*)DebugRegister[3].DrxCallBack, 0);
|
||||||
|
if(ResetHwBPX)
|
||||||
|
{
|
||||||
|
SetHardwareBreakPoint(DebugRegisterX.DrxBreakAddress, DebugRegisterXId, DebugRegisterX.DrxBreakPointType, DebugRegisterX.DrxBreakPointSize, (void*)DebugRegisterX.DrxCallBack);
|
||||||
|
ResetHwBPX=false;
|
||||||
|
}
|
||||||
|
|
||||||
//custom handler
|
//custom handler
|
||||||
if(DBGCustomHandler->chCreateThread != NULL)
|
if(DBGCustomHandler->chCreateThread != NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -1381,6 +1397,8 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if(!ThreaderGetThreadInfo(0, DBGEvent.dwThreadId)) //switch thread
|
||||||
|
DBGEvent.dwThreadId=dbgProcessInformation.dwThreadId;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!SecondChance) //debugger didn't close with a second chance exception (normal exit)
|
if(!SecondChance) //debugger didn't close with a second chance exception (normal exit)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue