Hoe binaire bestanden op Linux te vergelijken

Hoe binaire bestanden op Linux te vergelijken
fatmawati achmad zaenuri/Shutterstock.com

Hoe kun je controleren of twee Linux-binaries hetzelfde zijn? Als het uitvoerbare bestanden zijn, kunnen eventuele verschillen ongewenst of kwaadaardig gedrag betekenen. Dit is de gemakkelijkste manier om te controleren of ze verschillen.

Binaire bestanden vergelijken

Linux is rijk aan manieren om tekstbestanden te vergelijken en te analyseren. De diff commando zal twee bestanden voor u vergelijken en de verschillen markeren. Het kan zelfs een paar regels aan weerszijden van de wijzigingen bieden om wat context rond de gewijzigde regels te bieden. En de colordiff commando voegt kleur toe om het visueel ontleden van de verschillen nog gemakkelijker te maken.

Ontwikkelaars en auteurs gebruiken diff om de verschillen tussen verschillende versies van programmabroncodebestanden of conceptteksten te benadrukken. Het is snel en gemakkelijk, en je hebt geen technische vaardigheden nodig om de verschillen tussen tekstreeksen te zien.

In de wereld van binaire bestanden is het niet zo eenvoudig. Binaire bestanden zijn niet samengesteld uit platte tekst. Ze bestaan ​​uit vele bytes met numerieke waarden. Als het een gecomprimeerd bestand is, zoals een TAR-archief of een ZIP-bestand, vertegenwoordigen die waarden de gecomprimeerde bestanden die in het archiefbestand zijn opgeslagen, samen met de tabellen met symbolen die nodig zijn voor het decomprimeren en extraheren van de bestanden.

Hoe twee tekstbestanden in de Linux Terminal te vergelijken?

VERWANTHoe twee tekstbestanden in de Linux Terminal te vergelijken?

Als het binaire bestand een uitvoerbaar bestand is, worden de numerieke waarden van de bytes van het bestand geïnterpreteerd als machinecode-instructies voor de CPU, metagegevens, labels of gecodeerde gegevens. Wijzigingen in een binair bestand of een bibliotheekbestand leiden waarschijnlijk tot verschillen in gedrag wanneer het binaire bestand wordt uitgevoerd of wordt gebruikt door een andere toepassing.

Het is gemakkelijk om de aanmaak- of wijzigingsdatum en -tijd van een bestand te vervalsen. Dat betekent dat er twee versies van een bestand kunnen zijn met dezelfde naam, bestandsgrootte – als de wijzigingen bestaande inhoud byte voor byte vervangen – en datumstempels. En toch kan een van de bestanden zijn gewijzigd.

Veilige hash-algoritmen

Een veilig hash-algoritme is een op wiskunde gebaseerd algoritme. Het creëert een 64-bits waarde door alle bytes in een bestand te scannen en er een wiskundige transformatie op toe te passen om de hash-waarde te genereren. Op elke dag zal hetzelfde bestand altijd dezelfde hash produceren. Zelfs een verschil van één byte zal resulteren in een radicaal andere hash.

Vaak zie je de hash van een bestand op de downloadpagina. Je moet een hash voor het bestand genereren zodra je het hebt gedownload. Als het verschilt van de hash die op de webpagina wordt weergegeven, weet u dat het bestand is aangetast. Er is ofwel mee geknoeid en het is vervangen door het echte bestand – om mensen het besmette bestand te laten downloaden – of het is beschadigd tijdens het transport.

Op onze testcomputer hebben we twee exemplaren van hetzelfde bestand, een gedeelde bibliotheek. De bestanden zijn hernoemd zodat ze in dezelfde directory kunnen staan. In theorie zouden deze bestanden hetzelfde moeten zijn. Ze zouden tenslotte dezelfde versie van de gedeelde bibliotheek moeten zijn.

ls -l *.so

Twee binaire bestanden die er hetzelfde uitzien

De bestanden hebben dezelfde grootte, dezelfde datumstempels en dezelfde tijdstempels. Voor de toevallige waarnemer zullen ze hetzelfde lijken. Laten we de gebruiken sha256sum commando en genereer een hash voor elk bestand.

sha256sum binary_file1.so
sha256sum binary_file2.so

Hashes genereren voor de twee binaire bestanden

De hashes zijn totaal verschillend, wat duidelijk aangeeft dat er verschillen zijn tussen de twee bestanden. Als de website de hash van het echte bestand toont, kunt u het bestand dat niet overeenkomt weggooien.

De verschillen zoeken

Als je de veranderingen wilt bekijken, zijn er ook manieren om dat te doen. U hoeft het bestand niet te kunnen decompileren of de assemblage of machinecode te begrijpen om de wijzigingen te zien. Begrijpen wat die veranderingen gemeen, en wat hun doel is, zou natuurlijk diepere technische kennis vereisen. Maar weten hoe ingrijpend de wijzigingen zijn, kan een indicatie zijn van wat er met het bestand is gebeurd.

Als we gebruik maken van diff op de twee binaire bestanden krijgen we een antwoord dat een beetje teleurstellend is.

diff binary_file1.so binary_file2.so

Het gebruik van diff met twee binaire bestanden geeft heel weinig informatie

We wisten al dat de bestanden anders waren. Laten we proberen cmp .

cmp binary_file1.so binary_file2.so

Het gebruik van cmp met twee binaire bestanden geeft iets meer informatie, maar niet veel

Dit vertelt ons iets meer. De eerste byte die verschilt tussen de twee bestanden is bytenummer 13451. Dat wil zeggen, gerekend vanaf het begin van het binaire bestand, is byte 13451 verschillend in de twee binaire bestanden. Dus 13451 is de offset van het eerste verschil, vanaf het begin van het bestand.

Heel toevallig zullen er door het hele bestand bytes zijn die de hexadecimale waarde 0x10 bevatten. Dit is de waarde die Linux in tekstbestanden gebruikt als end-of-line-teken. De cmp opdracht 131 bytes aangetroffen met deze waarde tussen het begin van het binaire bestand en de locatie van het eerste verschil. Dus het denkt dat het op lijn 132 staat. Het betekent echt niets in deze context.

Als we de . toevoegen -l (uitgebreide) optie beginnen we nuttige informatie te krijgen.

cmp -l binary_file1.so binary_file2.so

De optie -l gebruiken met cmp om de gewijzigde bytes weer te geven

Alle verschillende bytes worden weergegeven. Het bytenummer of offset, de waarde van het eerste bestand en de waarde van het tweede bestand worden weergegeven, met één byte per regel uitvoer.

De bytewaarden worden weergegeven in octaal, in plaats van het gebruikelijke hexadecimale formaat dat wordt gebruikt bij binaire bestanden. Toch hebben we iets anders geleerd. Alle gewijzigde bytes bevinden zich in een doorlopende reeks. Hun offsets worden met één verhoogd voor elke byte.

De hexdump tool zal een binair bestand naar het terminalvenster dumpen. Als we de gebruiken -C (canonieke) optie zal de uitvoer op elke regel de offset weergeven, de waarden van 16 bytes bij die offset, en – als die er is – de ASCII-representatie van de bytewaarden.

hexdump -C binary_file1.so

De hexdump canonieke uitvoer van een binair bestand

We kunnen de uitvoer van gebruiken hexdump als invoer voor difflaten diff werken alsof het twee tekstbestanden leest.

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

diff en hexdump gebruiken om de verschillen tussen twee bestanden te verkrijgen

diff vindt de regels die anders zijn en toont de hexadecimale bytewaarden uit het eerste bestand boven de waarden uit het tweede bestand. De offset van de eerste regel is 0x3480 of 13440 in decimalen. Eerder, cmp vertelde ons dat de eerste wijziging plaatsvond op byte 13451, dat is 0x348B. Dat komt eigenlijk overeen met wat we hier zien.

De uitvoer van diff is in blokken van twee bytes. Het eerste paar bytes zijn bytes 0 en 1 vanaf de offset van 0x3480, het tweede blok bevat bytes 2 en 3 vanaf de offset. Blok 6 bevat bytes 0xA en 0xB, of 10 en 11 in decimalen. Dat zijn bytes 13450 en 13451. En we kunnen zien dat dit de eerste bytes zijn die verschillen. De eerste vijf paren bytes zijn in beide bestanden hetzelfde.

Echter, omdat diff telt vanaf nul, wat? cmp roept 13451 wordt byte 13540 naar diff. En om de zaken nog verwarrender te maken, wordt de bytevolgorde in elk blok van twee bytes omgekeerd door diff. De bytes worden eigenlijk in deze volgorde weergegeven: 1 en 0, 3 en 2, 5 en 4, 7 en 6, enzovoort.

De opdracht is ook rekenkundig duur – twee hexdumps en een diff allemaal tegelijk, vooral als de bestanden die worden vergeleken groot zijn.

Maar als hexdump -C kan een ASCII-versie van het binaire bestand naar het terminalvenster sturen, waarom sturen we de uitvoer niet om naar tekstbestanden en vergelijken we die twee tekstbestanden met diff?

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

Hexdump omleiden om twee tekstbestanden te maken en diff gebruiken om de tekstbestanden te vergelijken

Het verschil tussen de twee bestanden wordt weergegeven in twee korte uittreksels. Er is een ASCII-weergave naast hen. Er zullen een paar uittreksels zijn voor elk verschil tussen de bestanden. In dit voorbeeld is er maar één verschil.

Dat is allemaal prima, maar zou het niet geweldig zijn als er iets was dat dat allemaal voor je deed?

VBinDiff

Het VBinDiff-programma kan worden geïnstalleerd vanuit de gebruikelijke repositories voor alle grote distributies. Gebruik deze opdracht om het op Ubuntu te installeren:

sudo apt install vbindiff

VBinDiff installeren op Ubuntu

Op Fedora moet je typen:

sudo dnf install vbindiff

VBinDiff installeren op Fedora

Manjaro-gebruikers moeten gebruiken pacman.

sudo pacman -Sy vbindiff

VBinDiff installeren op Fedora

Om het programma te gebruiken, geeft u de naam van de twee binaire bestanden op de opdrachtregel door.

vbindiff binary_file1.so binary_file2.so

Twee binaire bestanden doorgeven aan VBinDiff op de opdrachtregel

De terminalgebaseerde toepassing wordt geopend en beide bestanden worden in een scrollende weergave weergegeven.

VBinDiff geeft twee binaire bestanden weer

U kunt het scrollwiel van de muis of de toetsen “UpArrow”, “DownArrow”, “Home”, “End”, “PageUp” en “PageDown” gebruiken om door de bestanden te bladeren. Beide bestanden zullen scrollen.

Druk op de “Enter”-toets om naar het eerste verschil te springen. Het verschil wordt in beide bestanden gemarkeerd.

VBinDiff benadrukt verschillen tussen twee binaire bestanden

Als er meer verschillen waren, zou door op “Enter” te drukken het volgende verschil worden weergegeven. Door op “q” of “Esc” te drukken, wordt het programma afgesloten.

Wat is het verschil?

Als u op een computer werkt die van iemand anders is en u geen pakketten mag installeren, kunt u gebruik maken van cmp, diffen hexdump. Als u de uitvoer wilt vastleggen voor verdere verwerking, zijn dit ook de tools die u kunt gebruiken.

Maar als u pakketten mag installeren, maakt VBinDiff uw workflow eenvoudiger en sneller. En in feite is het gebruik van VBinDiff met een enkel binair bestand een gemakkelijke en handige manier om door binaire bestanden te bladeren, wat een leuke bonus is.

Nieuwste artikelen

Gerelateerde artikelen