404 votes

Comment comparer des fichiers binaires sous Linux?

J'ai besoin de comparer deux fichiers binaires et obtenir la sortie sous la forme :

pour chaque octet différent. Donc si file1.bin est

  00 90 00 11

sous forme binaire et file2.bin est

  00 91 00 10

Je veux obtenir quelque chose comme

  00000001 90 91
  00000003 11 10

Y a-t-il un moyen de le faire dans Linux ? Je connais cmp -l mais il utilise un système décimal pour les décalages et octal pour les octets ce que je voudrais éviter.

0 votes

Xdelta.org fonctionne assez bien. Il serait peut-être utile d'y jeter un œil.

0 votes

Parce que vous ne pouvez pas répondre à cette question (car vous n'êtes pas un utilisateur), je vote pour la fermeture. Une différence binaire explicitement demandée ici n'est pas du tout utile, et je suis enclin à penser que vous voulez quelque chose d'utile, si vous insérez un octet au début du fichier, tous les octets doivent-ils être marqués comme étant différents? Sans savoir cela, cela est simplement trop vague.

0 votes

Ne pas mentionner que cela va explicitement à l'encontre des règles sur plusieurs domaines, il s'agit de "programmation et développement de logiciels" et vous demandez un produit ou une recommandation plutôt que comment utiliser un produit spécifique.

15voto

Evgeny Points 894

Réponse courte

vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)

Lors de l'utilisation de hexdumps et de différences de texte pour comparer des fichiers binaires, en particulier xxd, les ajouts et suppressions d'octets deviennent des décalages dans l'adressage ce qui peut rendre la lecture difficile. Cette méthode indique à xxd de ne pas afficher les adresses, et de n'afficher qu'un octet par ligne, ce qui permet de voir exactement quels octets ont été modifiés, ajoutés ou supprimés. Vous pouvez retrouver les adresses plus tard en recherchant les séquences d'octets intéressantes dans un hexdump plus "normal" (sortie de xxd first.bin).

0 votes

(Bien sûr, on peut utiliser diff à la place de vimdiff.)

12voto

BugoK Points 121

Je recommanderais hexdump pour le vidage des fichiers binaires au format textuel et kdiff3 pour la visualisation de diff.

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex

2 votes

Même ici en bash kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin) sans avoir besoin de créer les fichiers myfile1.hex et myfile2.hex.

0 votes

Pouvez-vous ajouter quelque chose à cette réponse concernant ses propriétés (sans "Edit :", "Mise à jour :", ou similaire) ? Par exemple, comment gère-t-il un octet inséré unique (le résultat est-il pertinent à partir de ce point) ?

0 votes

La réponse de Ciro Santilli gère bien l'ajout ou la suppression de bytes.

7voto

Mick Points 161

Le hexdiff est un programme conçu pour faire exactement ce que vous recherchez.

Utilisation :

hexdiff fichier1 fichier2

Il affiche l'hexadécimal (et l'ASCII 7 bits) des deux fichiers l'un au-dessus de l'autre, avec les différences mises en évidence. Consultez man hexdiff pour les commandes de déplacement dans le fichier, et un simple q pour quitter.

5 votes

Mais il fait un assez mauvais travail quand il s'agit de la partie de comparaison. Si vous insérez quelques octets dans un fichier, il marquera tous les octets suivants comme des changements

1 votes

Et hexdiff n'est pas disponible via apt-get sur Ubuntu 16.4

1 votes

@Murmel bien que je sois d'accord, n'est-ce pas ce qui est demandé ici?

6voto

phk Points 315

L'outil d'analyse du firmware binwalk dispose également de cette fonctionnalité grâce à son option en ligne de commande -W/--hexdump qui offre des options telles que montrer uniquement les octets différents :

    -W, --hexdump                Réaliser un hexdump / diff d'un fichier ou de fichiers
    -G, --green                  Afficher uniquement les lignes contenant des octets identiques parmi tous les fichiers
    -i, --red                    Afficher uniquement les lignes contenant des octets différents parmi tous les fichiers
    -U, --blue                   Afficher uniquement les lignes contenant des octets différents parmi certains fichiers
    -w, --terse                  Faire une différence de tous les fichiers, mais afficher uniquement un hexdump du premier fichier

Dans l'exemple de l'OP en effectuant binwalk -W file1.bin file2.bin:

binwalk -W file1.bin file2.bin

Ajoutez | less -r pour le défilement page par page.

4voto

wenbert Points 1892

Il se peut qu'il ne réponde pas strictement à la question, mais je l'utilise pour différencier les binaires :

gvim -d <(xxd -c 1 ~/file1.bin | awk '{print $2, $3}') <(xxd -c 1 ~/file2.bin | awk '{print $2, $3}')

Il affiche les deux fichiers en hexadécimal et en valeurs ASCII, un octet par ligne, puis utilise la fonction de différenciation de Vim pour les rendre visuellement.

0 votes

Pouvez-vous ajouter quelque chose à cette réponse sur ses propriétés (sans "Edit:", "Update:", ou similaire) ? Par exemple, comment gère-t-il un octet inséré unique (le résultat a-t-il un sens à partir de ce point) ?

0 votes

La réponse de Ciro Santilli gère bien l'ajout / la suppression d'octets.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X