Cum se compară fișierele binare pe Linux

Publicat: 2022-08-20
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Cum poți verifica dacă două binare Linux sunt la fel? Dacă sunt fișiere executabile, orice diferență ar putea însemna un comportament nedorit sau rău intenționat. Iată cel mai simplu mod de a verifica dacă diferă.

Compararea fișierelor binare

Linux este bogat în moduri de a compara și analiza fișiere text. Comanda diff va compara două fișiere pentru dvs. și va evidenția diferențele. Poate oferi chiar și câteva linii de ambele părți ale modificărilor pentru a oferi un context în jurul liniilor modificate. Și comanda colordiff adaugă culoare pentru a ușura și mai ușor analiza vizuală a diferențelor.

Dezvoltatorii și autorii folosesc diff pentru a evidenția diferențele dintre diferitele versiuni ale fișierelor de cod sursă de program sau textele nefinalizate. Este rapid și ușor și nu aveți nevoie de abilități tehnice pentru a vedea diferențele dintre șirurile de text.

În lumea fișierelor binare, lucrurile nu sunt atât de simple. Fișierele binare nu sunt compuse din text simplu. Sunt formați din mulți octeți care conțin valori numerice. Dacă este un fișier comprimat, cum ar fi o arhivă TAR sau un fișier ZIP, acele valori reprezintă fișierele comprimate care sunt stocate în interiorul fișierului arhivă, împreună cu tabelele de simboluri care sunt necesare pentru decomprimarea și extragerea fișierelor.

Cum să comparați două fișiere text în terminalul Linux
RELATE Cum se compară două fișiere text în terminalul Linux

Dacă fișierul binar este un fișier executabil, valorile numerice ale octeților fișierului sunt interpretate ca lucruri precum instrucțiuni de cod de mașină pentru CPU, metadate, etichete sau date codificate. Modificările la un fișier binar sau la un fișier de bibliotecă pot duce la diferențe de comportament atunci când binarul se execută sau este utilizat de o altă aplicație.

Este ușor să falsificați data și ora creării sau modificării unui fișier. Aceasta înseamnă că ar putea exista două versiuni ale unui fișier care au același nume, dimensiunea fișierului - dacă modificările înlocuiesc octetul de conținut existent pentru octet - și ștampile de dată. Și totuși, este posibil ca unul dintre fișiere să fi fost modificat.

Algoritmi de hash securizat

Un algoritm hash securizat este un algoritm bazat pe matematică. Acesta creează o valoare de 64 de biți prin scanarea tuturor octeților dintr-un fișier și aplicarea unei transformări matematice pentru a genera valoarea hash. În orice zi, același fișier va produce întotdeauna același hash. Chiar și o diferență de un octet va avea ca rezultat un hash radical diferit.

Veți vedea adesea hash-ul unui fișier afișat pe pagina de descărcare. Ar trebui să generați un hash pentru fișier odată ce l-ați descărcat. Dacă este diferit de hash-ul afișat pe pagina web, știți că fișierul este compromis. Fie că a fost manipulat și înlocuit cu fișierul autentic - pentru a-i face pe oameni să descarce fișierul contaminat - sau a fost corupt în tranzit.

Pe computerul nostru de testare, avem două copii ale aceluiași fișier, o bibliotecă partajată. Fișierele au fost redenumite astfel încât să poată fi în același director. În teorie, aceste fișiere ar trebui să fie aceleași. La urma urmei, ar trebui să fie aceeași versiune a bibliotecii partajate.

 ls -l *.deci 

Două fișiere binare care apar la fel

Fișierele au aceeași dimensiune, aceleași ștampile de dată și aceleași ștampile de timp. Pentru observatorul ocazional, ele vor părea a fi la fel. Să folosim comanda sha256sum și să generăm un hash pentru fiecare fișier.

 sha256sum binary_file1.so
 sha256sum binary_file2.so 

Generarea hash-urilor pentru cele două fișiere binare

Hashurile sunt complet diferite, indicând clar că există diferențe între cele două fișiere. Dacă site-ul web afișează hash-ul fișierului autentic, puteți renunța la fișierul care nu se potrivește.

Găsirea diferențelor

Dacă vrei să te uiți la modificări, există și modalități de a face asta. Nu trebuie să puteți decompila fișierul și nici să înțelegeți codul de asamblare sau mașină doar pentru a vedea modificările. Înțelegerea a ceea ce înseamnă aceste modificări și care este scopul lor, desigur, ar necesita cunoștințe tehnice mai aprofundate. Dar pur și simplu știind cât de substanțiale sunt modificările poate fi un indicativ pentru ceea ce s-a întâmplat cu fișierul.

Dacă folosim diff pe cele două fișiere binare, vom obține un răspuns puțin dezamăgitor.

 diff fișier_binar1.deci fișier_binar2.deci 

Folosirea diff cu două fișiere binare oferă foarte puține informații

Știam deja că fișierele sunt diferite. Să încercăm cmp .

 cmp fișier_binar1.deci fișier_binar2.deci 

Utilizarea cmp cu două fișiere binare oferă puțin mai multe informații, dar nu multe

Asta ne spune un pic mai mult. Primul octet care diferă între cele două fișiere este octetul numărul 13451. Adică, numărat de la începutul fișierului binar, octetul 13451 este diferit în cele două fișiere binare. Deci 13451 este offset-ul primei diferențe, de la începutul fișierului.

Doar întâmplător, în tot fișierul, vor exista octeți care conțin valoarea hexazecimală 0x10. Aceasta este valoarea pe care Linux o folosește în fișierele text ca caracter de final de linie. Comanda cmp a întâlnit 131 de octeți cu această valoare între începutul fișierului binar și locația primei diferențe. Deci crede că este pe linia 132. Chiar nu înseamnă nimic în acest context.

Dacă adăugăm opțiunea -l (verboză), vom începe să obținem informații utile.

 cmp -l fișier_binar1.deci fișier_binar2.deci 

Folosind opțiunea -l cu cmp pentru a lista octeții modificați

Sunt listați toți octeții diferiți. Numărul octetului sau offset-ul, valoarea din primul fișier și valoarea din al doilea fișier sunt afișate, cu un octet pe linie de ieșire.

Valorile octeților sunt afișate în octal, în loc de formatul hexazecimal obișnuit utilizat cu fișierele binare. Cu toate acestea, am învățat altceva. Toți octeții modificați sunt într-o secvență continuă. Offset-urile lor sunt incrementate cu unul pentru fiecare octet.

Instrumentul hexdump va arunca un fișier binar în fereastra terminalului. Dacă folosim opțiunea -C (canonică), ieșirea va enumera pe fiecare linie offset-ul, valorile de 16 octeți la acel offset și, dacă există unul, reprezentarea ASCII a valorilor octetilor.

 hexdump -C fișier_binar1.deci 

Ieșirea canonică hexdump a unui fișier binar

Putem folosi ieșirea din hexdump ca intrare în diff , lăsând diff să funcționeze ca și cum ar citi două fișiere text.

 diff <(hexdump fișier_binar1.so) <(hexdump fișier_binar2.so) 

Folosind diff și hexdump pentru a obține diferențele dintre două fișiere

diff găsește liniile care sunt diferite și arată valorile octeților hexazecimale din primul fișier deasupra valorilor din al doilea fișier. Offset-ul primei linii este 0x3480 sau 13440 în zecimală. Mai devreme, cmp ne-a spus că prima modificare a avut loc la octetul 13451, care este 0x348B. Asta se potrivește de fapt cu ceea ce vedem aici.

Ieșirea de la diff este în blocuri de doi octeți. Prima pereche de octeți sunt octeții 0 și 1 din offset-ul 0x3480, al doilea bloc conține octeții 2 și 3 din offset. Blocul 6 va conține octeții 0xA și 0xB sau 10 și 11 în zecimală. Aceștia sunt octeții 13450 și 13451. Și putem vedea că sunt primii octeți care diferă. Primele cinci perechi de octeți sunt aceleași în ambele fișiere.

Cu toate acestea, deoarece diff numără de la baza zero, ceea ce cmp numește 13451 va fi octetul 13540 la diff . Și pentru a face lucrurile și mai confuze, ordinea octeților din fiecare bloc de doi octeți este inversată de diff . Octeții sunt de fapt listați în această ordine: 1 și 0, 3 și 2, 5 și 4, 7 și 6 și așa mai departe.

Comanda este, de asemenea, costisitoare din punct de vedere computațional - două hexdumps -uri și o diff dintr-o dată - mai ales dacă fișierele comparate sunt mari.

Dar dacă hexdump -C poate trimite o versiune ASCII a fișierului binar în fereastra terminalului, de ce nu redirecționăm rezultatul către fișiere text și apoi comparăm cele două fișiere text cu diff ?

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

Redirecționarea hexdump pentru a crea două fișiere text și utilizarea diff pentru a compara fișierele text

Diferența dintre cele două fișiere este afișată în două scurte extrase. Există o reprezentare ASCII alături de ei. Va exista o pereche de extrase pentru fiecare diferență dintre fișiere. În acest exemplu, există o singură diferență.

E foarte bine, dar nu ar fi grozav dacă ar fi ceva care să facă toate astea pentru tine?

VBinDiff

Programul VBinDiff poate fi instalat din depozitele obișnuite pentru toate distribuțiile majore. Pentru a-l instala pe Ubuntu, utilizați această comandă:

 sudo apt install vbindiff 

Instalarea VBinDiff pe Ubuntu

Pe Fedora, trebuie să tastați:

 sudo dnf install vbindiff 

Instalarea VBinDiff pe Fedora

Utilizatorii Manjaro trebuie să folosească pacman .

 sudo pacman -Sy vbindiff 

Instalarea VBinDiff pe Fedora

Pentru a utiliza programul, treceți numele celor două fișiere binare pe linia de comandă.

 vbindiff fișier_binar1.deci fișier_binar2.deci 

Trecerea a două fișiere binare către VBinDiff pe linia de comandă

Se deschide aplicația bazată pe terminal, arătând ambele fișiere într-o vizualizare de defilare.

VBinDiff afișează două fișiere binare

Puteți utiliza rotița de derulare a mouse-ului sau tastele „Săgeată în sus”, „Săgeată în jos”, „Acasă”, „Sfârșit”, „PageUp” și „PageJos” pentru a vă deplasa printre fișiere. Ambele fișiere vor derula.

Apăsați tasta „Enter” pentru a trece la prima diferență. Diferența este evidențiată în ambele fișiere.

VBinDiff evidențiind diferențele dintre două fișiere binare

Dacă ar exista mai multe diferențe, apăsând „Enter” ar afișa următoarea diferență. Apăsând „q” sau „Esc” se va ieși din program.

Care este diferența?

Dacă lucrați pe un computer care aparține altcuiva și nu aveți voie să instalați niciun pachet, puteți utiliza cmp , diff și hexdump . Dacă trebuie să capturați rezultatul pentru procesare ulterioară, acestea sunt și instrumentele de utilizat.

Dar dacă vi se permite să instalați pachete, VBinDiff vă face fluxul de lucru mai ușor și mai rapid. Și, de fapt, utilizarea VBinDiff cu un singur fișier binar este o modalitate ușoară și convenabilă de a naviga prin fișierele binare, ceea ce este un bonus frumos.

LEGATE: Cum să aruncați o privire în interiorul fișierelor binare din linia de comandă Linux