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!


Tal vez pueda interesarte


Compartí este artículo