3 つのバイナリ ファイルを比較して、1 と 2 の間で変更された部分と、2 と 3 の間で変更された部分のみを表示するにはどうすればよいでしょうか。

3 つのバイナリ ファイルを比較して、1 と 2 の間で変更された部分と、2 と 3 の間で変更された部分のみを表示するにはどうすればよいでしょうか。

バイナリ ファイル (メモリ ダンプ) が 3 つあります。それぞれfile1、、file2と呼びますfile3。ソフトウェアをデバッグしようとしていて、スイッチを切り替えています。

  • file1= スイッチを切る

  • file2= スイッチオン

  • file3= スイッチを切る

file1との間でどのバイトが変更されfile2、その後 の と同じ値 ( file1)に戻ったかを知る必要がありますfile3

間には無関係な変更が多数あるためfile1、それだけではこのスイッチを切り替えたときに何が変化するのかを判断するのに不十分です。 、、、…から変化するエントロピーの一意のバイトを識別しようとしています。file2difffile123

xxd、、、などdiffのツールがあることは知っています。ただ、この問題に対してそれらをどのように使用するのが最善かわかりません。vimdiffcolordiff

答え1

file1との間で変更されたバイトfile2とそれぞれの値を知るには、 を使用しますcmp -l

cmp -l file1 file2 > changes12

file3およびについても同様ですfile2。コツは常に同じ方向(ここでは、オフからオンに切り替える)で調査することです。そのため、file2最後に以下を配置します。

cmp -l file3 file2 > changes32

これで、同一の変更点を見つけることができます:

comm -12 changes12 changes32

出力は次のようになります (例):

     1629 152 112

これは、バイト1629(10 進数、番号は で始まる1) が152(8 進数)から112(8 進数) に変更されたことを意味します。


ノート:

  • cmp -l私の Ubuntu では、出力が「列化」されます。つまり、先頭にスペースのある行が印刷される可能性があり、最初の列の幅は入力サイズに依存します。一部の実装ではこれが行われない可能性があります。懸念事項がいくつかあります。
    • 元のファイルのサイズが異なる場合 (おそらくあなたの場合はそうではありません)、一方のcmpファイルの 1 列目がもう一方のファイルよりも広くなる可能性があります。後のコンテキストでは、commこれは受け入れられません。 にパイプすることで、出力を「デコラム化」できますawk '{print $1" "$2" "$3}'
    • 出力が「列化」されていない場合(または「列化解除」されている場合)、commファイルがソートされていないというエラーが表示されることがあります。に保存する前に、sort(ではなく) が必要です。これにより、予期しない順序が生成される場合があります(たとえば、異なるバイトが表示されます)。sort -nchangesAB23異なるバイト) が発生しますが、の100453出力を にパイプすることで修正できる可能性があります。commsort -n
  • changes*ファイルは巨大になる場合があります。中間的かつ一時的なものであるため、プロセス置換が適切なアプローチとなる場合があります。ただし、これは POSIX ではありません。

    # Korn shell syntax example
    comm -12 <(cmp -l file1 file2) <(cmp -l file3 file2)
    
  • からの出力を、commさらに別の および の別の出力と組み合わせて使用​​することで、cmp無関係な変更をより適切に除外できます。

    comm -12 changes12 changes32 > result1
    cmp -l file4 file5 | comm -12 - result1 > result2
    cmp -l file6 file5 | comm -12 - result2 > result3
    

    でも覚えておいて:


ドキュメンテーション:

答え2

私は Windows ユーザーであり、3 つのファイル (一度に 2 つ) を相互に比較するなど、ファイルの比較に長年 Beyond Compare を使用してきました。

Beyond Compare には Linux ディストリビューションもあるようなので、チェックしてみるといいかもしれません。

https://www.scootersoftware.com/download.php?zz=kb_linux_install

Windows 版には、相違点だけを表示するオプションや、役に立つかもしれない他の多くの機能があることは知っています。3 方向比較機能があるかどうかは覚えていません。

私は彼らの開発者でも営業でもありませんが、ただソフトウェアがとても好きなだけです。

答え3

Kamil からの返答に基づいて、必要なものを取得するためにこれを使用しました。

cmp -l file1 file2 | awk '{print $1" "$2" "$3}' | sort > changes_12

cmp -l file3 file2 | awk '{print $1" "$2" "$3}' | sort > changes_32

comm -12 変更_12 変更_32 > 共通変更

関連情報