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

如何在Linux中比较二进制文件?

Advertisement

我需要比较两个二进制文件,并得到输出的形式。

<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>

每一个不同的字节。因此,如果file1.bin

00 90 00 11

二进制形式,而file2.bin

00 91 00 10

我想得到类似

00000001 90 91
  00000003 11 10

这样的东西,在Linux中有没有办法做到?我知道cmp -l,但它使用十进制系统来表示偏移量,而使用八进制来表示字节,这是我想避免的。

Advertisement
Advertisement

答案 (14)

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

这将以十六进制打印偏移量和字节数:

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

或者做$1-1,让第一个打印的偏移量从0开始。例如,

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$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

正如quack所指出的:

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

然后是

% diff b1.hex b2.hex

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

diff + xxd

diff 在下面的zsh/bash进程替换组合中尝试一下:

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

其中:

  • -y 并排显示出差异(可选)。
  • xxd是CLI工具,用于创建一个二进制文件的hexdump输出。
  • -W200中加入diff以获得更宽的输出(每行200个字符)。

colordiff + colordiff

xxd + colordiff

如果你有diff,它可以对sudo apt-get install colordiff输出进行着色,例如:

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

否则通过:vimdiff安装。

60
60
60
2010-03-29 15:41:30 +0000

有一个叫DHEX的工具可以完成这项工作,还有一个叫VBinDiff的工具。

28
Advertisement
28
28
2015-04-04 20:31:59 +0000
Advertisement

适用于字节添加/删除的方法*

diff <(od -An -tx1 -w1 -v file1) \
     <(od -An -tx1 -w1 -v file2)
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

生成一个测试用例,只删除一个字节64:

64d63
< 40

输出:

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

bdiff file1 file2

如果你也想看ASCII版本的字符:

64d63
< 40 @

输出:

&001

在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)

当使用hexdumps和text diff来比较二进制文件,特别是xxd时,增加和删除的字节变成了地址的移动,可能会让人看不清楚。这种方法告诉xxd不输出地址,每行只输出一个字节,这样就可以准确地显示出哪些字节被更改、添加或删除了。你可以通过在更 “正常 "的hexdump(xxd first.bin的输出)中寻找有趣的字节序列来查找地址。

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

我推荐用hexdump将二进制文件转储为文本格式,而用kdiff3将二进制文件转储为文本格式,然后用kdiff3来查看差异。

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

hexdiff是一个专门为你设计的程序,它的作用正是你要找的。

使用方法:

hexdiff file1 file2

它可以将两个文件的十六进制(和7位ASCII)的文件一个比一个高亮显示,如果有任何差异,就会被高亮显示。看man hexdiff在文件中移动的命令,简单的q就可以退出。

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

它可能不能严格地回答这个问题,但我用它来区别二进制文件:

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


它将两个文件都打印成十六进制和[ASCII](http://en.wikipedia.org/wiki/ASCII)的值,每行一个字节,然后使用Vim的diff工具将它们直观地呈现出来。
1
1
1
2019-07-25 12:42:04 +0000

固件分析工具binwalk也有这个功能,它的-W/--hexdump命令行选项提供了一些选项,比如只显示不同的字节:

-W, --hexdump Perform a hexdump / diff of a file or files
    -G, --green Only show lines containing bytes that are the same among all files
    -i, --red Only show lines containing bytes that are different among all files
    -U, --blue Only show lines containing bytes that are different among some files
    -w, --terse Diff all files, but only display a hex dump of the first file

在OP的例子中,当做binwalk -W file1.bin file2.bin时:

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

然后你可以使用以下命令来比较两个十六进制文件:

ubuntu> gvimdiff <hex-file1> <hex-file2>

Tha’s all. 希望对你有帮助!

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

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

DHEX是一个不只是另一个十六进制编辑器:它包含了一个diff模式,可以用来简单方便地比较两个二进制文件。由于它是基于 ncurses,而且是可主题化的,所以它可以在任何系统和场景下运行。通过对搜索日志的利用,它可以很容易地跟踪不同迭代文件的变化。

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

Linux上的开源产品(和其他一切)是Radare,它明确提供了radiff2。我投票决定关闭这个问题,因为我自己和其他人也有同样的问题,在你问的问题中

for every different byte

这简直是疯了。因为正如你所问的,如果你在文件的第一个字节插入一个字节,你会发现后面的每一个字节都不一样,所以 diff 会重复整个文件,实际的差别是一个字节。radiff -O的意思是"“用所有的字节来进行代码 diffing,而不是只用固定的 opcode 字节”“

0x000000a4 0c01 => 3802 0x000000a4
0x000000a8 1401 => 3802 0x000000a8
0x000000ac 06 => 05 0x000000ac
0x000000b4 02 => 01 0x000000b4
0x000000b8 4c05 => 0020 0x000000b8
0x000000bc 4c95 => 00a0 0x000000bc
0x000000c0 4c95 => 00a0 0x000000c0

和 IDA Pro 一样,Radare 是一个主要用于二进制分析的工具,你也可以用 -O 来显示 delta diffing,或者用 -d 来显示被分解的字节,而不是用 hex 来显示。

如果你在问这类问题,请查看

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

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

BinDiff是一款不错的UI工具,用于比较二进制文件,最近开源的二进制文件。

Advertisement

相关问题

6
10
5
37
3
Advertisement
Advertisement