介紹如何在 Linux 系統下使用 xxd
、od
、diff
、hexdiff
與 binwalk
等指令比較兩個二進位檔案之間的差異處。
xxd
與 diff
在 Linux 中若要比較兩個二進位檔案內容的差異,最基礎的作法就是使用 xxd
將二進位檔案內容轉為十六進位碼,再搭配 diff
來比較兩個檔案的差異:
# 轉為十六進位碼 xxd A.bin > A.hex xxd B.bin > B.hex # 以 diff 比較檔案差異 diff A.hex B.hex
16c16 < 000000f0: 3139 3130 3533 3239 3037 362e 3100 0200 19105329076.1... --- > 000000f0: 3139 3130 3533 3239 3037 362e 3200 0200 19105329076.2... 29c29 < 000001c0: 3239 3037 362e 3100 0800 2000 4441 0800 29076.1... .DA.. --- > 000001c0: 3239 3037 362e 3200 0800 2000 4441 0800 29076.2... .DA.. 41c41 < 00000280: 3536 3938 3531 2e35 3130 2000 0e00 5549 569851.510 ...UI --- > 00000280: 3536 3938 3531 2e35 3030 2000 0e00 5549 569851.500 ...UI 61c61 < 000003c0: 1300 4953 0200 3120 ..IS..1 --- > 000003c0: 1300 4953 0200 3220 ..IS..2
如果不想要額外建立兩個十六進位碼的檔案,可以直接用資料流的方式將十六進位碼導入 diff
,這樣的效果完全相同,除了不需要建立額外的檔案之外,語法也更簡潔:
# 以 xxd 搭配 diff 比較檔案差異 diff <(xxd A.bin) <(xxd B.bin)
而這裡的 diff
指令亦可替換為彩色的 colordiff
:
# 以 xxd 搭配 colordiff 比較檔案差異 colordiff <(xxd A.bin) <(xxd B.bin)
或是使用 vimdiff
也可以:
# 以 xxd 搭配 vimdiff 比較檔案差異 vimdiff <(xxd A.bin) <(xxd B.bin)
亦可使用視窗化的 gvimdiff
:
# 以 xxd 搭配 gvimdiff 比較檔案差異 gvimdiff <(xxd A.bin) <(xxd B.bin)
od
與 diff
將二進位檔案轉為十六進位碼的工具有很多,除了 xxd
之外,od
也是很常被使用的工具,使用方式跟 xxd
類似,以下是替換為 od
的範例。
# 以 od 搭配 diff 比較檔案差異 diff <(od A.bin) <(od B.bin) # 以 od 搭配 colordiff 比較檔案差異 colordiff <(od A.bin) <(od B.bin) # 以 od 搭配 vimdiff 比較檔案差異 vimdiff <(od A.bin) <(od B.bin) # 以 od 搭配 gvimdiff 比較檔案差異 gvimdiff <(od A.bin) <(od B.bin)
hexdiff
hexdiff
是一個專門用於比較兩個二進位檔案內容差異的工具,在 Ubuntu Linux 可以用 apt 直接安裝:
# 安裝 hexdiff
sudo apt install hexdiff
使用 hexdiff
比較 A.bin
與 B.bin
兩個二進位檔案內容:
# 比較 A.bin 與 B.bin 二進位檔案內容
hexdiff A.bin B.bin
binwalk
binwalk 是一個韌體影像檔分析工具,亦可用於普通的二進位檔案。在 Ubuntu Linux 中可以使用 apt 安裝 binwalk
:
# 安裝 binwalk
sudo apt install binwalk
使用 binwalk
比較 A.bin
與 B.bin
兩個二進位檔案內容:
# 比較 A.bin 與 B.bin 二進位檔案內容 binwalk -W file1.bin file2.bin
只顯示有差異的內容:
# 比較 A.bin 與 B.bin 二進位檔案內容(只顯示有差異的內容) binwalk -Wi file1.bin file2.bin