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()
- Es WindowData una clase o espacio de nombres?
- ¿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?
Gracias, pude eliminar el nombre del método. – MacGeek