RexCode logo 瑞碼工坊 RexCode

如何在 macOS 比對兩個二進位檔案(Hex Diff 完整教學)

二進位比對(Binary Diff)是在 byte 層級找出兩個檔案之間每一個差異位元組的技術。不同於文字 diff 只比對可讀行,binary diff 能處理任何格式——執行檔、韌體 blob、編譯輸出、圖片、資料庫檔、封包截圖——只要是二進位格式,它都能告訴你第幾個 offset 的 byte 從什麼值變成什麼值。

為什麼需要 Binary Diff?

在日常開發與維運中,以下幾個情境一定會讓你需要用到 binary diff:

韌體更新驗證:下載新版韌體後,你想確認更新了哪些區段、哪些位置的值改變了,而不是盲目信任版本號。比對新舊兩個 .bin.img,可以立刻找到差異 offset,搭配手冊確認改動是預期的 bug fix 還是意外的 regression。

Build 重現性確認(Reproducible Builds):Rust、C++、Go 在不同時間或不同機器 compile 出來的 binary 理論上應該是 bit-for-bit 相同的,但時間戳記嵌入、連結器順序、路徑字串都可能導致微小差異。用 binary diff 可以快速找出是哪個 section(.rodata.debug_info)引入了不一致。

惡意程式分析:安全研究員比對正常執行檔和被竄改版本,找出植入程式碼的起始 offset,是 binary diff 最經典的使用場景之一。即使你不是資安研究員,確認下載的二進位和官方 checksum 一致也是好習慣的延伸。

影像與資產驗證:PNG、JPEG、PDF、資料庫 .db 檔——同名檔案在不同系統同步後,用肉眼看不出差異,但 binary diff 能告訴你有沒有 byte 被修改,適合驗證備份完整性。

Compiled Protobuf / MessagePack 資料:序列化格式的二進位輸出很難直接閱讀,比對兩個版本的序列化結果時,binary diff 搭配 offset 資訊能快速縮小問題範圍。


工具對照表

工具 GUI Byte 級 Diff Offset 顯示 Hex 搜尋 免費 Apple Silicon
Lode Binary Diff ✅ 三色高亮 ✅ 原生
xxd + diff(Terminal) ❌ 純文字 ✅(間接) ✅ macOS 內建
hexdump -C + diff ❌ 純文字 ✅(間接) ✅ macOS 內建
HexFiend ✅ 並列
FileMerge(Xcode) ❌ 無法處理

簡短選購建議:想要最直觀的 GUI + 顏色高亮,用 Lode;想要無需安裝的 Terminal 方案,用 xxd + diff;想要功能完整的免費 hex editor,用 HexFiend;FileMerge 不適合 binary diff,遇到二進位檔案會直接報錯或顯示亂碼。


方法一:Lode Binary Diff(推薦)

Lode 是原生 macOS 工具(Tauri 2 + Rust),整合了六種工作模式——包含 Binary Compare 與 Hex View——在同一個 App 內。Binary Diff 模式採用雙欄並列設計,左右各顯示一個檔案的十六進位值與 ASCII 表示,差異位置即時高亮,不需要任何前置轉換。

操作步驟

步驟一:開啟 Lode,選擇 Binary Diff 模式

從 Dock 點擊 Lode 圖示,或用 Spotlight(⌘Space)搜尋「Lode」開啟。啟動後在頂端的模式選擇列點擊「Binary Diff」(有些版本顯示為「Hex View」)。

步驟二:載入兩個檔案

將第一個二進位檔案拖進左側面板,第二個拖進右側面板。也可以透過選單 File → Open 分別選取。Lode 支援任意大小的二進位檔案,後端用 Rust 非同步讀取,大型 firmware blob 或資料庫檔都不會卡住 UI。

步驟三:讀懂 Hex Diff 輸出

Lode 以十六進位(hex)搭配右側 ASCII 解碼的雙欄格式顯示兩個檔案。顏色語義如下:

顏色 意義
🟠 橙色 同位置 offset 的 byte 值不同(修改)
🟢 綠色 右側新增的 byte 區段(插入)
🔴 紅色 左側多出、右側缺少的 byte 區段(刪除)
白色 完全相同

每行的最左側欄位是十六進位 offset,例如 0x000012A0 代表從檔案開頭算起第 4768 個 byte。這個 offset 是你回報 bug 或撰寫 patch 時需要的精確位置。

步驟四:在差異之間快速導覽

視窗右側有差異導覽按鈕(向上 / 向下箭頭),或按 ⌘↓ 跳到下一處差異、⌘↑ 跳回上一處。對於有數百個差異的大型 binary,這個功能省下大量手動捲動時間。

步驟五:複製 Hex 值或 Offset 範圍

在任何高亮區域上按右鍵,可以複製選取範圍的十六進位值、十進位 offset 範圍、或 ASCII 解碼字串,方便直接貼入 bug report、patch note 或 Slack 訊息。

為什麼 Lode 的 Binary Diff 好用

文字 diff 工具(包括 FileMerge)遇到二進位檔案時,通常要嘛報錯,要嘛把整個檔案當成一行亂碼輸出。Lode 的 Binary Compare 模組是為 byte-level 比對而設計:行對齊採用 LCS(最長公共子序列)算法,確保即使兩個檔案長度不同、插入了新的 byte 區段,對齊仍然正確,不會因為一個 byte 的插入導致後面所有行都顯示為「不同」。


方法二:Terminal — xxd + diff

macOS 內建的 xxd 指令可以把任何 binary 轉成可讀的 hex dump 文字,再用 diff 比對兩個 hex dump,就能找出差異位置。這個方法不需要安裝任何東西,只要有 Terminal 就能用。

xxd /path/to/file1.bin > /tmp/a.hex
xxd /path/to/file2.bin > /tmp/b.hex
diff /tmp/a.hex /tmp/b.hex

xxd 的輸出格式每行顯示 16 bytes,格式是 offset: hex_values ascii_representation。例如:

00001200: 4865 6c6c 6f20 576f 726c 6400 0000 0000  Hello World.....

diff 輸出會標示哪幾行有差異(< 代表 file1,> 代表 file2)。你可以從行首的 offset 直接換算出差異在原始 binary 的哪個位置。

限制

如果只需要快速確認兩個小型 binary 是否完全相同(而不需要知道具體哪裡不同),cmp -l file1 file2md5 file1 && md5 file2 更快。


方法三:hexdump -C

hexdump -Cxxd 的替代方案,輸出格式稍有不同:

hexdump -C /path/to/file1.bin > /tmp/a.hex
hexdump -C /path/to/file2.bin > /tmp/b.hex
diff /tmp/a.hex /tmp/b.hex

-C 旗標同樣以十六進位 + ASCII 雙欄格式顯示,每行 16 bytes,行首是 offset。用法和 xxd + diff 幾乎相同,選哪個主要看個人習慣。xxd 的輸出格式在需要搭配 xxd -r 反轉回 binary 時更方便;hexdump -C 的格式在某些 Unix 系統上更普及。


方法四:HexFiend

HexFiend 是 macOS 上最知名的免費開源 hex editor,原生支援 Apple Silicon,可以開啟幾 GB 的大型 binary 而不佔用等量記憶體(streaming 讀取)。

HexFiend 提供「Compare Files」功能(Tools → Compare Files),可以並列顯示兩個檔案的 hex 並高亮差異,操作體驗接近 Lode 的 Binary Diff。如果你的主要需求是 hex 編輯(修改特定 offset 的值),HexFiend 是比 Lode 更合適的工具——Lode 的 Binary Diff 是唯讀比對,不提供編輯功能。

何時選 HexFiend vs Lode


Rex 的實際使用經驗

在開發 Lode 的過程中,我需要頻繁確認 Rust 編譯出來的二進位在不同 build 之間有沒有意外的差異。理論上 deterministic build 應該 bit-for-bit 相同,但我遇到過幾次 .debug_info section 因為路徑字串嵌入導致 hash 不一致的問題。

用 Lode 的 Binary Diff 比對兩個 .app/Contents/MacOS/lode 執行檔,可以在幾秒內找到差異集中在哪個 offset 區間,再搭配 nmdwarfdump 定位到具體的 symbol。相比之前用 xxd + diff,最大的差別是:xxd 方法在有「插入」的情況下對齊會亂掉,Lode 的 LCS 算法對齊是正確的,不會因為幾個 byte 的插入讓後面幾百行都顯示紅色。

另一個用到 binary diff 的情境是比對 SSD 韌體的 firmware blob。把新版和上一版的 .bin 拖進 Lode,一眼就能看出哪些 section 有改動,哪些是完全相同的——這個資訊在追蹤特定 regression 是哪個版本引入時非常有用,省去從 changelog 反推的時間。


常見問題

Q:如何在 macOS Terminal 比對兩個 binary 檔案?

最簡單的方法:xxd file1 > /tmp/a.hex && xxd file2 > /tmp/b.hex && diff /tmp/a.hex /tmp/b.hex。這會把兩個 binary 轉成 hex dump 文字再比對。如果只需要確認是否完全相同:cmp file1 file2(無輸出 = 完全相同)。

Q:Mac 上有免費的 Hex Diff 工具嗎?

有兩個主要選擇:Lode(整合式工作台,含 Binary Diff)和 HexFiend(專門的 hex editor,含 Compare Files 功能)。兩者都是免費的原生 macOS 工具,都支援 Apple Silicon。

Q:Binary Diff 和 Text Diff 有什麼差別?

Text diff 以「行」為單位比對,遇到二進位檔案會把無法顯示的 byte 當作亂碼,通常輸出 Binary files differ 就停止。Binary diff 以「byte」為單位比對,精確顯示每個不同 byte 的 offset 和值,適用於任何非文字格式的檔案。

Q:Lode 能開啟大型 binary 檔案嗎?

可以。Lode 的 binary 讀取後端用 Rust 非同步 I/O 實作,不會把整個檔案一次載入記憶體。幾百 MB 的 firmware blob 或資料庫 .db 檔都能正常開啟和比對,UI 不會因為讀取而卡頓。

🔨
本文介紹的工具:Lode

原生 macOS 工作台,整合 Folder Diff、File Diff、Binary Diff、全文搜尋,一個 App 搞定。