En este artículo voy a explicar cómo volcar el contenido de archivos binarios (o de cualquier tipo) en diferentes formatos (típicamente en hexadecimal y ASCII), en GNU/Linux, utilizando la herramienta hexdump
.
En GNU/Linux, la herramienta hexdump
es un filtro que permite mostrar archivos en diferentes formatos especificados por el usuario. A este procedimiento típicamente se lo denomina "volcar" (dump, en inglés), y generalmente se utiliza para determinar el contenido de archivos binarios en formato hexadecimal, al igual que para extraer caracteres ASCII (conjunto de caracteres de 8 bit), calcular offsets (desplazamientos) dentro de archivos, etc.
hexdump
es parte del paquete util-linux-ng
.
Por ejemplo, veamos qué contenido hay en el comienzo del binario ejecutable /bin/vi
:

Al tratar de mostrar el contenido con las herramientas head
o cat
, se observan muchos caracteres no imprimibles (ocultos en procesadores de texto). Por lo tanto debemos recurrir a hexdump
si deseamos obtener una salida más "limpia", o si simplemente deseamos volcar el archivo utilizando otro formato o codificación.
La opción -b
permite volcar el contenido del archivo expresando cada byte en formato octal (sistema numérico en base 8):

La opción -c
permite volcar cada caracter imprimible del archivo:

En cambio, utilizando C mayúscula (-C
), es posible obtener cada byte del archivo, tanto en formato hexadecimal como ASCII (muy útil para volcar archivos binarios):

La opción -d
vuelca el contenido en formato decimal, agrupando de a dos bytes:

A su vez, la opción -o
vuelca el contenido en formato octal, agrupando de a dos bytes:

Finalmente, -x
vuelca el contenido en formato hexadecimal, de forma similar a -C
, pero agrupando de a dos bytes (y sin mostrar en formato ASCII):

Como ejemplo adicional, voy a volcar el contenido de un archivo JPG proveniente de una cámara fotográfica, para demostrar cómo es posible obtener algo de información Exif rápidamente:
[emi@hal9000 ~]$ head -c 1024 /data/fotos/DSCF1489.JPG | hexdump -C 00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 |......JFIF.....H| 00000010 00 48 00 00 ff e1 14 98 45 78 69 66 00 00 49 49 |.H......Exif..II| 00000020 2a 00 08 00 00 00 0c 00 0f 01 02 00 09 00 00 00 |*...............| 00000030 9e 00 00 00 10 01 02 00 0e 00 00 00 a8 00 00 00 |................| 00000040 12 01 03 00 01 00 00 00 01 00 00 00 1a 01 05 00 |................| 00000050 01 00 00 00 b6 00 00 00 1b 01 05 00 01 00 00 00 |................| 00000060 be 00 00 00 28 01 03 00 01 00 00 00 02 00 00 00 |....(...........| 00000070 31 01 02 00 0b 00 00 00 c6 00 00 00 32 01 02 00 |1...........2...| 00000080 14 00 00 00 d2 00 00 00 13 02 03 00 01 00 00 00 |................| 00000090 02 00 00 00 98 82 02 00 05 00 00 00 e6 00 00 00 |................| 000000a0 69 87 04 00 01 00 00 00 08 01 00 00 a5 c4 07 00 |i...............| 000000b0 1c 00 00 00 ec 00 00 00 70 05 00 00 46 55 4a 49 |........p...FUJI| 000000c0 46 49 4c 4d 00 00 46 69 6e 65 50 69 78 20 53 34 |FILM..FinePix S4| 000000d0 30 30 30 00 48 00 00 00 01 00 00 00 48 00 00 00 |000.H.......H...| 000000e0 01 00 00 00 47 49 4d 50 20 32 2e 36 2e 39 00 00 |....GIMP 2.6.9..| 000000f0 32 30 31 34 3a 30 35 3a 30 39 20 31 34 3a 31 36 |2014:05:09 14:16| 00000100 3a 33 34 00 20 20 20 20 00 00 50 72 69 6e 74 49 |:34. ..PrintI| 00000110 4d 00 30 32 35 30 00 00 02 00 02 00 01 00 00 00 |M.0250..........| 00000120 01 01 00 00 00 00 24 00 9a 82 05 00 01 00 00 00 |......$.........| 00000130 be 02 00 00 9d 82 05 00 01 00 00 00 c6 02 00 00 |................| 00000140 22 88 03 00 01 00 00 00 02 00 00 00 27 88 03 00 |"...........'...| 00000150 01 00 00 00 40 00 00 00 00 90 07 00 04 00 00 00 |....@...........| 00000160 30 32 33 30 03 90 02 00 14 00 00 00 ce 02 00 00 |0230............| 00000170 04 90 02 00 14 00 00 00 e2 02 00 00 01 91 07 00 |................| 00000180 04 00 00 00 01 02 03 00 02 91 05 00 01 00 00 00 |................| 00000190 f6 02 00 00 01 92 0a 00 01 00 00 00 fe 02 00 00 |................| 000001a0 02 92 05 00 01 00 00 00 06 03 00 00 03 92 0a 00 |................| 000001b0 01 00 00 00 0e 03 00 00 04 92 0a 00 01 00 00 00 |................| 000001c0 16 03 00 00 05 92 05 00 01 00 00 00 1e 03 00 00 |................| 000001d0 07 92 03 00 01 00 00 00 05 00 00 00 08 92 03 00 |................| 000001e0 01 00 00 00 00 00 00 00 09 92 03 00 01 00 00 00 |................| 000001f0 10 00 00 00 0a 92 05 00 01 00 00 00 26 03 00 00 |............&...| 00000200 7c 92 07 00 14 02 00 00 2e 03 00 00 00 a0 07 00 ||...............| 00000210 04 00 00 00 30 31 30 30 01 a0 03 00 01 00 00 00 |....0100........| 00000220 01 00 00 00 02 a0 04 00 01 00 00 00 b8 0b 00 00 |................| 00000230 03 a0 04 00 01 00 00 00 d0 07 00 00 05 a0 04 00 |................| 00000240 01 00 00 00 52 05 00 00 0e a2 05 00 01 00 00 00 |....R...........| 00000250 42 05 00 00 0f a2 05 00 01 00 00 00 4a 05 00 00 |B...........J...| 00000260 10 a2 03 00 01 00 00 00 03 00 00 00 17 a2 03 00 |................| 00000270 01 00 00 00 02 00 00 00 00 a3 07 00 01 00 00 00 |................| 00000280 03 00 00 00 01 a3 07 00 01 00 00 00 01 00 00 00 |................| 00000290 01 a4 03 00 01 00 00 00 00 00 00 00 02 a4 03 00 |................| 000002a0 01 00 00 00 00 00 00 00 03 a4 03 00 01 00 00 00 |................| 000002b0 00 00 00 00 06 a4 03 00 01 00 00 00 00 00 00 00 |................| 000002c0 0a a4 03 00 01 00 00 00 00 00 00 00 0c a4 03 00 |................| 000002d0 01 00 00 00 00 00 00 00 00 00 00 00 0a 00 00 00 |................| 000002e0 58 02 00 00 e0 01 00 00 64 00 00 00 32 30 31 32 |X.......d...2012| 000002f0 3a 30 36 3a 32 35 20 31 38 3a 30 39 3a 35 32 00 |:06:25 18:09:52.| 00000300 32 30 31 32 3a 30 36 3a 32 35 20 31 38 3a 30 39 |2012:06:25 18:09| 00000310 3a 35 32 00 28 00 00 00 0a 00 00 00 58 02 00 00 |:52.(.......X...| 00000320 64 00 00 00 c5 01 00 00 64 00 00 00 5f 02 00 00 |d.......d..._...| 00000330 64 00 00 00 00 00 00 00 64 00 00 00 46 01 00 00 |d.......d...F...| 00000340 64 00 00 00 2d 05 00 00 64 00 00 00 46 55 4a 49 |d...-...d...FUJI| 00000350 46 49 4c 4d 0c 00 00 00 1c 00 00 00 07 00 04 00 |FILM............| 00000360 00 00 30 31 33 30 10 00 02 00 1f 00 00 00 62 01 |..0130........b.| 00000370 00 00 00 10 02 00 08 00 00 00 82 01 00 00 01 10 |................| 00000380 03 00 01 00 00 00 03 00 00 00 02 10 03 00 01 00 |................| 00000390 00 00 00 00 00 00 10 10 03 00 01 00 00 00 02 00 |................| 000003a0 00 00 11 10 0a 00 01 00 00 00 8a 01 00 00 20 10 |.............. .| 000003b0 03 00 01 00 00 00 00 00 00 00 21 10 03 00 01 00 |..........!.....| 000003c0 00 00 00 00 00 00 22 10 03 00 01 00 00 00 01 00 |......".........| 000003d0 00 00 23 10 03 00 02 00 00 00 60 08 48 06 26 10 |..#.......`.H.&.| 000003e0 03 00 01 00 00 00 40 00 00 00 30 10 03 00 01 00 |......@...0.....| 000003f0 00 00 00 00 00 00 31 10 03 00 01 00 00 00 0a 00 |......1.........| 00000400
Haciendo un poco de ingeniería inversa, se puede determinar que la foto fue tomada con una cámara FUJIFILM, que fue editada con GIMP 2.6.9, y que probablemente fue sacada y modificada (cuándo fue editada con GIMP) en las fechas 2012:06:25 18:09:52
y 2014:05:09 14:16:34
respectivamente.
Si fuese necesario volcar un archivo muy grande (recuerden que por defecto hexdump
vuelca la información filtrada por salida estándar), es conveniente reenviar la salida de hexdump
, utilizando un pipe (|
), hacia la entrada del comando more
(o less
, según sus preferencias):
hexdump -C /data/fotos/DSCF1489.JPG | more
¡Espero que les sirva!