如何在 Linux 上比較二進製文件

如何檢查兩個 Linux 二進製文件是否相同? 如果它們是可執行文件,則任何差異都可能意味著不需要的或惡意的行為。 這是檢查它們是否不同的最簡單方法。

比較二進製文件

Linux 有豐富的方法來比較和分析文本文件。 這 diff 該命令將為您比較兩個文件並突出顯示差異。 您甚至可以在更改的任一側提供幾行,以圍繞更改的行提供一些上下文。 和 colordiff 該命令添加顏色以更容易直觀地分析差異。

開發人員和作者使用 diff 突出顯示程序源代碼文件或文本草稿的不同版本之間的差異。 它快速簡單,您不需要技術知識即可查看文本字符串之間的差異。

在二進製文件的世界裡,事情並不是那麼簡單。 二進製文件不是由純文本組成的。 它們由許多包含數值的字節組成。 如果是壓縮文件,例如 TAR 文件或 ZIP 文件,則這些值表示存檔中存儲的壓縮文件,以及解壓縮和提取文件所需的符號表。

如果二進製文件是可執行文件,則文件中字節的數值被解釋為對 CPU、元數據、標籤或編碼數據的機器代碼指令。 當二進製文件被另一個應用程序執行或使用時,對二進製文件或庫文件的更改可能會導致行為差異。

欺騙文件的創建或修改日期和時間很容易。 這意味著可能有兩個版本的文件具有相同的名稱、文件大小(如果更改逐字節替換現有內容)和時間戳。 然而,其中一個文件可能已被篡改。

安全散列算法

一個安全哈希算法它是一種基於數學的算法。 它通過掃描文件中的所有字節並對它們應用數學變換以生成哈希值來創建一個 64 位值。 在任何一天,同一個文件總是會產生相同的哈希值。 即使是一個字節的差異也會導致完全不同的哈希值。

您經常會在其下載頁面上看到文件的哈希值。 下載文件後,您必須為其生成哈希。 如果它與網頁上顯示的哈希值不同,您就知道該文件已被盜用。 它要么已被篡改並替換了原始文件(因此人們下載了受污染的文件),要么在傳輸過程中已損壞。

在我們的測試計算機上,我們有同一個文件的兩個副本,一個共享庫。 文件已重命名,因此它們可以位於同一目錄中。 理論上,這些文件應該是相同的。 畢竟,它們應該是共享庫的相同版本。

                      ls -l *.so
                    

這些文件具有相同的大小、相同的日期戳和相同的時間戳。 對於不經意的觀察者來說,它們看起來是一樣的。 讓我們使用 sha256sum 命令並為每個文件生成一個哈希。

                      sha256sum binary_file1.so
                    
                      sha256sum binary_file2.so
                    

Generando hashes para los dos archivos binarios

哈希完全不同,清楚地表明兩個文件之間存在差異。 如果網站顯示原始文件的哈希,您可以丟棄不匹配的文件。

找出差異

如果您想查看更改,也有辦法做到這一點。 您不需要能夠反編譯該文件,或理解彙編或機器代碼只是為了查看修改。 理解這些變化意味著什麼以及它們的目的是什麼當然需要更深入的技術知識。 但是只要知道這些變化有多大就可以表明文件發生了什麼。

如果我們使用 diff 在這兩個二進製文件上,我們會得到一些令人失望的回應。

                      diff binary_file1.so binary_file2.so
                    

Usar diff con dos archivos binarios da muy poca información

我們已經知道這些文件是不同的。 我們試試看 cmp .

                      cmp binary_file1.so binary_file2.so
                    

Usar cmp con dos archivos binarios da un poco más de información, pero no mucha

這告訴我們更多。 兩個文件不同的第一個字節是字節數13451。即從二進製文件的開頭算起,兩個二進製文件的字節13451不同。 所以 13451 是第一個差異的偏移量,從文件的開頭開始。

無論如何,在整個文件中,都會有包含十六進制值 0x10 的字節。 這是 Linux 在文本文件中用作行尾字符的值。 這 cmp 該命令在二進製文件的開頭和第一個差異的位置之間找到了具有此值的 131 個字節。 所以你認為你在第 132 行。在這種情況下,它並沒有任何意義。

如果我們添加 -l (詳細)我們將開始獲得有用的信息。

                      cmp -l binary_file1.so binary_file2.so
                    

Usando la opción -l con cmp para listar los bytes cambiados

列出了所有不同的字節。 顯示字節數或偏移量、第一個文件的值和第二個文件的值,每行輸出一個字節。

字節值為以八進制顯示代替通常的十六進制格式與二進製文件一起使用。 但是,我們學到了其他東西。 所有修改的字節都是連續的。 它們的偏移量每字節增加一。

hexdump 該工具會將二進製文件轉儲到終端窗口。 如果我們使用 -C (規範)輸出將在每一行上列出偏移量,該偏移量處的 16 字節值,如果有的話,字節值的 ASCII 表示。

                      hexdump -C binary_file1.so
                    

La salida canónica hexdump de un archivo binario

我們可以使用輸出 hexdump 作為輸入 diff 離開 diff 它就像在讀取兩個文本文件一樣工作。

                      diff <(hexdump binary_file1.so) <(hexdump binary_file2.so)
                    

Usando diff y hexdump para obtener las diferencias entre dos archivos

diff 查找不同的行,並顯示第一個文件中的十六進製字節值,而不是第二個文件中的值。 第一行的偏移量是十進制的 0x3480 或 13440。 早些時候, cmp 告訴我們第一個變化發生在字節 13451,即 0x348B。 這真的與我們在這裡看到的相符。

的輸出 diff 它是兩個字節的塊。 第一對字節是 0x3480 偏移量的字節 0 和 1,第二塊包含偏移量的字節 2 和 3。 塊 6 將包含字節 0xA 和 0xB,或十進制的 10 和 11。 這些是字節 13450 和 13451。我們可以看到它們是第一個不同的字節。 兩個文件中的前五對字節相同。

然而,由於 diff 從零開始計數,什麼 cmp 調用 13451 將字節 13540 到 diff . 更令人困惑的是,每個兩字節塊中的字節順序顛倒了 diff . 字節按以下順序編號:1 和 0、3 和 2、5 和 4、7 和 6,依此類推。

該命令在計算上也很昂貴:兩個 hexdumps 和一個 diff 一次完成,尤其是在被比較的文件很大的情況下。

但是,是的 hexdump -C 可以將二進製文件的 ASCII 版本輸出到終端窗口,我們為什麼不將輸出重定向到文本文件,然後將這兩個文本文件與 diff ?

                      hexdump -C binary_file1.so > binary1.txt
                    
                      hexdump -C binary_file2.so > binary2.txt
                    
                      diff binary1.txt binary2.txt
                    

Redirigir hexdump para crear dos archivos de texto y usar diff para comparar los archivos de texto

這兩個文件之間的差異顯示在兩個簡短的摘錄中。 它們旁邊有一個 ASCII 表示。 文件之間的每個差異都會有幾個摘錄。 在這個例子中,只有一個區別。

這很好,但如果有什麼可以為你做這一切,那不是很好嗎?

VBinDiff

VBinDiff 程序可以從所有主要發行版的常用存儲庫中安裝。 安裝它Ubuntu, 使用這個命令:

                      sudo apt install vbindiff
                    

Instalación de VBinDiff en Ubuntu

在 Fedora 中你應該寫:

                      sudo dnf install vbindiff
                    

Instalación de VBinDiff en Fedora

Manjaro 用戶需要使用 pacman .

                      sudo pacman -Sy vbindiff
                    

Instalación de VBinDiff en Fedora

要使用該程序,請在命令行上傳遞兩個二進製文件的名稱。

                      vbindiff binary_file1.so binary_file2.so
                    

Pasar dos archivos binarios a VBinDiff en la línea de comando

基於終端的應用程序打開,在滾動視圖中顯示這兩個文件。

VBinDiff mostrando dos archivos binarios

您可以使用鼠標滾輪或“向上箭頭”、“向下箭頭”、“Home”、“End”、“Page Up”和“Page Up”鍵來瀏覽文件。 兩個文件都會滾動。

點擊“Enter”跳轉到第一個差異。 兩個文件中都突出顯示了差異。

VBinDiff resaltando las diferencias entre dos archivos binarios

如果有更多差異,點擊“Enter”將顯示下一個差異。 按“q”或“Esc”將退出程序。

有什麼區別?

如果您正在使用屬於其他人的計算機並且無法安裝任何軟件包,則可以使用 cmp , diff hexdump . 如果您需要捕獲輸出以進行進一步處理,這些工具也是可以使用的。

但如果您有安裝包的權限,VBinDiff 會讓您的工作流程更輕鬆、更快捷。 而且,事實上,將 VBinDiff 與單個二進製文件一起使用是一種在二進製文件中導航的簡單方便的方法,這是一個不錯的好處。

如何從 Linux 命令行查看二進製文件

相關文章