在OSX上挂钩C ++方法?

时间:2011-12-05 14:25:09

标签: c++ c macos hook code-injection

我正在某些应用程序中注入一个dylib以获得某些期望的行为。

我能够正确地连接平面C API。一旦我注入了dylib,我会在符号表中查看并使用我的函数地址更新其条目,然后调用原始的。

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

我的问题在于 C ++名称修改。我们如何挂钩名称已被破坏的C ++函数。我读了堆栈溢出的一些地方,可以用mach_override挂钩c ++代码,但没有示例或引用。

有些人可以举例说明如何实现C ++的挂钩吗?

修改 我以$ c++filt -n _ZN10WindowData12GetCGContextEv为例,得出了WindowData::GetCGContext()

  1. WindowData是一个类还是名称空间?
  2. 我该怎么挂钩?我需要一些前向声明和外部函数来正确使用WindowData :: GetCGContext()进行挂钩。
  3. 像这样......

    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
    

    我如何解决?

2 个答案:

答案 0 :(得分:4)

您可以使用c++filt解码重整并进行注射。

但优化程序内联的方法无法使用此方法

答案 1 :(得分:0)

在OS X上,假设您正在使用gcc,abi::__cxa_demangle中的<cxxabi.h>函数可用于解码C ++名称。您不需要这个来指定与签名匹配的方法的指针:WindowData::GetCGContext。但是,仍然需要提供此类的规范。