Comment le fichier at-il identifié ce fichier particulier?

8

Je cours filecontre un fichier wallet.dat (un fichier dans lequel Bitcoin conserve ses clés privées) et même s'il ne semble pas y avoir d'en-tête ou de chaîne identifiable file, je peux toujours dire qu'il s'agit d'un fichier Berkley DB, même si je le réduire à 16 octets.

Je sais que ce fichier appliquait une sorte de règle ou cherchait une séquence pour l'identifier. Je veux savoir quelle est la règle qu'elle applique ici, afin de pouvoir la dupliquer dans mon propre programme.

Nick ODell
la source
1
le fichier n'est pas infaillible, il fait juste des suppositions en fonction du contenu du fichier, le "bogue d'impression du mardi" est un exemple où il devinait faux
Jasen
1
@Jasen filen'a pas tort dans cette circonstance.
Nick ODell

Réponses:

16

Saisissez la source de la commande file. La plupart, sinon la totalité, des unités open source utilisent celle-ci . La filecommande est livrée avec la magicbase de données, nommée d'après les nombres magiques qu'elle décrit. (Cette base de données est également installée sur votre système actif, mais sous une forme compilée.) Recherchez le fichier qui contient le texte de description que vous voyez:

grep 'Berkeley DB' magic/Magdir/*

La magicpage de manuel décrit le format du fichier. Les lignes de déclenchement de «Berkeley DB» sont

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 première colonne spécifie le décalage auquel une certaine séquence d'octets doit être trouvée. La troisième colonne contient la séquence d'octets. La deuxième colonne décrit le type de séquence d'octets: longsignifie 4 octets dans l' endianité de la plateforme ; lelonget belongsignifient respectivement 4 octets dans l'ordre petit-bout et gros-bout.

Plutôt que de répliquer les règles, vous souhaiterez peut-être appeler l' fileutilitaire; il est spécifié par POSIX , mais les formats qu'il reconnaît et les descriptions qu'il génère ne le sont pas. Vous pouvez également créer un lien vers libmagicet appeler la fonction magic_fileou magic_buffer.

Gilles 'SO- arrête d'être méchant'
la source
10

Vous pourriez:

  1. Exécutez à filepartir de votre programme

  2. Utilisez une bibliothèque qui fournit fileles fonctionnalités de votre langage de programmation. par exemple libmagicpour C, File::Libmagicou File::MMagicpour perl, python-magicpour python, etc.

BTW, les définitions fileutilisées pour identifier les fichiers se trouvent dans /etc/magic. Voir man 5 magicpour plus de détails sur le format de fichier.

cas
la source
1
Sur Linux, c'est /etc/magicgénéralement pour votre propre connaissance de la magie locale. Les distros ont tendance à faire entrer leur magie générique /usr/share/misc/magic.
steve
1
J'ai fini par lire la source: github.com/file/file/blob/…
Nick ODell