2011-12-05 4 views
7

Sto iniettando un dylib in alcune applicazioni per alcuni comportamenti desiderati.Agganciare i metodi C++ su OSX?

Sono in grado di collegare correttamente le API C piatte. Una volta iniettato il dylib, guardo nella tabella dei simboli e aggiorno la sua voce con il mio indirizzo di funzione e, a sua volta, richiama quello originale.

Quindi, i nomi dei simboli diventano importanti per me.

Il mio problema è con nome cacao mangling. Come possiamo agganciare una funzione C++ il cui nome è stato storpiato. Ho letto alcuni punti sullo stack overflow, che è possibile collegare codice C++ con mach_override, ma nessun esempio o riferimento.

Qualcuno può darmi un esempio su come ottenere l'aggancio del C++?

Edit: Ho usato $ c++filt -n _ZN10WindowData12GetCGContextEv come un esempio e ha ottenuto il fuori messo come WindowData::GetCGContext()

  1. È WindowData una classe o spazio dei nomi?
  2. Come posso farlo? Ho bisogno di alcune dichiarazioni anticipate ed estensioni per usare WindowData :: GetCGContext() correttamente per l'aggancio.

qualcosa di simile ...

typedef void* (*WindowData_GetCGContextProcPtr)(void* inObj); 
static WindowData_GetCGContextProcPtr gWindowDataGetCGContextProcPtr = NULL; 
void* try_WindowDataGetCGContextProcPtr(void* inObj) 
{ 
    printf("try_WindowDataGetCGContextProcPtr \n"); 

    return gWindowDataGetCGContextProcPtr(inObj); 
} 

Ora, voglio correggere questo metodo.

gWindowDataGetCGContextProcPtr = (WindowData_GetCGContextProcPtr)Patch((const void*)&WindowData::GetCGContext, (const void*)&try_WindowDataGetCGContextProcPtr); 

Questa patch fornisce errori di compilazione.

error: 'WindowData' has not been declared 
error: 'GetCGContext' was not declared in this scope 

Come ho risolto?

risposta

4

È possibile utilizzare c++filt per decodificare il mangling e fare l'iniezione.

Ma i metodi che sono inline dal ottimizzatore non funzioneranno con questo approccio

+0

Grazie, sono stato in grado di decodificare il nome del metodo. – MacGeek

0

Su OS X, supponendo che si sta utilizzando gcc, la funzione abi::__cxa_demangle in <cxxabi.h> può essere utilizzato per decodifica i nomi di C++. Non è necessario per assegnare un puntatore a un metodo che corrisponde alla firma di: WindowData::GetCGContext. Tuttavia, le specifiche per questa classe devono ancora essere fornite.