¿Qué es y cómo funciona Hexdump?

Hexdump (registro hexadecimal) es una utilidad que muestra el contenido de los archivos binarios en hexadecimal, decimal, octal o ASCII. Es una utilidad para inspección y se puede usar para recuperación de datos, ingeniería inversa y programación.

Aprendiendo lo básico

Hexdump proporciona información con muy poco esfuerzo de tu parte y, dependiendo del tamaño del archivo que estés viendo, puede haber mucha información. Para los fines de este artículo, crearemos un archivo PNG 1×1. Puedes hacerlo con una aplicación de gráficos como GIMP o Mtpaint, o puedes crearlo en una terminal con ImageMagick.

Aquí hay un comando para generar un PNG de 1×1 píxeles con ImageMagick:

Puedes confirmar que este archivo es un PNG con el comando file:

Quizás te preguntes cómo el comando de file puede determinar qué tipo de archivo es. Casualmente, eso es lo que revelará hexdump. Por ahora, se puede ver el gráfico de un píxel en el visor de imágenes de tu elección (que se parece a esto: .), O se puede ver lo que hay dentro del archivo con hexdump:

Lo que estás viendo es el contenido del archivo PNG de muestra a través de un lente que quizás nunca hayas usado antes. Son exactamente los mismos datos que ves en un visor de imágenes, codificados de una manera que probablemente no te resulte familiar.

Extraer “strings” familiares

El hecho de que el volcado de datos predeterminado no tenga sentido, eso no significa que esté desprovisto de información valiosa. Puedes traducir esta información o al menos las partes que realmente se traducen, a un conjunto de caracteres más familiar con la opción –canonical:

En la columna derecha, verás los mismos datos que están a la izquierda, pero presentados como ASCII. Si observas detenidamente, puedes seleccionar información útil. Por ejemplo, el formato del archivo (PNG) y, hacia abajo, la fecha y la hora en que se creó y modificó por última vez.

Los puntos representan símbolos que no están presentes en el conjunto de caracteres ASCII. Esto es de esperarse porque los formatos binarios no están restringidos a letras y números mundanos.

El comando file sabe de los primeros 8 bytes qué son de este archivo. La especificación libpng alerta a los programadores qué deben buscar. Puedes ver que dentro de los primeros 8 bytes de este archivo de imagen, específicamente, está el string (caedena) PNG. Ese hecho es significativo porque revela cómo el comando file sabe sobre qué tipo de archivo informar.

También puedes controlar la cantidad de bytes que muestra hexdump, lo cual es útil con archivos de más de un píxel:

No tienes que limitar hexdump a PNG o archivos gráficos. Puedes ejecutar hexdump con binarios que ejecutas diariamente, como ls, rsync o cualquier formato binario que desees inspeccionar.

Implementando cat con hexdump

Si lees la especificación PNG, puedes notar que los datos en los primeros 8 bytes se ven diferentes de lo que proporciona hexdump. En realidad, son los mismos datos, pero se presentan usando una conversión diferente. Entonces, la salida de hexdump es verdadera, pero no siempre es directamente útil para ti, dependiendo de lo que estés buscando. Por esa razón, hexdump tiene opciones para formatear y convertir los datos sin procesar que extrae.

Las opciones de conversión pueden ser complejas, por lo que es útil practicar primero con algo trivial. Aquí hay una introducción suave al formateo de la información de hexdump reimplementando el comando cat.

Primero, ejecuta hexdump en un archivo de texto para ver los datos sin procesar. Por lo general, puedes encontrar una copia de la licencia GNU General Public License (GPL) en algún lugar de tu disco duro. También puedes usar cualquier archivo de texto que tengas a mano. Tu salida puede diferir, pero aquí te mostramos cómo encontrar una copia de la GPL en tu sistema (o al menos parte de ella):

Debes ejecutar hexdump ahora:

Si la salida del archivo es muy larga, debes usar –length (o -n para abreviar) para que sea manejable por ti mismo.

Los datos sin procesar probablemente no significan nada para ti, pero ya sabes cómo convertirlos a ASCII:

Resultado

Esa información es útil pero difícil de manejar y difícil de leer. Para formatear la salida de hexdump más allá de sus propias opciones, utiliza –format (o -e) junto con códigos de formateo especializados. La abreviatura utilizada para formatear es similar a la que usa el comando printf. Por lo tanto, si estás familiarizado con las sentencias printf, puedes encontrar que el formato hexdump es más fácil de aprender.

En hexdump, la secuencia de caracteres % _p le dice a hexdump que imprima un carácter en el conjunto de caracteres predeterminado de tu sistema. Toda la notación de formato para la opción –format debe estar entre comillas simples:

Esta información es mejor, pero sigue siendo inconveniente para leer. Tradicionalmente, los archivos de texto UNIX asumen un ancho de salida de 80 caracteres (porque hace mucho, los monitores solían ajustarse en solo 80 caracteres).

Si bien esta información no está vinculada por el formato, puedes forzar a hexdump para procesar 80 bytes a la vez con opciones adicionales. Específicamente, dividiendo 80 entre uno, puedes decirle a hexdump que trate 80 bytes como una unidad:

Ahora el archivo se procesa en fragmentos de 80 bytes, pero ha perdido la sensación de nuevas líneas. Puedes agregar el tuyo propio con el carácter \n , que en UNIX representa una nueva línea:

Ahora has implementado (aproximadamente) el comando cat con formato hexdump.

Controlando la información

Formatear es, de manera realista, cómo hacer que hexdump sea útil. Ahora que estás familiarizado, al menos en principio, con el formato hexdump, puedes hacer que la salida de hexdump -n8 coincida con la salida del encabezado PNG. Yal como se describe en la especificación oficial de libpng.

Primero, sabes que deseas que hexdump procese el archivo PNG en fragmentos de 8 bytes. Además, puedes saber mediante el reconocimiento de enteros que la especificación PNG está documentada en decimal. Esta está representada por %d de acuerdo con la documentación hexdump:

Puedes hacer que la salida sea perfecta agregando un espacio en blanco después de cada entero:

El resultado ahora coincide perfectamente con la especificación PNG.

Hexdumping para diversión y ventajas

Hexdump es una herramienta fascinante que no solo le enseña más sobre cómo las computadoras procesan y convierten la información. Este también te muestra cómo funcionan los formatos de archivo y los binarios compilados. Debes intentar ejecutar hexdump en archivos al azar durante el día mientras trabajas. Nunca se sabe qué tipo de información puedes encontrar, ni cuándo tener esa información puede ser útil.