2011-12-05 29 views
7

私はいくつかのアプリケーションでいくつかの動作をするためにdylibを注入しています。OSXでのC++メソッドのフック?

フラットC APIを正しくフックできます。私がdylibを注入すると、私はシンボルテーブルを見て、私の関数アドレスでそのエントリを更新し、元のものを呼び出します。

こうして、シンボル名が私にとって重要になります。

私の問題はとなります。C++ネームマングリングです。名前が変更されたC++関数をどのようにフックできますか?スタックオーバフローでいくつかの場所を読んで、mach_overrideでC++コードをフックすることは可能ですが、例や参照はありません。

C++のフックを達成する方法の例をいくつか教えてください。

編集: 私は例として、$ c++filt -n _ZN10WindowData12GetCGContextEvを使用し、アウトがWindowData::GetCGContext()

  1. として入れてしまったWindowDataは、クラスまたは名前空間ですか?
  2. どうすればいいですか?私はフックするために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 

どのように修正しましたか?

答えて

4

c++filtを使用すると、マングリングをデコードして注入することができます。

しかし、オプティマイザによってインライン化されている方法は、gccを使用していると仮定すると、OS X上でこのアプローチ

+0

ありがとうございました。メソッド名を変更できました。 – MacGeek

0

では動作しませんが、<cxxabi.h>abi::__cxa_demangle機能は、C++の名前をデマングルするために使用することができます。 WindowData::GetCGContextのシグネチャに一致するメソッドにポインタを割り当てる必要はありません。ただし、このクラスの仕様はまだ提供する必要があります。

関連する問題