私のプログラムは、関数の最初の数バイト(i386のみ)にjmp命令を書き込むことにより、関数を別の関数にリダイレクトします。期待どおりに機能しますが、常に新しい関数にジャンプするため、元の関数を呼び出すことができなくなります。
私が考えることができる2つの可能な回避策があります:
ターゲット関数のjmp命令を上書きして呼び出す、新しい関数を作成します。その後、関数はjmp命令を書き戻します。しかし、引数はいくつでも存在する可能性があるため、引数を渡す方法がわかりません。そして、ターゲット関数がどこか別の場所でjmpして、jmp命令の書き戻しをスキップできるかどうか疑問に思います(throw catchのように?)。
jmp命令で上書きしたコードを実行する新しい関数を作成します。しかし、上書きされたデータが完全な命令であるかどうかはわかりません。完全な手順を実行するには、コピーする必要のあるバイト数を知る必要があります。
それで、最後に、私の質問:
私が考えていなかった別の方法はありますか?
命令のサイズを見つけるにはどうすればよいですか?私はすでにbinutilsを調べてこれを見つけましたが、それを解釈する方法がわかりません。
サンプルは次のとおりです。
mov, 2, 0xa0, None, 1, Cpu64, D|W|CheckRegSize|No_sSuf|No_ldSuf, { Disp64|Unspecified|Byte|Word|Dword|Qword, Acc|Byte|Word|Dword|Qword }
2番目の列にはオペランドの数(2)が表示され、最後の列にはオペランドに関する情報がコンマで区切られて表示されます。
この質問もほとんど同じですが、7バイトに命令全体が含まれていることを確認できません。 トランポリン関数の記述
どんな助けでも大歓迎です!ありがとう。