私は最近、迂回機能(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を使用します