5

2つのバイナリファイルを比較するにはどうすればよいですか?

プログラムには、バージョン1とバージョン2の2つのバージョンがあります。2つのバージョン間でいくつかの変更を加えましたが、残念ながら定期的にバックアップされていないため、バージョン2のソースは入手できます。 、私はバージョン1のバイナリしか持っていません。正確には、2つのバージョン間で何を変更したかを知る必要があります。2つのバージョンのobjdumpを作成し、diffを使用して変更を見つけようとしましたが、オフセットが異なるため機能しません。そのため、diffはほぼすべての行が変更されたと見なします。

たとえば、1行がbgez v0,4074d0<daemonize+0xd4>バージョン1とbgez v0,4073d4<daemonize+0xd4>バージョン2にある場合があります。これらは、ダンプファイルから直接コピーされます。2行が同じことをしていることがわかりますが、diffでは区別できません。ファイルが大きすぎて、すべての行を手動で調べることができません。オフセットの違いを無視して、機能の変更を検出するにはどうすればよいですか?

4

5 に答える 5

4

最終的には、生の命令とオフセットマーカーを削除してアセンブリのみを作成し、sedを使用してすべての桁を削除し、diffをフィルタリングして1行のみの変更を無視することでこれを解決しました。私はそれがうまくいったことに少し驚いたが、うまくいった。

于 2011-01-25T09:28:19.750 に答える
4

可能です。私は現在、新しい/変更されたバイナリファイル内のコンパイルされたファイルから関数とメモリポインタアドレスを検索できるプロジェクトに取り組んでいます。x86およびx86_64でWindowsPEおよびELFバイナリをサポートします。アプローチを説明する論文もあります。これは、バイナリ更新が行われるときにすべてのフックとメモリアドレスを頻繁に更新する必要がある私の逆転プロジェクトに適しています。しかし、他のユースケースもあります。

こちらでチェックしてください。

秘訣は、弱いテキスト比較に依存せず、バイナリを分解し、コードメトリックを使用してそれらの間の幾何学的距離を測定することによってすべての関数を比較することです。

于 2011-08-08T16:49:45.767 に答える
1

簡単な答え:できません。

長い答え:オペコードのオペランドの1つまたはいずれかが数値の即値である場合、それらを無視できる独自のdiffを記述します。

于 2011-01-24T16:58:36.990 に答える
0

sedまたはawk(またはperlまたは...)を使用して、diffを実行する前にすべてのオフセットを同一にするフィルターを作成できます。このようなフィルターを作成することは、読者の練習問題として残されています。:-P

于 2011-01-24T16:59:22.530 に答える
0

確かにbsdiffのようなものがその仕事をしますか?

于 2011-01-25T10:07:53.403 に答える