私はいくつかのアプリケーションでいくつかの動作をするためにdylibを注入しています。OSXでのC++メソッドのフック?
フラットC APIを正しくフックできます。私がdylibを注入すると、私はシンボルテーブルを見て、私の関数アドレスでそのエントリを更新し、元のものを呼び出します。
こうして、シンボル名が私にとって重要になります。
私の問題はとなります。C++ネームマングリングです。名前が変更された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
どのように修正しましたか?
ありがとうございました。メソッド名を変更できました。 – MacGeek