我正在某些应用程序中注入一个dylib以获得某些期望的行为。
我能够正确地连接平面C API。一旦我注入了dylib,我会在符号表中查看并使用我的函数地址更新其条目,然后调用原始的。
因此,符号名称对我来说很重要。
我的问题在于 C ++名称修改。我们如何挂钩名称已被破坏的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
我如何解决?
答案 0 :(得分:4)
您可以使用c++filt解码重整并进行注射。
但优化程序内联的方法无法使用此方法
答案 1 :(得分:0)
在OS X上,假设您正在使用gcc,abi::__cxa_demangle
中的<cxxabi.h>
函数可用于解码C ++名称。您不需要这个来指定与签名匹配的方法的指针:WindowData::GetCGContext
。但是,仍然需要提供此类的规范。