1
0
Fork 0

DBG: sdk update

DBG: added bptobridge function
DBG: call plugin callbacks
This commit is contained in:
mr.exodia 2013-11-24 21:06:29 +01:00
parent 4f77810f8f
commit 00b3f8c716
5 changed files with 89 additions and 3 deletions

View File

@ -51,6 +51,7 @@ del /Q *.pdb
del /Q *.exp
del /Q *.a
del /Q *.lib
del /Q *.def
del /Q x32_dbg.exe
del /Q x32_dbg.dll
del /Q x32_gui.dll
@ -64,6 +65,7 @@ del /Q *.pdb
del /Q *.exp
del /Q *.a
del /Q *.lib
del /Q *.def
del /Q x64_dbg.exe
del /Q x64_dbg.dll
del /Q x64_gui.dll

View File

@ -38,6 +38,7 @@ struct PLUG_CB_CREATEPROCESS
CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo;
IMAGEHLP_MODULE64* modInfo;
const char* DebugFileName;
PROCESS_INFORMATION* fdProcessInfo;
};
struct PLUG_CB_EXITPROCESS
@ -84,7 +85,7 @@ struct PLUG_CB_EXCEPTION
struct PLUG_CB_BREAKPOINT
{
void* reserved;
BRIDGEBP* breakpoint;
};
struct PLUG_CB_PAUSEDEBUG

View File

@ -296,3 +296,29 @@ void bpfixmemory(uint addr, unsigned char* dest, uint size)
}
}
}
void bptobridge(const BREAKPOINT* bp, BRIDGEBP* bridge)
{
if(!bp or !bridge)
return;
memset(bridge, 0, sizeof(BRIDGEBP));
bridge->active=bp->active;
bridge->addr=bp->addr;
bridge->enabled=bp->enabled;
strcpy(bridge->mod, bp->mod);
strcpy(bridge->name, bp->name);
bridge->singleshoot=bp->singleshoot;
switch(bp->type)
{
case BPNORMAL:
bridge->type=bp_normal;
break;
case BPHARDWARE:
bridge->type=bp_hardware;
break;
case BPMEMORY:
bridge->type=bp_memory;
default:
bridge->type=bp_none;
}
}

View File

@ -40,5 +40,6 @@ bool bpenumall(BPENUMCALLBACK cbEnum);
bool bpenumall(BPENUMCALLBACK cbEnum, const char* module);
int bpgetcount(BP_TYPE type);
void bpfixmemory(uint addr, unsigned char* dest, uint size);
void bptobridge(const BREAKPOINT* bp, BRIDGEBP* bridge);
#endif // _BREAKPOINT_H

View File

@ -67,6 +67,9 @@ void DebugUpdateGui(uint disasm_addr)
static void cbUserBreakpoint()
{
BREAKPOINT bp;
BRIDGEBP pluginBp;
PLUG_CB_BREAKPOINT bpInfo;
bpInfo.breakpoint=0;
if(!bpget(GetContextData(UE_CIP), BPNORMAL, 0, &bp) and bp.enabled)
dputs("breakpoint reached not in list!");
else
@ -107,11 +110,17 @@ static void cbUserBreakpoint()
dputs(log);
if(bp.singleshoot)
bpdel(bp.addr, BPNORMAL);
bptobridge(&bp, &pluginBp);
bpInfo.breakpoint=&pluginBp;
}
DebugUpdateGui(GetContextData(UE_CIP));
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
plugincbcall(CB_BREAKPOINT, &bpInfo);
wait(WAITID_RUN);
}
@ -119,6 +128,9 @@ static void cbHardwareBreakpoint(void* ExceptionAddress)
{
uint cip=GetContextData(UE_CIP);
BREAKPOINT found;
BRIDGEBP pluginBp;
PLUG_CB_BREAKPOINT bpInfo;
bpInfo.breakpoint=0;
if(!bpget((uint)ExceptionAddress, BPHARDWARE, 0, &found))
dputs("hardware breakpoint reached not in list!");
else
@ -130,11 +142,17 @@ static void cbHardwareBreakpoint(void* ExceptionAddress)
else
sprintf(log, "hardware breakpoint "fhex"!", found.addr);
dputs(log);
bptobridge(&found, &pluginBp);
bpInfo.breakpoint=&pluginBp;
}
DebugUpdateGui(cip);
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
plugincbcall(CB_BREAKPOINT, &bpInfo);
wait(WAITID_RUN);
}
@ -144,6 +162,9 @@ static void cbMemoryBreakpoint(void* ExceptionAddress)
uint size;
uint base=memfindbaseaddr(fdProcessInfo->hProcess, (uint)ExceptionAddress, &size);
BREAKPOINT found;
BRIDGEBP pluginBp;
PLUG_CB_BREAKPOINT bpInfo;
bpInfo.breakpoint=0;
if(!bpget(base, BPMEMORY, 0, &found))
dputs("memory breakpoint reached not in list!");
else
@ -155,6 +176,8 @@ static void cbMemoryBreakpoint(void* ExceptionAddress)
else
sprintf(log, "memory breakpoint on "fhex"!", found.addr);
dputs(log);
bptobridge(&found, &pluginBp);
bpInfo.breakpoint=&pluginBp;
}
if(found.singleshoot)
bpdel(found.addr, BPMEMORY); //delete from breakpoint list
@ -162,6 +185,10 @@ static void cbMemoryBreakpoint(void* ExceptionAddress)
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
plugincbcall(CB_BREAKPOINT, &bpInfo);
wait(WAITID_RUN);
}
@ -173,6 +200,9 @@ static void cbEntryBreakpoint()
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
wait(WAITID_RUN);
}
@ -271,8 +301,14 @@ static void cbStep()
isStepping=false;
DebugUpdateGui(GetContextData(UE_CIP));
GuiSetDebugState(paused);
PLUG_CB_STEPPED stepInfo;
stepInfo.reserved=0;
plugincbcall(CB_STEPPED, &stepInfo);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
wait(WAITID_RUN);
}
@ -282,6 +318,9 @@ static void cbRtrFinalStep()
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
wait(WAITID_RUN);
}
@ -349,6 +388,7 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo)
callbackInfo.CreateProcessInfo=CreateProcessInfo;
callbackInfo.modInfo=&modInfo;
callbackInfo.DebugFileName=DebugFileName;
callbackInfo.fdProcessInfo=fdProcessInfo;
plugincbcall(CB_CREATEPROCESS, &callbackInfo);
}
@ -375,9 +415,10 @@ static void cbExitThread(EXIT_THREAD_DEBUG_INFO* ExitThread)
static void cbSystemBreakpoint(void* ExceptionData)
{
//plugin callbacks
PLUG_CB_SYSTEMBREAKPOINT callbackInfo;
callbackInfo.reserved=0;
plugincbcall(CB_SYSTEMBREAKPOINT, &callbackInfo);
//TODO: handle stuff (TLS, main entry, etc)
//log message
dputs("system breakpoint reached!");
@ -388,6 +429,10 @@ static void cbSystemBreakpoint(void* ExceptionData)
unlock(WAITID_SYSBREAK);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
plugincbcall(CB_SYSTEMBREAKPOINT, &callbackInfo);
wait(WAITID_RUN);
}
@ -448,7 +493,6 @@ static void cbException(EXCEPTION_DEBUG_INFO* ExceptionData)
//TODO: plugin callback
PLUG_CB_EXCEPTION callbackInfo;
callbackInfo.Exception=ExceptionData;
plugincbcall(CB_EXCEPTION, &callbackInfo);
uint addr=(uint)ExceptionData->ExceptionRecord.ExceptionAddress;
if(ExceptionData->ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT)
@ -461,6 +505,10 @@ static void cbException(EXCEPTION_DEBUG_INFO* ExceptionData)
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
plugincbcall(CB_EXCEPTION, &callbackInfo);
wait(WAITID_RUN);
return;
}
@ -484,6 +532,10 @@ static void cbException(EXCEPTION_DEBUG_INFO* ExceptionData)
GuiSetDebugState(paused);
//lock
lock(WAITID_RUN);
PLUG_CB_PAUSEDEBUG pauseInfo;
pauseInfo.reserved=0;
plugincbcall(CB_PAUSEDEBUG, &pauseInfo);
plugincbcall(CB_EXCEPTION, &callbackInfo);
wait(WAITID_RUN);
}
@ -535,6 +587,7 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter)
plugincbcall(CB_STOPDEBUG, &stopInfo);
//message the user/do final stuff
DeleteFileA("DLLLoader.exe");
RemoveAllBreakPoints(UE_OPTION_REMOVEALL); //remove all breakpoints
SymCleanup(fdProcessInfo->hProcess);
dbclose();
modclear();
@ -616,6 +669,9 @@ CMDRESULT cbDebugRun(int argc, char* argv[])
}
GuiSetDebugState(running);
unlock(WAITID_RUN);
PLUG_CB_RESUMEDEBUG callbackInfo;
callbackInfo.reserved=0;
plugincbcall(CB_RESUMEDEBUG, &callbackInfo);
return STATUS_CONTINUE;
}