質問

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

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

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

役に立ちましたか?

解決 2

私は最終的にこれを解決し、生の指示を削除してマーカーを相殺したので、アセンブリのみがあり、SEDを使用してすべての数字を剥がし、1行しか構成しない変更を無視するためにDiffをフィルタリングしました。うまくいったことに少し驚きましたが、そうしました。

他のヒント

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

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

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

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

長い答え:数値の即時値である場合、オペコードのオペランドの1つまたはいずれかを無視できる独自の差分を書いてください。

SEDまたはawk(またはperlまたは...)を使用してフィルターを作成して、すべてのオフセットを同じように実行する前に同一にすることができます。このようなフィルターを書くことは、読者に運動として残されています。 :P

確かに何か bsdiff 仕事をするでしょうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top