2011-12-05 17 views
7

Estoy inyectando un dylib en alguna aplicación por algún comportamiento deseado.Enlazando métodos C++ en OSX?

Puedo conectar correctamente las API C planas. Una vez que inyecté el dylib, observo en la tabla de símbolos y actualizo su entrada con la dirección de mi función y, a su vez, llamo a la original.

Por lo tanto, los nombres de símbolos se vuelven importantes para mí.

Mi problema es con C++ name mangling. ¿Cómo podemos conectar una función de C++ cuyo nombre ha sido destrozado? Leí algunos lugares en el desbordamiento de la pila, que es posible enganchar el código de C++ con mach_override, pero no hay ejemplos o referencias.

¿Pueden algunos darme un ejemplo sobre cómo lograr el enganche de C++?

Editar: utilicé $ c++filt -n _ZN10WindowData12GetCGContextEv como un ejemplo, y tiene la puso a cabo como WindowData::GetCGContext()

  1. Es WindowData una clase o espacio de nombres?
  2. ¿Cómo puedo engancharlo? Necesito algunas declaraciones avanzadas y externos para usar WindowData :: GetCGContext() correctamente para enganchar.

Algo como esto ...

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

    return gWindowDataGetCGContextProcPtr(inObj); 
} 

Ahora, yo quiero que parchear este método.

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

Este parche da error de compilación.

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

¿Cómo puedo arreglarlo?

Respuesta

4

Puede usar c++filt para decodificar el molde y hacer la inyección.

Pero los métodos que se inline por el optimizador no funcionarán con este enfoque

+0

Gracias, pude eliminar el nombre del método. – MacGeek

0

En OS X, asumiendo que usted está utilizando gcc, la función abi::__cxa_demangle en <cxxabi.h> se puede utilizar para demangle C++ nombres. No necesita esto para asignar un puntero a un método que coincida con la firma de: WindowData::GetCGContext. Sin embargo, la especificación para esta clase todavía necesita ser proporcionada.