2010-03-29 15:28:57 +0000 2010-03-29 15:28:57 +0000
324
324

Linuxでバイナリファイルを比較するには?

I need to compare two binary files and get the output in the form:

<fileoffset-hex> ♦♦

♦各異なるバイトのために、2つのバイナリファイルを比較して出力を得る必要がある。で、もしfile1.binがバイナリで

00 90 00 11

なら、file2.bin

00 91 00 10

のようなものを取得したいのだが、Linuxではどうすればいいのだろう?cmp -lは知っていますが、オフセットには10進法を使い、バイトには8進法を使っているので避けたいです。

回答 (14)

182
182
182
2010-03-29 16:30:19 +0000

これはオフセットとバイトを16進数で印刷します:

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'

または最初に印刷されたオフセットが0から始まるように$1-1をします。

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'

残念ながら、strtonum()はAWKに特有です、従ってawk-e.g.、mawk-の他のバージョンのために8進数から10進数への変換関数を使用する必要があります。例えば、

cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct, dec) {for (i = 1; i <= length(oct); i++) {dec *= 8; dec += substr(oct, i, 1)}; return dec} {printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)}'

可読性のためのブロークンアウト:

cmp -l file1.bin file2.bin |
    mawk 'function oct2dec(oct, dec) {
              for (i = 1; i <= length(oct); i++) {
                  dec *= 8;
                  dec += substr(oct, i, 1)
              };
              return dec
          }
          {
              printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)
          }'
174
174
174
2010-03-29 16:07:55 +0000

ご指摘のように:

% xxd b1 > b1.hex
 % xxd b2 > b2.hex

そして % diff b1.hex b2.hex

または

% vimdiff b1.hex b2.hex
112
112
112
2015-09-05 21:14:55 +0000

diff + xxd

diffを次のようなzsh/bashプロセス置換の組み合わせで試してみてください:

diff -y <(xxd foo1.bin) <(xxd foo2.bin)

ここでは:

  • -yは、横に並べて違いを表示します(オプション)。
  • xxdはバイナリファイルの16進ダンプ出力を作成するCLIツールです。
  • -W200diffを追加すると、より広い出力(1行200文字程度)になります。
  • 色については、以下のようにcolordiffを使用します。

colordiff + xxd

colordiffがあれば、diffの出力に色をつけることができ、例えば:

colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)

それ以外の場合は: sudo apt-get install colordiff経由でインストールします。

サンプル出力:

vimdiff + xxd

などのように vimdiff を使うこともできます。

60
60
60
2010-03-29 15:41:30 +0000
28
28
28
2015-04-04 20:31:59 +0000

バイトの追加/削除

diff <(od -An -tx1 -w1 -v file1) \
     <(od -An -tx1 -w1 -v file2)

バイト64の単一の除去とテストケースを生成します:

for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1
for i in `seq 128`; do if ["$i" -ne 64]; then printf "%02x" $i; fi; done | xxd -r -p > file2

出力:

64d63
< 40

あなたはまた、文字のASCIIバージョンを見たい場合:

bdiff() (
  f() (
    od -An -tx1c -w1 -v "$1" | paste -d '' - -
  )
  diff <(f "$1") <(f "$2")
)

bdiff file1 file2

出力:

64d63
< 40 @

Ubuntu 16でテストされています。 04。

私は以下の理由でod上のxxdを好む:

参照:

14
14
14
2015-04-22 12:10:51 +0000

ショートアンサー

vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)

16進ダンプやテキスト diff を使ってバイナリファイルを比較する場合、特に xxd のように、バイトの追加や削除がアドレッシングのシフトになってしまい、見づらくなることがあります。この方法では、xxd にアドレスを出力せず、1 行に 1 バイトだけ出力するようにして、どのバイトが変更・追加・削除されたかを正確に表示します。この方法では、xxd はアドレスを出力せず、1 行に 1 バイトだけを出力し、どのバイトが変更されたり追加されたり削除されたりしたかを正確に表示します。

11
11
11
2013-06-12 07:46:34 +0000

バイナリファイルをテキスト形式にダンプするには hexdump を、差分を表示するには kdiff3 をお勧めします。

6
6
6
2015-10-07 04:11:31 +0000

hexdiffはあなたが探しているものを正確に行うように設計されたプログラムです。

使い方:

hexdiff file1 file2

それはハイライトされた相違点と他の上の1つの2つのファイルの16進数(および7ビットASCII)を表示します。ファイルの中で動き回るコマンドのために man hexdiff を見て、簡単な q は終了します。

4
4
4
2011-09-07 15:47:54 +0000

これは厳密には答えになっていないかもしれませんが、私はこれをバイナリの差分に使っています:

gvim -d <(xxd -c 1 ~/file1.bin | awk '{print $2, $3}') <(xxd -c 1 ~/file2.bin | awk '{print $2, $3}')

両方のファイルを16進数とASCIIの値として1行に1バイトずつ出力し、Vimの差分機能を使って視覚的に表示しています。

1
1
1
2019-07-25 12:42:04 +0000

ファームウェア解析ツールbinwalkには、「-W/--hexdumpコマンドラインオプション」(https://github.com/ReFirmLabs/binwalk/wiki/Usage#-w—hexdump)の機能があり、異なるバイトのみを表示するオプションを提供しています。

1
1
1
2018-10-08 13:52:19 +0000

vim-gui-commonパッケージに含まれている **gvimdiff ツールを使用することができます

sudo apt-get update

sudo apt-get install vim-gui-common

そうすれば、次のコマンドで2つの16進数ファイルを比較することができます。希望のthaの助け!

0
0
0
2017-08-18 11:25:28 +0000

dhex http://www.dettus.net/dhex/

DHEX は単なる 16 進数エディタではありません。それはncursesをベースにしており、テーマを設定できるので、任意の数のシステムやシナリオで実行することができます。検索ログを利用することで、ファイルの異なる反復での変更を簡単に追跡することができます。

-1
-1
-1
2018-11-09 04:18:32 +0000

Linuxのオープンソース製品(と他のすべてのもの)には、この目的のために明示的に radiff2 を提供している Radare があります。私はこれを閉じるために投票したので、私自身と他の人は、あなたが

for every different byte

を求める質問で、同じ質問を持っていますが、それは非常識です。なぜなら、質問のように、ファイルの最初のバイトに1バイトを挿入した場合、それ以降のバイトがすべて異なることに気づくでしょうから、実際には1バイトの違いのために、差分はファイル全体を繰り返すことになるからです。radiff -O は “"固定オペコードのバイトだけではなく、すべてのバイトを使ってコードの差分を取る” のためのものです。

でもこの手の質問をしている人は、ソフトウェアの質問は

-1
-1
-1
2016-03-23 20:18:41 +0000

https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html

BinDiffは、最近オープンソース化されたバイナリファイルを比較するための素晴らしいUIツールです。

関連する質問

6
10
5
37
16