Come confrontare i file binari su Linux

Pubblicato: 2022-08-20
Laptop Linux che mostra un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Come puoi verificare se due binari Linux sono uguali? Se sono file eseguibili, eventuali differenze potrebbero indicare un comportamento indesiderato o dannoso. Ecco il modo più semplice per verificare se differiscono.

Confronto di file binari

Linux è ricco di modi per confrontare e analizzare file di testo. Il comando diff confronterà due file per te ed evidenzierà le differenze. Può anche fornire alcune righe su entrambi i lati delle modifiche per fornire un contesto attorno alle righe modificate. E il comando colordiff aggiunge colore per rendere ancora più semplice l'analisi visiva delle differenze.

Gli sviluppatori e gli autori usano diff per evidenziare le differenze tra le diverse versioni dei file di codice sorgente del programma o dei testi bozza. È veloce e facile e non sono necessarie competenze tecniche per vedere le differenze tra le stringhe di testo.

Nel mondo dei file binari, le cose non sono così semplici. I file binari non sono composti da testo normale. Sono costituiti da molti byte contenenti valori numerici. Se si tratta di un file compresso come un archivio TAR o un file ZIP, quei valori rappresentano i file compressi che sono memorizzati all'interno del file di archivio, insieme alle tabelle di simboli necessarie per la decompressione e l'estrazione dei file.

Come confrontare due file di testo nel terminale Linux
CORRELATI Come confrontare due file di testo nel terminale Linux

Se il file binario è un file eseguibile, i valori numerici dei byte del file vengono interpretati come istruzioni di codice macchina per la CPU, metadati, etichette o dati codificati. È probabile che le modifiche a un file binario oa un file di libreria comportino differenze di comportamento quando il file binario viene eseguito o utilizzato da un'altra applicazione.

È facile falsificare la data e l'ora di creazione o modifica di un file. Ciò significa che potrebbero esserci due versioni di un file con lo stesso nome, dimensione del file, se le modifiche sostituiscono byte di contenuto esistente per byte, e timbri di data. Eppure, uno dei file potrebbe essere stato alterato.

Algoritmi hash sicuri

Un algoritmo hash sicuro è un algoritmo basato sulla matematica. Crea un valore a 64 bit eseguendo la scansione di tutti i byte in un file e applicando loro una trasformazione matematica per generare il valore hash. In qualsiasi giorno, lo stesso file produrrà sempre lo stesso hash. Anche una differenza di un byte risulterà in un hash radicalmente diverso.

Vedrai spesso l'hash di un file visualizzato nella sua pagina di download. Dovresti generare un hash per il file dopo averlo scaricato. Se è diverso dall'hash visualizzato sulla pagina web, sai che il file è compromesso. O è stato manomesso e sostituito con il file originale, per indurre le persone a scaricare il file contaminato, oppure è stato danneggiato durante il trasporto.

Sul nostro computer di prova abbiamo due copie dello stesso file, una libreria condivisa. I file sono stati rinominati in modo che possano trovarsi nella stessa directory. In teoria, questi file dovrebbero essere gli stessi. Dopotutto, dovrebbero essere la stessa versione della libreria condivisa.

 ls -l *.so 

Due file binari che sembrano uguali

I file hanno la stessa dimensione, la stessa data e la stessa data e ora. All'osservatore casuale, sembreranno la stessa cosa. Usiamo il comando sha256sum e generiamo un hash per ogni file.

 sha256sum file_binario1.so
 sha256sum file_binario2.so 

Generazione di hash per i due file binari

Gli hash sono completamente diversi, indicando chiaramente che ci sono differenze tra i due file. Se il sito Web mostra l'hash del file originale, puoi eliminare il file che non corrisponde.

Trovare le differenze

Se vuoi guardare i cambiamenti, ci sono modi per farlo anche tu. Non è necessario essere in grado di decompilare il file, né comprendere il codice assembly o macchina solo per vedere le modifiche. Comprendere cosa significano questi cambiamenti e qual è il loro scopo, ovviamente, richiederebbe una conoscenza tecnica più approfondita. Ma semplicemente sapere quanto siano sostanziali le modifiche può essere indicativo di cosa è successo al file.

Se utilizziamo diff sui due file binari, otterremo una risposta un po' deludente.

 diff file_binario1.so file_binario2.so 

L'uso di diff con due file binari fornisce pochissime informazioni

Sapevamo già che i file erano diversi. Proviamo cmp .

 cmp file_binario1.so file_binario2.so 

L'uso di cmp con due file binari fornisce un po' più di informazioni, ma non molte

Questo ci dice qualcosa in più. Il primo byte che differisce tra i due file è il byte numero 13451. Cioè, contato dall'inizio del file binario, il byte 13451 è diverso nei due file binari. Quindi 13451 è l'offset della prima differenza, dall'inizio del file.

Solo per caso, in tutto il file, ci saranno dei byte che contengono il valore esadecimale di 0x10. Questo è il valore che Linux usa nei file di testo come carattere di fine riga. Il comando cmp rilevato 131 byte con questo valore tra l'inizio del file binario e la posizione della prima differenza. Quindi pensa di essere sulla riga 132. Non significa davvero nulla in questo contesto.

Se aggiungiamo l'opzione -l (dettagliata) inizieremo a ottenere informazioni utili.

 cmp -l file_binario1.so file_binario2.so 

Usando l'opzione -l con cmp per elencare i byte modificati

Vengono elencati tutti i byte differenti. Vengono visualizzati il ​​numero di byte o l'offset, il valore del primo file e il valore del secondo file, con un byte per riga di output.

I valori dei byte sono mostrati in ottale, invece del solito formato esadecimale usato con i file binari. Tuttavia, abbiamo imparato qualcos'altro. Tutti i byte modificati sono in una sequenza continua. I loro offset vengono incrementati di uno per ogni byte.

Lo strumento hexdump un file binario nella finestra del terminale. Se utilizziamo l'opzione -C (canonical) l'output elencherà su ogni riga l'offset, i valori di 16 byte a quell'offset e, se ce n'è uno, la rappresentazione ASCII dei valori dei byte.

 hexdump -C file_binario1.so 

L'output canonico hexdump di un file binario

Possiamo usare l'output di hexdump come input per diff , lasciando che diff funzioni come se stesse leggendo due file di testo.

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

Utilizzo di diff e hexdump per ottenere le differenze tra due file

diff trova le righe diverse e mostra i valori di byte esadecimali del primo file sopra i valori del secondo file. L'offset della prima riga è 0x3480 o 13440 in decimale. In precedenza, cmp ci ha detto che la prima modifica è avvenuta al byte 13451, che è 0x348B. Ciò corrisponde effettivamente a ciò che vediamo qui.

L'output di diff è in blocchi di due byte. La prima coppia di byte sono i byte 0 e 1 dall'offset di 0x3480, il secondo blocco contiene i byte 2 e 3 dall'offset. Il blocco 6 conterrà i byte 0xA e 0xB o 10 e 11 in decimale. Questi sono i byte 13450 e 13451. E possiamo vedere che sono i primi byte che differiscono. Le prime cinque coppie di byte sono le stesse in entrambi i file.

Tuttavia, poiché diff conta dalla base zero, ciò che cmp chiama 13451 sarà il byte 13540 a diff . E per rendere le cose ancora più confuse, l'ordine dei byte in ogni blocco di due byte è invertito da diff . I byte sono effettivamente elencati in questo ordine: 1 e 0, 3 e 2, 5 e 4, 7 e 6 e così via.

Il comando è anche dispendioso dal punto di vista computazionale: due hexdumps e un diff tutti in una volta, soprattutto se i file confrontati sono di grandi dimensioni.

Ma se hexdump -C può inviare una versione ASCII del file binario alla finestra del terminale, perché non reindirizziamo l'output su file di testo e quindi confrontiamo questi due file di testo con diff ?

 hexdump -C file_binario1.so > binario1.txt
 hexdump -C file_binario2.so > binario2.txt
 diff binary1.txt binary2.txt 

Reindirizzamento hexdump per creare due file di testo e utilizzare diff per confrontare i file di testo

La differenza tra i due file viene mostrata in due brevi estratti. C'è una rappresentazione ASCII accanto a loro. Ci saranno un paio di estratti per ogni differenza tra i file. In questo esempio, c'è solo una differenza.

Va tutto bene, ma non sarebbe fantastico se ci fosse qualcosa che fa tutto questo per te?

VBinDiff

Il programma VBinDiff può essere installato dai soliti repository per tutte le principali distribuzioni. Per installarlo su Ubuntu, usa questo comando:

 sudo apt install vbindiff 

Installazione di VBinDiff su Ubuntu

Su Fedora, devi digitare:

 sudo dnf install vbindiff 

Installazione di VBinDiff su Fedora

Gli utenti di Manjaro devono usare pacman .

 sudo pacman -Sy vbindiff 

Installazione di VBinDiff su Fedora

Per utilizzare il programma, passa il nome dei due file binari sulla riga di comando.

 vbindiff file_binario1.so file_binario2.so 

Passaggio di due file binari a VBinDiff sulla riga di comando

Si apre l'applicazione basata su terminale, che mostra entrambi i file in una vista a scorrimento.

VBinDiff visualizza due file binari

È possibile utilizzare la rotellina del mouse o i tasti "UpArrow", "DownArrow", "Home", "End", "PageUp" e "PageDown" per spostarsi tra i file. Entrambi i file scorreranno.

Premi il tasto "Invio" per passare alla prima differenza. La differenza è evidenziata in entrambi i file.

VBinDiff che evidenzia le differenze tra due file binari

Se ci fossero più differenze, premendo "Invio" verrà visualizzata la differenza successiva. Premendo “q” o “Esc” si esce dal programma.

Qual è la differenza?

Se stai lavorando su un computer che appartiene a qualcun altro e non ti è permesso installare alcun pacchetto, puoi usare cmp , diff e hexdump . Se è necessario acquisire l'output per un'ulteriore elaborazione, questi sono anche gli strumenti da utilizzare.

Ma se ti è permesso installare pacchetti, VBinDiff rende il tuo flusso di lavoro più semplice e veloce. E in effetti, usare VBinDiff con un singolo file binario è un modo semplice e conveniente per sfogliare i file binari, il che è un bel bonus.

CORRELATO: Come sbirciare all'interno di file binari dalla riga di comando di Linux