在OSX上挂钩C ++方法?

我在某些应用程序中注入了dylib以获取某些期望的行为。

我能够正确挂接平面C API。 一旦我注入了dylib,我就会看到符号表,并用我的函数地址更新它的入口,然后调用原来的函数。

因此,符号名称对我来说变得重要。

我的问题是与C ++名称mangling 。 我们怎样才能钩住一个C ++函数的名字已经被损坏了。 我读了一些堆栈溢出的地方,它可能用mach_override挂钩c ++代码,但没有例子或引用。

有人可以举例说明如何实现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
    

    我如何解决它?


    您可以使用c ++ filt来解码mangling并执行注入。

    但优化程序内联的方法不适用于此方法


    在OS X上,假设你使用gcc,该abi::__cxa_demangle功能<cxxabi.h>可用于解码C ++的名字。 您不需要为此指定一个指向与WindowData::GetCGContext的签名匹配的方法的指针。 然而,这个类的规范仍然需要提供。

    链接地址: http://www.djcxy.com/p/56631.html

    上一篇: Hooking C++ Methods on OSX?

    下一篇: Multithreading, lambdas and local variables