3

x86 / x64 マシン コードを操作するための C ライブラリはありますか? 具体的には、実行時にプログラムのアドレス空間の関数を変更したいと考えています。

たとえば、関数fooandbarがあり、それらの内部動作のソースまたは知識はありますが、それらが含まれているライブラリを再コンパイルすることはできず、baz自分で書いた関数があります。今、私は次のようなことを言うことができるようにしたいと思います:「関数fooで、への呼び出しを見つけて、そのすぐ前にbar命令を挿入しますbaz」。それに応じて、ツールはプログラム内の関連するすべてのアドレスを調整する必要があります。

たとえば、関数のホットパッチを行うためのツールがあるなど、すべての断片が存在することは知っています。最適化などでできることには制限があると思いますが、基本的な機能はできるはずです。私はこのようなものを見つけることができませんでした.誰かがいくつかのリンクを持っていますか?

4

2 に答える 2

3

これは「自己修正コード」として知られており ( wikipediaを参照)、80 年代から 90 年代初頭にかけて非常に流行っていました。しかし、特にマシンコードと ASM では、非常に壊れやすいため、現代の言語でのアプローチとしてはほぼ消滅しました。マネージ言語は、バッファ オーバーラン攻撃の基礎でもあったため、より安全なモデルを提供しようとしました。

コードページが読み取り専用またはコピーオンライトとしてマークされている可能性があり、多くの最新の OS でアクセス違反が発生する可能性があることを念頭に置いてください。変数、または関数であり、その場所で生成されたコードおよび/またはスタック レイアウトに関する非常に具体的な知識が必要です。

開始するためのリンクを次に示します。

  1. x86 アセンブリで自己変更コードを記述する方法
  2. 準 C でのデバッグ トレース用の自己変更コード

具体的には、あなたの場合、操作を挿入してからすべてのコードを調整しようとすることで変更することはありません。必要なのは、仲介者を通過するようにアドレスを変更することだけです。これは として知られています。このようにすることの利点は、元の関数の構造を変更するのではなく、数値だけを変更するため、ジャンプ アドレスをあるアドレスから別のアドレスに変更する際の脆弱性が大幅に軽減されることです。実際、比較すると些細なことです。foojumpbarThunk

ではthunk、実際の関数を呼び出す前後に好きな操作を行うことができます。既に同じアドレス空間にいて、サンク コードが読み込まれている場合は、ホームです。

Windows を使用している場合は、Detours も参照してください。

于 2013-04-27T23:15:10.263 に答える
1

使用gccしていて、関数全体を置き換えたい場合は、リダイレクトして、-Wl,wrap,functionNameスイッチを使用して関数をラップできます: https://stackoverflow.com/a/617606/111160

次に、コードがアクセスしたいときはいつでも、提供functionNameした実行__wrap_functionNameを呼び出します。で元のファイルにアクセスできます__real_functionName

への各呼び出しの前にいくつかのアクションを実行したい場合はbaz__wrap_bazそのアクションを実行してから呼び出します__real_baz

于 2013-04-27T23:18:12.950 に答える