E9Patch は、 x86_64
Linux ELF バイナリ用の強力な静的バイナリ書き換えツールです。 E9パッチは次のとおりです。
静的バイナリ書き換えでは、入力バイナリ (ELF 実行可能ファイルまたは共有オブジェクト) を受け取り、何らかのパッチ/変更が適用された出力バイナリを生成します。パッチを適用したバイナリは、元のバイナリのドロップイン置換として使用できます。
詳細については、PLDI'2020 の論文を参照してください。
事前に構築された E9Patch バイナリは、ここからダウンロードできます。
E9Patch のビルドは非常に簡単です。単にbuild.sh
スクリプトを実行するだけです。
これにより、次の 2 つのツールが自動的に構築されます。
e9patch
: バイナリ リライター バックエンド。そしてe9tool
: E9Patch の線形逆アセンブリ フロントエンド。 E9Patch は E9Tool フロントエンド経由で使用できます。
たとえば、 xterm
のすべてのxor
命令に命令印刷インストルメンテーションを追加するには、次のコマンドを使用できます。
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
これにより、変更されたバージョンのxterm
が生成され、 a.out
ファイルに書き込まれます。
変更されたxterm
通常どおり実行できますが、実行された各xor
命令のアセンブリ文字列がstderr
に出力されます。
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
サポートされているオプションとモードの完全なリストについては、次を参照してください。
$ ./e9tool --help
すべてのジャンプ命令に「空」のインストルメンテーションをパッチします。
$ ./e9tool -M 'asm=/j.*/' -P empty xterm
$ ./a.out
「print」インストルメンテーションを使用してすべてのジャンプ命令を出力します。
$ ./e9tool -M 'asm=/j.*/' -P print xterm
$ ./a.out
上記と同じですが、「Intel」構文を使用します。
$ ./e9tool -M 'asm=/j.*/' -P print xterm --syntax=intel
$ ./a.out
空の関数の呼び出しを含むすべてのジャンプ命令にパッチを適用します。
$ ./e9compile.sh examples/nop.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@nop' xterm
$ ./a.out
命令カウント計測を使用してすべてのジャンプ命令にパッチを適用します。
$ ./e9compile.sh examples/counter.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@counter' xterm
$ FREQ=10000 ./a.out
すべてのジャンプ命令に、きれいな印刷インストゥルメンテーションをパッチします。
$ ./e9compile.sh examples/print.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry(addr,instr,size,asm)@print' xterm
$ ./a.out
すべてのジャンプ命令に「遅延」計測を適用してプログラムの速度を低下させます。
$ ./e9compile.sh examples/delay.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@delay' xterm
$ DELAY=100000 ./a.out
注:
XTerm(322)
についてテスト済みE9Patch を使用する他のプロジェクトには次のものがあります。
libc.so
の静的バイナリ書き換えを使用したシステム コールのインターセプト。E9Patch は、他のプロジェクトに統合できるように設計された低レベルのツールです。詳細については、次のドキュメントを参照してください。
バグはここで報告できます:
E9Patch の現在のバージョンは、PLDI'2020 論文で評価された元のプロトタイプと比較して大幅に改善されています。具体的には:
-O2
オプションを E9Tool に渡します。このソフトウェアは、GNU Public License (GPL) バージョン 3 に基づいてリリースされています。
一部の特定のファイルは MIT ライセンスに基づいてリリースされます (ファイルのプリアンブルを確認してください)。
この研究は、National Cybersecurity R&D (NCR) プログラムの下、National Research Foundation (NRF) Singapore から資金提供を受けた National Satellite of Excellence in Trustworthy Software Systems によって部分的に支援されました。