1

私は最近、迂回機能(Linuxのみ)に取り組んでおり、これまでのところ大きな成功を収めています。これを見つけるまで、私は自分の迂回クラスを開発していました。私はコードを少し現代化し、それをC ++に変換しました(もちろんクラスとして)。このコードは、他の迂回実装と同じように、元の関数アドレスを、自分で指定した「フック」関数のJMPに置き換えます。また、元の関数の「トランポリン」を作成します。

すべてが完璧に機能しますが、簡単な調整を1つ行いたいと思います。私は純粋なC++でプログラミングし、グローバル関数を使用せず、すべてがクラスに囲まれています(Java / C#のように)。問題は、この迂回方法が私のパターンを壊してしまうことです。「フック」関数は静的/非クラス関数である必要があります。

私がやりたいのは、_ thiscallフックのサポートを実装することです(これは、GCC _thiscall規則を使用すると非常に簡単になるはずです)。_thiscallフックで動作するようにこのコードを変更することに成功していません。最終結果として私が欲しいのは、これと同じくらい単純なものです。PatchAddress(void * target, void * hook, void * class);。私は誰かにこれをしてくれるように頼んでいませんが、私の問題を解決/アプローチする方法を知りたいですか?

私が知っていることから、「パッチ」サイズを増やすだけでよく(つまり、5バイトになり、さらに5バイトが必要ですか?)、JMP呼び出しを使用する前に(フック関数に対して)、 'this'ポインターをスタックにプッシュします(これは、メンバー関数として呼び出したかのようになります)。説明する:

push 'my class pointer'
jmp <my hook function>

'jmp'を直接/のみ呼び出す代わりに。それは正しいアプローチですか、それとも考慮に入れる必要のある他の何かがありますか(注:VC ++ _thiscallのサポートについては気にしません)?

注:これが上記のコードの私の実装です:ヘッダーソースlibudis86を使用します

4

1 に答える 1

1

私はいくつかの異なる方法を試しましたが、その中にはJITコンパイル(libjitを使用)が成功したことが証明されましたが、この方法では使用するのに十分なパフォーマンスが得られませんでした。代わりに、実行時に関数を動的に呼び出すために使用されるlibffiに目を向けました。libffiライブラリにはクロージャAPI()ffi_prep_closure_locがあり、生成された各クロージャへの「this」ポインタを提供できました。そこで、静的コールバック関数を使用して、voidポインターをオブジェクトタイプに変換し、そこから、必要な非静的関数を呼び出すことができました。

于 2012-06-26T21:22:36.253 に答える