介紹如何在 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)
hexdiffhexdiff 是一個專門用於比較兩個二進位檔案內容差異的工具,在 Ubuntu Linux 可以用 apt 直接安裝:
# 安裝 hexdiff
sudo apt install hexdiff
使用 hexdiff 比較 A.bin 與 B.bin 兩個二進位檔案內容:
# 比較 A.bin 與 B.bin 二進位檔案內容
hexdiff A.bin B.bin
binwalkbinwalk 是一個韌體影像檔分析工具,亦可用於普通的二進位檔案。在 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