Comparando *binarios* con Bash

Actualización por Gunnar 11/Feb/’10 22:00. Script más breve aún y elegante. ¡Gracias Gunnar!

#!/bin/bash
# Elimina el uso de temporales, y usa descriptores de archivos.
[ $# -lt 2 ] && echo "Usage: $0 file_a fileb" && exit 0
if [ -f $1 -a -f $2 ]; then
diff <(hexdump $1) <(hexdump $2)
fi

En el artículo original, se describe este sencillo script para un proyecto de ingeniería reversa, intentando encontrar la estructura de archivo de datos. Mientras un simple diff hace bien el trabajo con archivos de texto, lo que vemos es un pequeño rodeo que hace el trabajo, y para nuestra suerte el tipo es todo un hacker, que se tomó algunos minutos para compartir la solución.

Aquí está el poema original (el de Gunnar es todo un haikú, y nos lo explica en sus comentarios):

#!/bin/bash
# script to compare two binary files
TMP=/tmp
[ $# -lt 2 ] && echo "Usage: $0 file_a fileb" && exit 0
R1=`mktemp -u -p /tmp XXXXXXXX`
R2=`mktemp -u -p /tmp XXXXXXXX`
if [ -f $1 -a -f $2 ]; then
hexdump $1 > $R1
hexdump $2 > $R2
diff $R1 $R2
rm $R1 $R2
fi

Como pueden ver, si se usan adecuadamente las capacidades de bash puede llevarnos a código más sencillo y más fácil de corregir y mantener.

    • Gunnar

      Ups, disculpa, error de dedo:

      diff <(hexdump $1) <(hexdump $2)

      La construcción <(…) ejecuta el comando que lleva dentro y te entrega el resultado – Pero no como una cadena (como lo harían las comillas inversas `…` o la sintaxis embellecida de bash, $(…) ) sino como un descriptor de archivo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s