基本的に、バイナリファイルを書き直して、実際のタスクに関する追加のタスクを実行したいと思います。バイナリ書き換えに関しては、プロセスは次のようです。
- 既存のバイナリから制御フローグラフを作成する
- 適切な形式で必要な変更を加えたコードスニペットを作成する
- 変更したCFGからバイナリファイルを作成します
私はいくつかのツールに出くわしましたが、それらは私のubuntu 12.04でコンパイルできないか、ダウンロードできないか、バイナリをホットパッチ/書き換える方法に関する適切なチュートリアル/ハウツーを見つけることができません。それらのツールは次のとおりです。
ParseAPI、Code-Surfer / x86、EEL、LEEL、Jakstab、DynInst、Diablo + Lancet
より正確には、特定のバイナリで最も頻繁に使用される関数を分析し、これらの関数を実行する前に特定の一連の命令が実行されるように変更します。これらの命令は、格納されたバイトの配列をロードし、特定の位置でバイトを読み取り、それを事前定義された値と比較することで構成されます。バイナリがすべての試行中にこれらの命令を確実に実行することを確認したいと思います。
私が遭遇した2つの代替アプローチがあります。これらの関数は高い確率でバイナリの一部であると想定しているため、基本的に標準のc関数(、、、など)を変更memcpy()
します。strcpy()
printf()
LD_PRELOAD
:自分のライブラリを定義し、通常のライブラリよりも先にロードできるようにします- (ソースコードが指定されている)バイナリを、次のようなものを使用して標準関数の独自のバージョンでコンパイルします。
gcc -fno-builtin -o strcpy strcpy.c
このアプローチの欠点は、標準のc関数を代用しても、必ずしも呼び出す必要がないため、命令も実行されないことです。
バイナリの書き換えに関する経験はありますか、それともこのかなりエキゾチックなタスクを実行するための手がかりがありますか?
よろしくお願いします!