Comment comparer des fichiers binaires sous Linux
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.
Sommaire
Comparaison de fichiers binaires
Linux est riche en moyens de comparer et d’analyser des fichiers texte. La diff
La commande 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 le colordiff
La commande 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.
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
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 le sha256sum
commande et générer un hachage pour chaque fichier.
sha256sum binary_file1.so
sha256sum binary_file2.so
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 ces changements moyenne, 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 aurons une réponse un peu décevante.
diff binary_file1.so binary_file2.so
Nous savions déjà que les fichiers étaient différents. Essayons cmp
.
cmp binary_file1.so binary_file2.so
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 cmp
La commande a 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 le -l
(verbeux) nous allons commencer à obtenir des informations utiles.
cmp -l binary_file1.so binary_file2.so
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.
La hexdump
L’outil videra un fichier binaire dans la fenêtre du terminal. Si nous utilisons le -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 binary_file1.so
Nous pouvons utiliser la sortie de hexdump
comme entrée à diff
laissant diff
fonctionne comme s’il lisait deux fichiers texte.
diff <(hexdump binary_file1.so) <(hexdump binary_file2.so)
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, parce que diff
compte à partir de la base zéro, ce qui cmp
les appels 13451 seront l’octet 13540 à 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 calcul—deux hexdumps
et un diff
tout à la fois, 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 binary_file1.so > binary1.txt
hexdump -C binary_file2.so > binary2.txt
diff binary1.txt binary2.txt
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 install vbindiff
Sur Fedora, vous devez taper :
sudo dnf install vbindiff
Les utilisateurs de Manjaro doivent utiliser pacman
.
sudo pacman -Sy vbindiff
Pour utiliser le programme, passez le nom des deux fichiers binaires sur la ligne de commande.
vbindiff binary_file1.so binary_file2.so
L’application basée sur le terminal s’ouvre, affichant les deux fichiers dans une vue de défilement.
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.
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.