374 linux diff binary-files
我需要比较两个二进制文件并以以下形式获取输出:
<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>
对于每个不同的字节。所以如果file1.bin是
  00 90 00 11
Run Code Online (Sandbox Code Playgroud)
以二进制形式并且file2.bin是
  00 91 00 10
Run Code Online (Sandbox Code Playgroud)
我想得到类似的东西
  00000001 90 91
  00000003 11 10
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Linux 中做到这一点?我知道,cmp -l但它使用十进制表示偏移量,使用八进制表示字节,这是我想避免的。
Den*_*son 213
这将以十六进制打印偏移量和字节:
cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'
Run Code Online (Sandbox Code Playgroud)
或者$1-1让第一个打印的偏移量从 0 开始。
cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
Run Code Online (Sandbox Code Playgroud)
不幸的是,它strtonum()是 GAWK 特有的,因此对于其他版本的 awk(例如,mawk),您将需要使用八进制到十进制的转换函数。例如,
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)}'
Run Code Online (Sandbox Code Playgroud)
为可读性而拆分:
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)
          }'
Run Code Online (Sandbox Code Playgroud)
        aki*_*ira 210
正如~quack指出的那样:
 % xxd b1 > b1.hex
 % xxd b2 > b2.hex
Run Code Online (Sandbox Code Playgroud)
进而
 % diff b1.hex b2.hex
Run Code Online (Sandbox Code Playgroud)
或者
 % vimdiff b1.hex b2.hex
Run Code Online (Sandbox Code Playgroud)
        ken*_*orb 143
diff + xxd尝试diff以下 zsh/bash 进程替换组合:
diff -y <(xxd foo1.bin) <(xxd foo2.bin)
Run Code Online (Sandbox Code Playgroud)
在哪里:
-y 并排显示差异(可选)。xxd 是用于创建二进制文件的 hexdump 输出的 CLI 工具。-W200到diff更广泛的输出(每行 200 个字符)。colordiff按如下所示使用。colordiff + xxd如果你有colordiff,它可以为diff输出着色,例如:
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
Run Code Online (Sandbox Code Playgroud)
否则安装通过:sudo apt-get install colordiff。
示例输出:
vimdiff + xxd你也可以使用vimdiff,例如
vimdiff <(xxd foo1.bin) <(xxd foo2.bin)
Run Code Online (Sandbox Code Playgroud)
提示:
-l1000为每个文件添加限制(例如)xxdnjd*_*njd 65
有一个名为DHEX的工具可以完成这项工作,还有另一个名为VBinDiff的工具。
对于严格的命令行方法,请尝试jojodiff。
Cir*_*郝海东 33
适用于字节添加/删除的方法
diff <(od -An -tx1 -w1 -v file1) \
     <(od -An -tx1 -w1 -v file2)
Run Code Online (Sandbox Code Playgroud)
生成一个单次删除字节 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
Run Code Online (Sandbox Code Playgroud)
输出:
64d63
<  40
Run Code Online (Sandbox Code Playgroud)
如果您还想查看字符的 ASCII 版本:
bdiff() (
  f() (
    od -An -tx1c -w1 -v "$1" | paste -d '' - -
  )
  diff <(f "$1") <(f "$2")
)
bdiff file1 file2
Run Code Online (Sandbox Code Playgroud)
输出:
64d63
<   40   @
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 16.04 上测试。
我喜欢od过xxd,因为:
xxd不是(Vim 附带)-An删除地址列,没有awk。命令解释:
-An删除地址列。这很重要,否则所有行在添加/删除字节后都会有所不同。-w1每行放置一个字节,以便 diff 可以使用它。每行有一个字节是至关重要的,否则删除后的每一行都会变得异相并有所不同。不幸的是,这不是 POSIX,而是存在于 GNU 中。-tx1 是您想要的表示,更改为任何可能的值,只要每行保留 1 个字节。-v防止星号重复缩写*可能会干扰差异paste -d '' - -每两行连接一次。我们需要它,因为十六进制和 ASCII 进入单独的相邻行。摘自:https : //stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next()来定义bdiff而不是{}限制内部函数的范围f,另见:https : //stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bash也可以看看:
Evg*_*eny 15
简答
vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)
Run Code Online (Sandbox Code Playgroud)
当使用 hexdumps 和 text diff 比较二进制文件时,尤其是xxd. 这个方法告诉 xxd 不输出地址,每行只输出一个字节,这反过来又准确地显示了哪些字节被更改、添加或删除。您可以稍后通过在更“正常”的十六进制转储(输出xxd first.bin)中搜索有趣的字节序列来找到地址。
小智 12
我建议使用 hexdump 将二进制文件转储为文本格式,使用 kdiff3 进行差异查看。
hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex
Run Code Online (Sandbox Code Playgroud)
        小智 6
该hexdiff程序旨在完全满足您的需求。
用法:
hexdiff file1 file2
Run Code Online (Sandbox Code Playgroud)
它显示两个文件的十六进制(和 7 位 ASCII),并突出显示任何差异。查看在man hexdiff文件中移动的命令,一个简单的命令q就会退出。
固件分析工具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
Run Code Online (Sandbox Code Playgroud)
在 OP 的示例中,执行以下操作binwalk -W file1.bin file2.bin:
添加| less -r用于分页。