Hooking C++ Methods on OSX?

Я внедряю dylib в некоторое приложение для желаемого поведения.

Я могу правильно подключить плоские API C. Как только я ввожу dylib, я смотрю в таблице символов и обновляю его запись своим адресом функции и, в свою очередь, вызываю исходную.

Таким образом, имена символов становятся важными для меня.

Моя проблема заключается в манипулировании именами C++. Как мы можем вызвать функцию C++, имя которой было искажено. Я читал на stack overflow, что можно подцепить код c++ с помощью mach_override, но никаких примеров или ссылок.

Может ли кто-нибудь дать мне пример того, как достичь хукинга C++?

Edit:. Я использовал $ c++filt -n _ZN10WindowData12GetCGContextEv в качестве примера и получил результат в виде WindowData::GetCGContext()

  1. WindowData - это класс или пространство имен?
  2. Как я могу подключить его? Мне нужны некоторые прямые декларации и экстерны, чтобы правильно использовать WindowData::GetCGContext() для хукинга.

Что-то вроде этого...

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

    return gWindowDataGetCGContextProcPtr(inObj);
}

Теперь я хочу поставить патч на этот метод.

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

Этот патч выдает ошибку компиляции.

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

Как это исправить?

7
задан RLT 5 December 2011 в 15:34
поделиться