Comment comparer des fichiers binaires sous Linux

Publié: 2022-08-20
Ordinateur portable Linux affichant une invite bash
fatmawati achmad zaenuri/Shutterstock.com

Comment pouvez-vous vérifier si deux binaires Linux sont identiques ? S'il s'agit de fichiers exécutables, toute différence peut signifier un comportement indésirable ou malveillant. Voici le moyen le plus simple de vérifier s'ils diffèrent.

Comparaison de fichiers binaires

Linux est riche en moyens de comparer et d'analyser des fichiers texte. La commande diff comparera deux fichiers pour vous et mettra en évidence les différences. Il peut même fournir quelques lignes de chaque côté des modifications pour fournir un contexte autour des lignes modifiées. Et la commande colordiff ajoute de la couleur pour rendre l'analyse visuelle des différences encore plus facile.

Les développeurs et les auteurs utilisent diff pour mettre en évidence les différences entre les différentes versions des fichiers de code source du programme ou des brouillons de textes. C'est rapide et facile, et vous n'avez besoin d'aucune compétence technique pour voir les différences entre les chaînes de texte.

Dans le monde des fichiers binaires, les choses ne sont pas si simples. Les fichiers binaires ne sont pas composés de texte brut. Ils sont constitués de nombreux octets contenant des valeurs numériques. S'il s'agit d'un fichier compressé tel qu'une archive TAR ou un fichier ZIP, ces valeurs représentent les fichiers compressés stockés dans le fichier d'archive, ainsi que les tables de symboles nécessaires à la décompression et à l'extraction des fichiers.

Comment comparer deux fichiers texte dans le terminal Linux
CONNEXION Comment comparer deux fichiers texte dans le terminal Linux

Si le fichier binaire est un fichier exécutable, les valeurs numériques des octets du fichier sont interprétées comme des éléments tels que des instructions de code machine pour le processeur, des métadonnées, des étiquettes ou des données codées. Les modifications apportées à un fichier binaire ou à un fichier de bibliothèque sont susceptibles d'entraîner des différences de comportement lorsque le binaire s'exécute ou est utilisé par une autre application.

Il est facile d'usurper la date et l'heure de création ou de modification d'un fichier. Cela signifie qu'il peut y avoir deux versions d'un fichier qui ont le même nom, la même taille de fichier (si les modifications remplacent le contenu existant octet par octet) et les horodatages. Et pourtant, l'un des fichiers a peut-être été altéré.

Algorithmes de hachage sécurisés

Un algorithme de hachage sécurisé est un algorithme basé sur les mathématiques. Il crée une valeur 64 bits en analysant tous les octets d'un fichier et en leur appliquant une transformation mathématique pour générer la valeur de hachage. Chaque jour, le même fichier produira toujours le même hachage. Même une différence d'un octet se traduira par un hachage radicalement différent.

Vous verrez souvent le hachage d'un fichier affiché sur sa page de téléchargement. Vous devez générer un hachage pour le fichier une fois que vous l'avez téléchargé. S'il est différent du hachage affiché sur la page Web, vous savez que le fichier est compromis. Soit il a été falsifié et remplacé par le fichier authentique (pour que les gens téléchargent le fichier souillé), soit il a été corrompu pendant le transport.

Sur notre ordinateur de test, nous avons deux copies du même fichier, une bibliothèque partagée. Les fichiers ont été renommés afin qu'ils puissent se trouver dans le même répertoire. En théorie, ces fichiers devraient être les mêmes. Après tout, ils sont censés être la même version de la bibliothèque partagée.

 ls -l *.so 

Deux fichiers binaires qui semblent identiques

Les fichiers ont la même taille, les mêmes horodatages et les mêmes horodatages. Pour l'observateur occasionnel, ils sembleront être les mêmes. Utilisons la commande sha256sum et générons un hachage pour chaque fichier.

 sha256sum fichier_binaire1.so
 sha256sum fichier_binaire2.so 

Génération de hachages pour les deux fichiers binaires

Les hachages sont complètement différents, ce qui indique clairement qu'il existe des différences entre les deux fichiers. Si le site Web affiche le hachage du fichier authentique, vous pouvez supprimer le fichier qui ne correspond pas.

Trouver les différences

Si vous souhaitez examiner les changements, il existe également des moyens de le faire. Vous n'avez pas besoin d'être capable de décompiler le fichier, ni de comprendre l'assembleur ou le code machine juste pour voir les modifications. Comprendre ce que signifient ces changements et quel est leur objectif, bien sûr, nécessiterait des connaissances techniques plus approfondies. Mais le simple fait de savoir à quel point les changements sont importants peut être révélateur de ce qui est arrivé au fichier.

Si nous utilisons diff sur les deux fichiers binaires, nous obtiendrons une réponse un peu décevante.

 diff fichier_binaire1.so fichier_binaire2.so 

L'utilisation de diff avec deux fichiers binaires donne très peu d'informations

Nous savions déjà que les fichiers étaient différents. Essayons cmp .

 cmp fichier_binaire1.so fichier_binaire2.so 

L'utilisation de cmp avec deux fichiers binaires donne un peu plus d'informations, mais pas beaucoup

Cela nous en dit un tout petit peu plus. Le premier octet qui diffère entre les deux fichiers est l'octet numéro 13451. Autrement dit, compté depuis le début du fichier binaire, l'octet 13451 est différent dans les deux fichiers binaires. Donc 13451 est le décalage de la première différence, depuis le début du fichier.

Par chance, dans tout le fichier, il y aura des octets contenant la valeur hexadécimale de 0x10. C'est la valeur que Linux utilise dans les fichiers texte comme caractère de fin de ligne. La commande cmp rencontré 131 octets avec cette valeur entre le début du fichier binaire et l'emplacement de la première différence. Il pense donc que c'est à la ligne 132. Cela ne veut vraiment rien dire dans ce contexte.

Si nous ajoutons l'option -l (verbeux), nous commencerons à obtenir des informations utiles.

 cmp -l fichier_binaire1.so fichier_binaire2.so 

Utilisation de l'option -l avec cmp pour lister les octets modifiés

Tous les octets différents sont répertoriés. Le nombre d'octets ou le décalage, la valeur du premier fichier et la valeur du deuxième fichier sont affichés, avec un octet par ligne de sortie.

Les valeurs d'octets sont affichées en octal, au lieu du format hexadécimal habituel utilisé avec les fichiers binaires. Néanmoins, nous avons appris autre chose. Tous les octets modifiés sont dans une séquence continue. Leurs décalages sont incrémentés de un pour chaque octet.

L'outil hexdump un fichier binaire dans la fenêtre du terminal. Si nous utilisons l'option -C (canonique), la sortie listera sur chaque ligne le décalage, les valeurs de 16 octets à ce décalage et, s'il y en a une, la représentation ASCII des valeurs d'octet.

 hexdump -C fichier_binaire1.so 

La sortie canonique hexdump d'un fichier binaire

Nous pouvons utiliser la sortie de hexdump comme entrée de diff , laissant diff fonctionner comme s'il lisait deux fichiers texte.

 diff <(hexdump fichier_binaire1.so) <(hexdump fichier_binaire2.so) 

Utiliser diff et hexdump pour obtenir les différences entre deux fichiers

diff trouve les lignes qui sont différentes et affiche les valeurs d'octets hexadécimaux du premier fichier au-dessus des valeurs du deuxième fichier. Le décalage de la première ligne est 0x3480, ou 13440 en décimal. Plus tôt, cmp nous a dit que le premier changement s'est produit à l'octet 13451, qui est 0x348B. Cela correspond en fait à ce que nous voyons ici.

La sortie de diff est en blocs de deux octets. La première paire d'octets sont les octets 0 et 1 du décalage de 0x3480, le deuxième bloc contient les octets 2 et 3 du décalage. Le bloc 6 contiendra les octets 0xA et 0xB, ou 10 et 11 en décimal. Ce sont les octets 13450 et 13451. Et on voit que ce sont les premiers octets qui diffèrent. Les cinq premières paires d'octets sont les mêmes dans les deux fichiers.

Cependant, comme diff compte à partir de la base zéro, ce que cmp appelle 13451 sera l'octet 13540 de diff . Et pour rendre les choses encore plus confuses, l'ordre des octets dans chaque bloc de deux octets est inversé par diff . Les octets sont en fait répertoriés dans cet ordre : 1 et 0, 3 et 2, 5 et 4, 7 et 6, etc.

La commande est également coûteuse en calculs - deux hexdumps et un diff en même temps - surtout si les fichiers comparés sont volumineux.

Mais si hexdump -C peut envoyer une version ASCII du fichier binaire à la fenêtre du terminal, pourquoi ne pas rediriger la sortie vers des fichiers texte, puis comparer ces deux fichiers texte avec diff ?

 hexdump -C fichier_binaire1.so > binaire1.txt
 hexdump -C fichier_binaire2.so > fichier2.txt binaire
 diff binaire1.txt binaire2.txt 

Redirection hexdump pour créer deux fichiers texte et utilisation de diff pour comparer les fichiers texte

La différence entre les deux fichiers est affichée dans deux courts extraits. Il y a une représentation ASCII à côté d'eux. Il y aura une paire d'extraits pour chaque différence entre les fichiers. Dans cet exemple, il n'y a qu'une seule différence.

C'est très bien, mais ne serait-ce pas formidable s'il y avait quelque chose qui faisait tout cela pour vous ?

VBinDiff

Le programme VBinDiff peut être installé à partir des référentiels habituels pour toutes les distributions majeures. Pour l'installer sur Ubuntu, utilisez cette commande :

 sudo apt installer vbindiff 

Installer VBinDiff sur Ubuntu

Sur Fedora, vous devez taper :

 sudo dnf installer vbindiff 

Installer VBinDiff sur Fedora

Les utilisateurs de Manjaro doivent utiliser pacman .

 sudo pacman -Sy vbindiff 

Installer VBinDiff sur Fedora

Pour utiliser le programme, passez le nom des deux fichiers binaires sur la ligne de commande.

 vbindiff fichier_binaire1.so fichier_binaire2.so 

Passer deux fichiers binaires à VBinDiff sur la ligne de commande

L'application basée sur le terminal s'ouvre, affichant les deux fichiers dans une vue de défilement.

VBinDiff affichant deux fichiers binaires

Vous pouvez utiliser la molette de la souris ou les touches "UpArrow", "DownArrow", "Home", "End", "PageUp" et "PageDown" pour vous déplacer dans les fichiers. Les deux fichiers défileront.

Appuyez sur la touche "Entrée" pour passer à la première différence. La différence est mise en évidence dans les deux fichiers.

VBinDiff mettant en évidence les différences entre deux fichiers binaires

S'il y avait plus de différences, appuyer sur "Entrée" afficherait la différence suivante. Appuyez sur "q" ou "Esc" pour quitter le programme.

Quelle est la différence?

Si vous travaillez sur un ordinateur qui appartient à quelqu'un d'autre et que vous n'êtes pas autorisé à installer des packages, vous pouvez utiliser cmp , diff et hexdump . Si vous avez besoin de capturer la sortie pour un traitement ultérieur, ce sont également les outils à utiliser.

Mais si vous êtes autorisé à installer des packages, VBinDiff facilite et accélère votre flux de travail. Et en fait, utiliser VBinDiff avec un seul fichier binaire est un moyen simple et pratique de parcourir les fichiers binaires, ce qui est un avantage appréciable.

CONNEXION: Comment jeter un coup d'œil à l'intérieur des fichiers binaires à partir de la ligne de commande Linux