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