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.bines
00 90 00 11
en forma binaria y file2.bines
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 -lpero 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-1que 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
strtonumes 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.opendiffOS X en lugar devimdiff): la vista predeterminadaxxdproporciona el motor diff en la pista comparando byte por byte. Con hexadecimal simple (en bruto) simplemente con ajuste de columnafold,diffintentarí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+xxdPruebe
diffcon la siguiente combinación de sustitución de procesos zsh / bash:Dónde:
-yle muestra las diferencias de lado a lado (opcional).xxdes la herramienta CLI para crear una salida hexdump del archivo binario.-W200adiffpara una salida más amplia (de 200 caracteres por línea).colordiffcomo se muestra a continuación.colordiff+xxdSi lo ha hecho
colordiff, puede colorear ladiffsalida, por ejemplo:De lo contrario, instalar a través de:
sudo apt-get install colordiff.Salida de muestra:
vimdiff+xxdTambién puede usar
vimdiff, por ejemploConsejos:
-l1000) para cadaxxdfuente
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin).diff -y <(xxd foo1.bin) <(xxd foo2.bin)-qo--brief, que solo mostrará la salida cuando los archivos difieran.xxddiffpara 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
odsobrexxdporque:xxdno está (viene con Vim)-Anpara eliminar la columna de dirección sinawk.Explicación del comando:
-Anelimina 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.-w1pone 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.-tx1es la representación que desea, cambie a cualquier valor posible, siempre que mantenga 1 byte por línea.-vevita 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 enbdifflugar 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
difflugar 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.hexymyfile2.hex.El
hexdiffes 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 hexdifflos comandos para moverse en el archivo, y seqcerrará 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
binwalktambién tiene esto como una característica a través de su opción de línea de comando-W/--hexdumpque 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
radiff2explí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-Oes 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
radiff2para diferenciación binariafuente