Я внедряю dylib в какое-то приложение для некоторого желаемого поведения.
Я могу правильно подключить API-интерфейсы C. Как только я ввожу dylib, я просматриваю таблицу символов и обновляю ее запись своим адресом функции, а затем вызываю исходный.
Таким образом, имена символов становятся важными для меня.
Моя проблема с C ++ искажением имен . Как мы можем перехватить функцию C ++, имя которой было искажено. Я читал некоторые места переполнения стека, что можно перехватить код на C ++ с помощью mach_override, но без примера или ссылок.
Кто-нибудь может дать мне пример того, как добиться перехвата C ++?
Изменить:
Я использовал $ c++filt -n _ZN10WindowData12GetCGContextEv
в качестве примера и получил результат как WindowData::GetCGContext()
- WindowData - это класс или пространство имен?
- Как мне это зацепить? Мне нужно несколько предварительных объявлений и внешних ссылок, чтобы правильно использовать 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
Как мне это исправить?