6

迂回路に問題があります。ご存知のように、迂回路は5バイトのスペース間でのみ移動できます(つまり、「jmp」呼び出しと4バイトのアドレス)。このため、クラス(メソッド)に「hook」関数を含めることはできません。スペースが不足しているため、「this」ポインタを指定できません(問題について詳しく説明します)。ですから、私は一日中解決策についてブレインストーミングを行ってきました。そして今、私はこのテーマについてあなたの考えを求めているので、それが可能かどうかわからないまま3〜5日間のプロジェクトを開始しません。

最初は3つの目標がありました。「フック」関数をクラスメソッドにし、アプローチ全体をオブジェクト指向(静的関数やグローバルオブジェクトなし)にし、最悪/最も難しい部分を完全に動的にしました。これは私の(理論上)解決策です。アセンブリを使用すると、実行時に関数を変更できます(完璧な例は迂回方法です)。では、関数を動的に変更できるので、それらを動的に作成することもできないのでしょうか。例えば; たとえば、最大30バイト(malloc / newを介して)にメモリを割り当てます。すべてのバイトを異なるアセンブリ演算子(0xE9は'jmp'など)に対応する2進数に置き換えてから、アドレスを直接呼び出すことはできませんか(関数が含まれているため)。

注:戻り値と、迂回したいすべての関数へのすべての引数を事前に知っています。GCCを使用しているため、thiscall規約は実質的に_cdeclのものと同じです。

これが私の考え/間もなく実装されるものです。'Function'クラスを作成します。このコンストラクターは、可変個引数を取ります(ターゲット関数の戻り値を記述する最初の引数を除く)。

各引数は、フックが受け取る引数の説明です(サイズ、およびポインターであるかどうか)。それで、のFunctionクラスを作成したいとしましょうint * RandomClass::IntCheckNum(short arg1);。次に、私はこのようにする必要があります:Function func(Type(4, true), Type(4, true), Type(2, false));。ここで、「タイプ」はとして定義されType(uint size, bool pointer)ます。次に、アセンブリを介して、引数の数と合計サイズを計算できるため、関数を動的に作成できます(注:これはすべて_cdecl呼び出し規約を使用します)。

編集:この例でType(4, true)は、は戻り値(int *)であり、scondType(4, true)はRandomClass'this'ポインターでありType(2, false)、最初の引数(short arg1)を記述します。

この実装では、クラスメソッドをコールバックとして簡単に使用できますが、大量のアセンブリコードが必要になります(これは特に経験がありません)。結局、動的ではないのは、コールバッククラスのメソッドだけです(これには、コールバックの前後も必要です)。

だから私は知りたかった。これは可能ですか?それにはどれくらいの作業が必要でしょうか、そして私はここで頭を悩ませていますか?

編集:私がすべてを少し曖昧に提示した場合は申し訳ありませんが、もっと徹底的に説明したいことがあれば、尋ねてください!

EDIT2:すべてのアセンブリ演算子の16進値をどこかで見つけることができるかどうかも知りたいですか?リストは1トンに役立ちます!および/またはasm( "");を何らかの方法で「保存」できる場合。メモリアドレスのコード(私は非常に疑わしい)。

4

1 に答える 1

4

あなたが説明することは通常「サンキング」と呼ばれ、非常に一般的に実装されています。歴史的に、最も一般的な目的は、16ビットコードと32ビットコードの間のマッピングでした(既存の16ビット関数を呼び出す新しい32ビット関数を自動生成するか、またはその逆)。一部のC++コンパイラは、多重継承で基本クラスポインタをサブクラスポインタに調整するために同様の関数を生成すると思います。

それは確かにあなたの問題に対する実行可能な解決策のように思えます、そして私はどんな大きな問題も予見しません。メモリが実行可能であることを確認するために、オペレーティングシステムで必要なフラグを使用してメモリを割り当てるようにしてください(ほとんどの最新のOSは、デフォルトで実行不可能なメモリを提供します)。

このリンクは、特にWin32で作業している場合に役立ちます:http://www.codeproject.com/Articles/16785/Thunking-in-Win32-Simplifying-Callbacks-to-Non-sta

アセンブリ操作の16進値を見つけることに関して、私が知っている最良の参考資料は、NASMアセンブラーのマニュアルの付録です(そして、私がそれを書くのを手伝ったので、それを言うだけではありません)。ここに利用可能なコピーがあります:http ://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

于 2012-05-04T15:36:45.067 に答える