Necesito comparar dos archivos binarios y obtener el resultado en el formulario:
<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>
por cada byte diferente. Entonces si file1.bin
es
00 90 00 11
en forma binaria y file2.bin
es
00 91 00 10
Quiero conseguir algo como
00000001 90 91
00000003 11 10
¿Hay alguna manera de hacer esto en Linux? Lo sé, cmp -l
pero utiliza un sistema decimal para desplazamientos y octal para bytes que me gustaría evitar.
linux
diff
binary-files
bertieb
fuente
fuente
od
...Respuestas:
Esto imprimirá el desplazamiento y los bytes en hexadecimal:
O haga
$1-1
que el primer desplazamiento impreso comience en 0.Desafortunadamente,
strtonum()
es específico de GAWK, por lo que para otras versiones de awk, por ejemplo, mawk, necesitará usar una función de conversión de octal a decimal. Por ejemplo,Desglosado por legibilidad:
fuente
strtonum
es específico de GAWK. Creo que Ubuntu utilizó anteriormente GAWK como predeterminado, pero cambió en algún momento amawk
. En cualquier caso, GAWK se puede instalar y establecer en el valor predeterminado (ver tambiénman update-alternatives
). Vea mi respuesta actualizada para una solución que no requierestrtonum
.Como ~ quack señaló:
Y entonces
o
fuente
diff <(xxd b1) <(xxd b2)
pero el formato de salida de este (o el suyo) no se acerca a lo que solicitó el OP.opendiff
OS X en lugar devimdiff
): la vista predeterminadaxxd
proporciona el motor diff en la pista comparando byte por byte. Con hexadecimal simple (en bruto) simplemente con ajuste de columnafold
,diff
intentaría doblar / agrupar cosas aleatorias en los archivos que estaba comparando.diff
. La solución es poner 1 byte por línea y eliminar la columna de la dirección propuesta por John Lawrence Aspden y yo .diff
+xxd
Pruebe
diff
con la siguiente combinación de sustitución de procesos zsh / bash:Dónde:
-y
le muestra las diferencias de lado a lado (opcional).xxd
es la herramienta CLI para crear una salida hexdump del archivo binario.-W200
adiff
para una salida más amplia (de 200 caracteres por línea).colordiff
como se muestra a continuación.colordiff
+xxd
Si lo ha hecho
colordiff
, puede colorear ladiff
salida, por ejemplo:De lo contrario, instalar a través de:
sudo apt-get install colordiff
.Salida de muestra:
vimdiff
+xxd
También puede usar
vimdiff
, por ejemploConsejos:
-l1000
) para cadaxxd
fuente
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.diff -y <(xxd foo1.bin) <(xxd foo2.bin)
-q
o--brief
, que solo mostrará la salida cuando los archivos difieran.xxddiff
para esto con:xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -
va a hacer un trabajo de buena enougHay una herramienta llamada DHEX que puede hacer el trabajo, y hay otra herramienta llamada VBinDiff .
Para un enfoque estrictamente de línea de comandos, intente jojodiff .
fuente
Método que funciona para la adición / eliminación de bytes
Genere un caso de prueba con una sola eliminación del byte 64:
Salida:
Si también quieres ver la versión ASCII del personaje:
Salida:
Probado en Ubuntu 16.04.
Prefiero
od
sobrexxd
porque:xxd
no está (viene con Vim)-An
para eliminar la columna de dirección sinawk
.Explicación del comando:
-An
elimina la columna de la dirección. Esto es importante; de lo contrario, todas las líneas serían diferentes después de la adición / eliminación de un byte.-w1
pone un byte por línea, para que diff pueda consumirlo. Es crucial tener un byte por línea, o de lo contrario, cada línea después de una eliminación quedaría desfasada y diferente. Desafortunadamente, esto no es POSIX, pero está presente en GNU.-tx1
es la representación que desea, cambie a cualquier valor posible, siempre que mantenga 1 byte por línea.-v
evita la abreviatura de repetición de asterisco*
que podría interferir con la diferenciapaste -d '' - -
se une cada dos líneas. Lo necesitamos porque el hex y ASCII van en líneas adyacentes separadas. Tomado de: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next()
para definir enbdiff
lugar de{}
limitar el alcance de la función internaf
, consulte también: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bashVer también:
fuente
Respuesta corta
Al usar hexdumps y text diff para comparar archivos binarios, especialmente
xxd
, las adiciones y eliminaciones de bytes se convierten en cambios en el direccionamiento que pueden dificultar la visualización. Este método le dice a xxd que no envíe direcciones y que solo envíe un byte por línea, que a su vez muestra exactamente qué bytes se cambiaron, agregaron o eliminaron. Puede encontrar las direcciones más adelante buscando las secuencias interesantes de bytes en un hexdump (salida dexxd first.bin
) más "normal" .fuente
diff
lugar devimdiff
).Recomiendo hexdump para volcar archivos binarios a formato de texto y kdiff3 para visualización diferencial.
fuente
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
sin necesidad de crear archivosmyfile1.hex
ymyfile2.hex
.El
hexdiff
es un programa diseñado para hacer exactamente lo que estás buscando.Uso:
Muestra el hexadecimal (y ASCII de 7 bits) de los dos archivos uno encima del otro, con cualquier diferencia resaltada. Mire
man hexdiff
los comandos para moverse en el archivo, y seq
cerrará un simple .fuente
Puede que no responda estrictamente la pregunta, pero lo uso para diferentes binarios:
Imprime ambos archivos como valores hexadecimales y ASCII , un byte por línea, y luego usa la función diff de Vim para representarlos visualmente.
fuente
dhex http://www.dettus.net/dhex/
DHEX es más que un simple editor hexadecimal: incluye un modo diff, que se puede usar para comparar dos archivos binarios de manera fácil y conveniente. Dado que está basado en ncurses y es temático, puede ejecutarse en cualquier número de sistemas y escenarios. Con su utilización de registros de búsqueda, es posible rastrear cambios en diferentes iteraciones de archivos fácilmente.
fuente
Puede usar la herramienta gvimdiff que se incluye en el paquete vim-gui-common
Luego puede comparar 2 archivos hexadecimales con los siguientes comandos:
Eso es todo. Espero que ayude!
fuente
La herramienta de análisis de firmware
binwalk
también tiene esto como una característica a través de su opción de línea de comando-W
/--hexdump
que ofrece opciones como mostrar solo los diferentes bytes:En el ejemplo de OP al hacer
binwalk -W file1.bin file2.bin
:fuente
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff es una gran herramienta de interfaz de usuario para comparar archivos binarios que se ha abierto recientemente.
fuente
El producto de código abierto en Linux (y todo lo demás) es Radare, que proporciona
radiff2
explícitamente para este propósito. Voté para cerrar esto porque yo y otros tenemos la misma pregunta, en la pregunta que usted haceEso es una locura sin embargo. Como se le preguntó, si inserta un byte en el primer byte en el archivo, encontrará que cada byte posterior es diferente y, por lo tanto, el diff repetiría todo el archivo, para una diferencia real de un byte.
Un poco más práctico es
radiff -O
. El-O
es para "" El código difiere con todos los bytes en lugar de solo los bytes fijos del código de operación ""Al igual que IDA Pro, Radare es una herramienta primaria para el análisis binario, también puede mostrar diferencias delta con
-d
, o mostrar los bytes desmontados en lugar de hexadecimal con-D
.Sin embargo, si está haciendo este tipo de preguntas, consulte
radiff2
para diferenciación binariafuente