¿Cómo identificó el archivo este archivo en particular?

8

Me estoy ejecutando filecontra un archivo wallet.dat (un archivo en el que Bitcoin mantiene sus claves privadas) y aunque no parece haber ningún encabezado o cadena identificable, fileaún puedo decir que es un archivo Berkley DB, incluso si reducirlo a 16 bytes.

Sé que ese archivo estaba aplicando algún tipo de regla o buscando alguna secuencia para identificarlo. Quiero saber cuál es la regla que está aplicando aquí, para poder duplicarla en mi propio programa.

Nick ODell
fuente
1
el archivo no es infalible, solo hace suposiciones basadas en el contenido del archivo, el "error de impresión del martes" es un ejemplo de dónde estaba adivinando mal
Jasen
1
@Jasen fileno está mal en esta circunstancia.
Nick ODell el

Respuestas:

16

Agarra la fuente del comando de archivo. La mayoría, si no todas las unidades de código abierto usan esta . El filecomando viene con la magicbase de datos, llamada así por los números mágicos que describe. (Esta base de datos también está instalada en su sistema en vivo, pero en forma compilada). Busque el archivo que contiene el texto descriptivo que ve:

grep 'Berkeley DB' magic/Magdir/*

La magicpágina del manual describe el formato del archivo. Las líneas de activación para "Berkeley DB" son

0       long    0x00061561      Berkeley DB
0       belong  0x00061561      Berkeley DB
12      long    0x00061561      Berkeley DB
12      belong  0x00061561      Berkeley DB
12      lelong  0x00061561      Berkeley DB
12      long    0x00053162      Berkeley DB
12      belong  0x00053162      Berkeley DB
12      lelong  0x00053162      Berkeley DB
12      long    0x00042253      Berkeley DB
12      belong  0x00042253      Berkeley DB
12      lelong  0x00042253      Berkeley DB
12      long    0x00040988      Berkeley DB
12      belong  0x00040988      Berkeley DB 
12      lelong  0x00040988      Berkeley DB

La primera columna especifica el desplazamiento en el que se encuentra una determinada secuencia de bytes. La tercera columna contiene la secuencia de bytes. La segunda columna describe el tipo de secuencia de bytes: longsignifica 4 bytes en el endianness de la plataforma ; lelongy belongsignifica 4 bytes en orden little-endian y big-endian respectivamente.

En lugar de replicar las reglas, puede llamar a la fileutilidad; POSIX lo especifica , pero los formatos que reconoce y las descripciones que genera no lo son. Alternativamente, puede vincular libmagicy llamar a la función magic_fileo magic_buffer.

Gilles 'SO- deja de ser malvado'
fuente
10

Tú podrías:

  1. Ejecutar filedesde su programa

  2. Use una biblioteca que brinde filela funcionalidad de su lenguaje de programación. por ejemplo, libmagicpara C, File::Libmagico File::MMagicpara perl, python-magicpara python, etc.

Por cierto, las definiciones que fileutiliza para identificar archivos se encuentran en /etc/magic. Consulte man 5 magiclos detalles del formato de archivo.

cas
fuente
1
En Linux /etc/magictiende a ser para su propio conocimiento mágico local. Las distribuciones tienden a reventar su magia genérica /usr/share/misc/magic.
Steve
1
Terminé leyendo la fuente: github.com/file/file/blob/…
Nick ODell el