迂回路に問題があります。ご存知のように、迂回路は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( "");を何らかの方法で「保存」できる場合。メモリアドレスのコード(私は非常に疑わしい)。