2011-08-20 6 views
6

Funzioni di aggancio in un processo esterno tramite il loro offset di funzione. Che funziona bene per le funzioni im aggancio finora - tuttavia ho trovato un "(char ...) DebugLog" funzione che ancora esistono nel binario, ma pretende molto fare qualsiasi stampa - sembra che questoDeviazioni Gancio in processo esterno per la funzione "vuoto" non funziona

debugMessage proc near    ; 
      xor  eax, eax  ; Logical Exclusive OR 
      retn     ; Return Near from Procedure 
debugMessage endp 

esso è chiamato in questo modo

push offset debugString ; "This is a debug message"... 
call debugMessage ; Call Procedure 

Ora il messaggio di debug ha ovviamente stato disabilitato, ho voluto collegare in questo come mi è stato in grado di collegare semplicemente in func simile (char ..) nel binario già.

Questo è il codice:

typedef void (__stdcall* DebugLog)(const char*); 
DebugLog Real_DebugLog = (DebugLog)(0xCAFEBABE); 

extern "C" 
{ 
static void __stdcall Hook_DebugLog(const char*); 
} 

void __stdcall Hook_DebugLog(const char* text) { 
MessageBox(NULL, text, "MyDebugLog", MB_OK); 
return Real_DebugLog(text); 
} 

// in dll main attach.. 
DetourTransactionBegin(); 
DetourUpdateThread(GetCurrentThread()); 
DetourAttach(&(PVOID&)Real_DebugLog, (PVOID)Hook_DebugLog); 

Un approccio simile funziona per tutte le altre funzioni che ho finora agganciati in questo binario. Mi sono anche assicurato che il debugMessage fosse anche chiamato con un debugger.

Qualche idea sul perché questo hook non funziona affatto? Forse perché la funzione potrebbe avere var args? ho già provato con const char *, ...).

risposta

2

La funzione è probabilmente troppo piccola da agganciare. Deviazioni deve sovrascrivere una pozione della funzione collegata per reindirizzare le chiamate altrove, ma probabilmente non c'è abbastanza spazio in tale stub per consentire a Detours di scrivere un'istruzione JMP destinata alla sostituzione.

+0

grazie - c'è un'altra soluzione? – Steve

+0

altro modo è quello di deviare tutti i siti di chiamata invece – paulm

3

Una "deviazione" richiede un minimo di 5 byte per funzionare (x86) - debugMessage è solo 3 byte.

+0

grazie per la risposta specifica, conosci un'altra soluzione? – Steve

+0

È possibile utilizzare i punti di interruzione software o hardware. Date un'occhiata a http://msdn.microsoft.com/en-us/library/ms679274(v=vs.85).aspx – Nop

+0

Sì, almeno i punti di interruzione del software possono essere d'aiuto. È possibile inserire 0xcc (int 3) anziché il primo byte della funzione che si desidera collegare e fornire un gestore trap. Vectored Exception Handling (VEH) Noergaard cui si fa riferimento potrebbe aiutare qui. – Eugene