In che modo il file ha identificato questo particolare file?


8

Sto correndo filecontro un file wallet.dat (un file in cui Bitcoin mantiene le sue chiavi private) e anche se non sembra esserci alcuna intestazione o stringa identificabile, fileposso ancora dire che è un file Berkley DB, anche se ridurlo a 16 byte.

So che il file stava applicando una sorta di regola o stava cercando una sequenza per identificarlo. Voglio sapere qual è la regola che sta applicando qui, in modo da poterla duplicare nel mio programma.


1
il file non è infallibile, fa solo ipotesi in base al contenuto del file, il "bug di stampa di martedì" è un esempio di dove stava indovinando sbagliato
Jasen

1
@Jasen filenon è sbagliato in questa circostanza.
Nick ODell,

Risposte:


16

Prendi l'origine del comando file. La maggior parte se non tutti gli unici open source usano questo . Il filecomando viene fornito con il magicdatabase, che prende il nome dai numeri magici che descrive. (Questo database è installato anche sul tuo sistema live, ma in forma compilata.) Cerca il file che contiene il testo descrittivo che vedi:

grep 'Berkeley DB' magic/Magdir/*

La magicpagina man descrive il formato del file. Le linee di trigger per "Berkeley DB" sono

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 prima colonna specifica l'offset in corrispondenza del quale deve essere trovata una determinata sequenza di byte. La terza colonna contiene la sequenza di byte. La seconda colonna descrive il tipo di sequenza di byte: longsignifica 4 byte nell'endianness della piattaforma ; lelonge belongsignifica 4 byte rispettivamente in ordine little-endian e big-endian.

Invece di replicare le regole, potresti voler chiamare l' fileutilità; è specificato da POSIX , ma i formati che riconosce e le descrizioni che genera non lo sono. In alternativa, è possibile collegarsi libmagice chiamare la funzione magic_fileo magic_buffer.


10

Potresti:

  1. Esegui filedal tuo programma

  2. Utilizzare una libreria che fornisce filele funzionalità al proprio linguaggio di programmazione. ad es. libmagicper C, File::Libmagico File::MMagicper perl, python-magicper pitone, ecc.

A proposito, le definizioni che fileutilizza per identificare i file si trovano in /etc/magic. Vedere man 5 magicper i dettagli sul formato del file.


1
Su Linux /etc/magictende ad essere per la tua conoscenza di magia locale. Le distro tendono a far apparire la loro magia generica /usr/share/misc/magic.
steve

1
Ho finito per leggere la fonte: github.com/file/file/blob/…
Nick ODell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.