Перехватываете методы C ++ на OSX? - PullRequest
7 голосов
/ 05 декабря 2011

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

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

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

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

Кто-нибудь может дать мне пример того, как добиться перехвата C ++?

Изменить: Я использовал $ 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

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

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

Вы можете использовать c ++ filter для декодирования искажения и выполнения инъекции.

Но методы, которые оптимизатор встроил, не будут работать с этим подходом

0 голосов
/ 05 декабря 2011

В OS X, при условии, что вы используете gcc, функция abi::__cxa_demangle в <cxxabi.h> может быть использована для разборки имен C ++. Вам не нужно это назначать указатель на метод, который соответствует подписи: WindowData::GetCGContext. Однако, спецификация для этого класса еще должна быть предоставлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...