Je dois comparer deux fichiers binaires et obtenir le résultat sous la forme:
<fileoffset-hex> <fichier1 octets-hex> <fichier2 octets-hex>
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 faire cela sous Linux? Je connais cmp -l
mais il utilise un système décimal pour les décalages et octal pour les octets que je voudrais éviter.
linux
diff
binary-files
Bertieb
la source
la source
od
...Réponses:
Ceci imprimera le décalage et les octets au format hexadécimal:
Ou bien, faites
$1-1
que le premier offset imprimé commence à 0.Malheureusement, il
strtonum()
est spécifique à GAWK. Par conséquent, pour les autres versions d'awk, telles que mawk, vous devrez utiliser une fonction de conversion octale en décimale. Par exemple,Éclaté pour plus de lisibilité:
la source
strtonum
est spécifique à GAWK. Je pense qu'Ubuntu utilisait auparavant GAWK par défaut, mais a basculé à un moment donnémawk
. Dans tous les cas, GAWK peut être installé et configuré par défaut (voir aussiman update-alternatives
). Voir ma réponse mise à jour pour une solution qui ne nécessite passtrtonum
.Comme ~ charlatan l'a fait remarquer:
Puis
ou
la source
diff <(xxd b1) <(xxd b2)
mais le format de sortie de celui-ci (ou du vôtre) est loin de ce que l'OP a demandé.opendiff
OS X au lieu devimdiff
) - la vue par défautxxd
permet au moteur de diff de rester sur la bonne voie en comparant octet par octet. Avec un hexa brut (brut) simplement ajusté avec la colonnefold
,diff
essaierait de plier / grouper des éléments aléatoires dans les fichiers que je comparais.diff
. La solution consiste à mettre 1 octet par ligne et à supprimer la colonne adresse proposée par John Lawrence Aspden et moi-même .diff
+xxd
Essayez
diff
la combinaison suivante de substitution de processus zsh / bash:Où:
-y
vous montre les différences côte à côte (facultatif).xxd
est un outil CLI pour créer une sortie hexdump du fichier binaire.-W200
àdiff
pour une sortie plus large (200 caractères par ligne).colordiff
comme indiqué ci-dessous.colordiff
+xxd
Si vous en avez
colordiff
, il peut coloriser ladiff
sortie, par exemple:Sinon l' installation via:
sudo apt-get install colordiff
.Exemple de sortie:
vimdiff
+xxd
Vous pouvez également utiliser
vimdiff
, par exempleConseils:
-l1000
) pour chaquexxd
la source
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.diff -y <(xxd foo1.bin) <(xxd foo2.bin)
-q
ou--brief
, qui affichera la sortie uniquement lorsque les fichiers diffèrent.xxddiff
pour cela avec:xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -
va faire un bon travail enougIl existe un outil appelé DHEX qui peut faire l'affaire et un autre outil appelé VBinDiff .
Pour une approche strictement en ligne de commande, essayez jojodiff .
la source
Méthode qui fonctionne pour l'ajout / la suppression d'octets
Générez un scénario de test avec une seule suppression de l'octet 64:
Sortie:
Si vous souhaitez également voir la version ASCII du caractère:
Sortie:
Testé sur Ubuntu 16.04.
Je préfère
od
plusxxd
parce que:xxd
n'est pas (livré avec Vim)-An
pour supprimer la colonne d'adresse sansawk
.Explication de la commande:
-An
supprime la colonne d'adresse. C'est important sinon toutes les lignes seraient différentes après l'ajout / le retrait d'un octet.-w1
met un octet par ligne, pour que diff puisse le consommer. Il est crucial d’avoir un octet par ligne, sinon chaque ligne après une suppression deviendrait déphasée et différerait. Malheureusement, ce n'est pas POSIX, mais présent dans GNU.-tx1
est la représentation que vous voulez, changez pour n'importe quelle valeur possible, tant que vous gardez 1 octet par ligne.-v
empêche l'abréviation de répétition astérisque*
qui pourrait interférer avec le diffpaste -d '' - -
rejoint toutes les deux lignes. Nous en avons besoin parce que l'hex et ASCII vont dans des lignes adjacentes séparées. Tiré de: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next()
pour définirbdiff
au lieu de{}
limiter la portée de la fonction internef
, voir aussi: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bashVoir également:
la source
Réponse courte
Lorsque vous utilisez hexdumps et text diff 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 ne générer qu'un seul octet par ligne, ce qui indique exactement quels octets ont été modifiés, ajoutés ou supprimés. Vous pouvez trouver les adresses plus tard en recherchant les séquences d'octets intéressantes dans un hexdump plus "normal" (sortie dexxd first.bin
).la source
diff
au lieu devimdiff
.)Je recommanderais hexdump pour vider les fichiers binaires au format texte et kdiff3 pour les diff.
la source
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
sans avoir besoin de créer des fichiersmyfile1.hex
etmyfile2.hex
.Le
hexdiff
est un programme conçu pour faire exactement ce que vous recherchez.Usage:
Il affiche le format hexadécimal (et ASCII 7 bits) des deux fichiers superposés, avec les différences mises en évidence. Recherchez
man hexdiff
les commandes à déplacer dans le fichier et un simpleq
quittera.la source
Cela ne répond peut-être pas strictement à la question, mais je l'utilise pour les binaires différents:
Il imprime les deux fichiers en tant que valeurs hexadécimales et ASCII , un octet par ligne, puis utilise la fonction de différenciation de Vim pour les rendre visuellement.
la source
dhex http://www.dettus.net/dhex/
DHEX est un autre éditeur hexadécimal: il comprend un mode diff qui permet de comparer facilement et commodément deux fichiers binaires. Comme il est basé sur ncurses et qu'il est possible de les utiliser, il peut être exécuté sur un nombre quelconque de systèmes et de scénarios. Grâce à son utilisation des journaux de recherche, il est possible de suivre facilement les modifications apportées à différentes itérations de fichiers.
la source
Vous pouvez utiliser l' outil gvimdiff inclus dans le paquet vim-gui-common
Ensuite, vous pouvez comparer 2 fichiers hexadécimaux en utilisant les commandes suivantes:
C'est tout. J'espère que l'aide!
la source
L'outil d'analyse de micrologiciel a
binwalk
également cela comme fonctionnalité via son option de ligne de commande-W
/--hexdump
qui offre des options telles que d'afficher uniquement les différents octets:Dans l'exemple de OP en faisant
binwalk -W file1.bin file2.bin
:la source
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff est un excellent outil d'interface utilisateur pour la comparaison de fichiers binaires récemment ouvert.
la source
Le produit open source sous Linux (et tout le reste) est Radare, qui fournit
radiff2
explicitement cet objectif. J'ai voté pour fermer ceci parce que moi - même et d'autres avons la même question, dans la question que vous posezC'est fou cependant. Parce que comme demandé, si vous insérez un octet au premier octet du fichier, vous constaterez que chaque octet suivant est différent et que le diff répète le fichier entier, avec une différence réelle d'un octet.
Un peu plus pratique est
radiff -O
. Le-O
pour "" Faire la différence de code avec tous les octets au lieu des octets de code d'opération fixes ""Comme IDA Pro, Radare est un outil principal pour l’analyse binaire. Vous pouvez également afficher les différences delta avec
-d
, ou afficher les octets désassemblés au lieu d’hex-D
.Si vous posez ce genre de questions, consultez
radiff2
pour diffing binairela source