在OSX上挂钩C ++方法?
我在某些应用程序中注入了dylib以获取某些期望的行为。
我能够正确挂接平面C API。 一旦我注入了dylib,我就会看到符号表,并用我的函数地址更新它的入口,然后调用原来的函数。
因此,符号名称对我来说变得重要。
我的问题是与C ++名称mangling 。 我们怎样才能钩住一个C ++函数的名字已经被损坏了。 我读了一些堆栈溢出的地方,它可能用mach_override挂钩c ++代码,但没有例子或引用。
有人可以举例说明如何实现C ++的钩子吗?
编辑:我使用$ 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
我如何解决它?
您可以使用c ++ filt来解码mangling并执行注入。
但优化程序内联的方法不适用于此方法
在OS X上,假设你使用gcc,该abi::__cxa_demangle
功能<cxxabi.h>
可用于解码C ++的名字。 您不需要为此指定一个指向与WindowData::GetCGContext
的签名匹配的方法的指针。 然而,这个类的规范仍然需要提供。