2010-03-23 2 views
6

Sto utilizzando Detours per collegarsi alla funzione di messaggio di un eseguibile, ma è necessario eseguire il mio codice e quindi chiamare il codice originale. Da quello che ho visto nei documenti di Detours, sembra proprio che dovrebbe accadere automaticamente. La funzione originale stampa un messaggio sullo schermo, ma non appena inserisco una deviazione, inizia a eseguire il mio codice e interrompe la stampa.È necessario chiamare la funzione originale dalla funzione deviata

Il codice funzione originale è più o meno:

void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB); 

La mia funzione è:

void CGuiObject_AppendMsgToBuffer([same params, with names]); 

so la posizione di memoria la funzione originale risiede in, in modo da utilizzare:

DWORD OrigPos = 0x0040592C; 
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer); 

mi fa entrare nella funzione. Questo codice funziona quasi perfettamente: la mia funzione è chiamata con i parametri corretti. Tuttavia, l'esecuzione lascia la mia funzione e il codice originale non viene chiamato. Ho provato a riprendere, ma questo fa crashare il programma (sto assumendo che il codice Detours spostato per adattarsi al gancio sia responsabile del crash).

Edit: sono riuscito a risolvere il primo numero, senza alcun ritorno per programmare l'esecuzione. Chiamando il valore OrigPos come funzione, sono in grado di andare alla funzione "trampolino" e da lì al codice originale. Tuttavia, da qualche parte lungo le linee i registri stanno cambiando e questo causa il crash del programma con un segfault non appena torno nel codice originale.

Edit2: codice di lavoro finale:

class CGuiObject 
{ 
public: 
    void MyFunc([params]); 
}; 

DWORD TrueAddr = 0x0040592C; 

CGuiObject::MyFunc([params]) 
{ 
    _asm { pushad } 
    // process 
    _asm { 
     popad 
     leave 
     jmp TrueAddr 
    } 
} 

e utilizzando TrueAddr per la prima param in DetourAttach.

+0

Potete passare attraverso questo in un disassemblatore? –

+0

Sì, ho integrato il debug e impostato un break-point all'inizio della mia funzione. Il codice colpisce che, pushad, faccio un po 'di logging (invia il messaggio a un fstream usando l'operatore <<), popad e jmp all'indirizzo Detours restituito. L'esecuzione passa attraverso le cose copiate e torna nell'eseguibile originale. Funziona per poche righe, ma per quanto posso vedere, ECX viene resettato su 0 e viene usato come un puntatore, da qui il segfault. Se ciò non aiuta, posso pubblicare il codice completo con asm. – ssube

risposta

1

Dato che si sta tentando di intercettare una chiamata di metodo C++, probabilmente avete un problema di convenzione di chiamata quando si chiama la funzione originale.

non ho provato a farlo personalmente con deviazioni, ma questo post punta a qualcosa che potrebbe aiutare. C++ — Detours (Win32 API Hijacking) — Hijack Class Methods Vedere il collegamento nella seconda risposta.

+0

Questo ha funzionato, in un modo rotondo. Alla fine, ho creato una classe scheletro che funziona perfettamente. Può persino chiamarsi per inserire messaggi nella coda o saltare le parti finali per impedire un messaggio. Grazie per il link! :) – ssube