No me funciona o no se como hacerlo. Tengo esto en el Execute del hilo:
Código:
case EXCEPTION_SINGLE_STEP:
if(FuncSingleStep != NULL)
{
try{
FuncSingleStep();
}
catch(...){
}
}
dwContinueStatus = OnSingleStep(&DebugEv);
break;
case EXCEPTION_GUARD_PAGE_VIOLATION:
dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
break;
y en el .h donde están las funciones tengo esto:
Código:
#include <vcl.h>
#include "THiloDebugger.h"
#ifndef DEBUGGERH
#define DEBUGGERH
#define EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001L
//tipos de funciones eventos
typedef void __fastcall(__closure* SYSTEMBREAKPOINT)(void);
typedef void __fastcall(__closure* BREAKPOINT)(DWORD);
typedef void __fastcall(__closure* EXCEPTION)(int,DWORD);
typedef void __fastcall(__closure* CREATEPROCESS)(CREATE_PROCESS_DEBUG_INFO *);
typedef void __fastcall(__closure* EXITPROCESS)(EXIT_PROCESS_DEBUG_INFO *);
typedef void __fastcall(__closure* CREATETHREAD)(CREATE_THREAD_DEBUG_INFO *);
typedef void __fastcall(__closure* EXITTHREAD)(EXIT_THREAD_DEBUG_INFO *);
typedef void __fastcall(__closure* LOADDLL)(LOAD_DLL_DEBUG_INFO *);
typedef void __fastcall(__closure* UNLOADDLL)(UNLOAD_DLL_DEBUG_INFO *);
typedef void __fastcall(__closure* OUTPUTSTRING)(OUTPUT_DEBUG_STRING_INFO *);
typedef void __fastcall(__closure* RIP)(RIP_INFO *);
typedef void __fastcall(__closure* SINGLESTEP)(void);
typedef struct{
SYSTEMBREAKPOINT FuncSystemBreakPoint;
BREAKPOINT FuncBPs;
EXCEPTION FuncException;
CREATEPROCESS FuncCreateProcess;
EXITPROCESS FuncExitProcess;
CREATETHREAD FuncCreateThread;
EXITTHREAD FuncExitThread;
LOADDLL FuncLoadDLL;
UNLOADDLL FuncUnLoadDLL;
OUTPUTSTRING FuncOutPutString;
RIP FuncRIP;
SINGLESTEP FuncSingleStep;
}TEventDebugCallBack;
class TDebugger
{
//estructura debug_event requerida para obtener los eventos del proceso y poder gestionarlos
public:
//variable necesaria para salir cuando lo deseemos del bucle
bool Terminated;
AnsiString PathFile;
bool DebugExists;
TDebugger();
~TDebugger();
bool InitDebug(void); //Carga la víctima
void LoopDebug(void); // inicio de la depuración
// Solo tienen sentido si el depurador está parado
AnsiString ReadString(DWORD, int);
bool SetBP(DWORD);
bool RemoveBP(DWORD);
bool SetHBP(DWORD, int, int, int);
bool RemoveHBP(int);
bool RemoveAllHBP(void);
DWORD GetEAX(void);
DWORD GetECX(void);
DWORD GetEDX(void);
DWORD GetEBX(void);
DWORD GetESP(void);
DWORD GetEBP(void);
DWORD GetESI(void);
DWORD GetEDI(void);
DWORD GetEIP(void);
void SetSingleStep(void);
DWORD GetLastAddress(void);
void SetEAX(DWORD Valor);
void SetECX(DWORD Valor);
void SetEDX(DWORD Valor);
void SetEBX(DWORD Valor);
void SetESP(DWORD Valor);
void SetEBP(DWORD Valor);
void SetESI(DWORD Valor);
void SetEDI(DWORD Valor);
void SetEIP(DWORD Valor);
// Establecer los CallBacks
void SetOnSystemBreakPoint(SYSTEMBREAKPOINT);
void SetOnBPs(BREAKPOINT);
void SetOnException(EXCEPTION);
void SetOnCreateProcess(CREATEPROCESS);
void SetOnExitProcess(EXITPROCESS);
void SetOnCreateThread(CREATETHREAD);
void SetOnExitThread(EXITTHREAD);
void SetOnLoadDll(LOADDLL);
void SetOnUnLoadDll(UNLOADDLL);
void SetOnOutPutString(OUTPUTSTRING);
void SetOnRIP(RIP);
void SetOnSingleStep(SINGLESTEP);
void SetCallBack(TEventDebugCallBack *);
//**************************************
private:
BOOL SearchBPOnList(DWORD, BYTE *, int *, bool *);
// Eventos del hilo de depuración
DWORD OnCreateThreadDebugEvent(LPDEBUG_EVENT);
DWORD OnCreateProcessDebugEvent(LPDEBUG_EVENT);
DWORD OnExitThreadDebugEvent(LPDEBUG_EVENT);
DWORD OnExitProcessDebugEvent(LPDEBUG_EVENT);
DWORD OnLoadDllDebugEvent(LPDEBUG_EVENT);
DWORD OnUnloadDllDebugEvent(LPDEBUG_EVENT);
DWORD OnOutputDebugStringEvent(LPDEBUG_EVENT);
DWORD OnRipEvent(LPDEBUG_EVENT);
// tratamiento de excepciones
DWORD OnSingleStep(LPDEBUG_EVENT);
DWORD OnBreakpointDebugEvent(LPDEBUG_EVENT);
DWORD LastExceptionAddress;
protected:
//Para la gestion de los BPs
TList *ListaBPs; //Lista para la gestion de las estructuras BP
int pos; //Para recuperar la posicion que ocupa un BP en la lista
bool estadoBP; //Lo uso para saber si el usuario quiso eliminar el BP de la lista
DWORD FAddrOnBPSS; // Dirección del BP a restaurar en EXCEPTION_SINGLE_STEP
BYTE bOriginal; //Lo uso para obtener el byte original de la posición del BP
//Estructura para cada BP
typedef struct TBP
{
DWORD dir;
BYTE byteOriginal;
bool estado; //true activado, false desactivado
}*pBP;
//Estructura startup requerida para createprocess
STARTUPINFO si;
//estructura process information requerida para el pid
PROCESS_INFORMATION pi;
//estructura context contiene los valores de los registros
#pragma align 8 // no recuerdo bien si esto se hace con un #pragma
CONTEXT con;
// Funciones de callback
SYSTEMBREAKPOINT FuncSystemBreakPoint;
BREAKPOINT FuncBPs;
SINGLESTEP FuncSingleStep;
EXCEPTION FuncException;
CREATEPROCESS FuncCreateProcess;
EXITPROCESS FuncExitProcess;
CREATETHREAD FuncCreateThread;
EXITTHREAD FuncExitThread;
LOADDLL FuncLoadDLL;
UNLOADDLL FuncUnLoadDLL;
OUTPUTSTRING FuncOutPutString;
RIP FuncRIP;
};
#endif
No consigo hacer que reconozca las funciones en el execute del hilo aunque tenga el .h en el archivo de cabecera del hilo y use synchronize ¿como tengo que hacerlo para que funcione bien y compile?
En lo que pongo arriba no me reconocería ni FuncSingleStep, ni FuncSingleStep(), ni OnSingleStep(&DebugEv) pero me pasa igual con todas las demás.
He probado cosas como:
Synchronize(dwContinueStatus = TDebugger::OnExitProcessDebugEvent(&DebugEv));
pero creo que esto no explota de milagro jajaja. Ya no se que probar.