Wie hat die Datei diese bestimmte Datei identifiziert?

8

Ich filelaufe gegen eine wallet.dat-Datei (eine Datei, in der Bitcoin seine privaten Schlüssel behält) und obwohl es keinen identifizierbaren Header oder String zu geben scheint, filekann ich trotzdem feststellen, dass es sich um eine Berkley DB-Datei handelt, selbst wenn ich Schneiden Sie es auf 16 Bytes.

Ich weiß, dass diese Datei eine Art Regel angewendet oder nach einer Sequenz gesucht hat, um sie zu identifizieren. Ich möchte wissen, welche Regel hier angewendet wird, damit ich sie in meinem eigenen Programm duplizieren kann.

Nick ODell
quelle
1
Datei ist nicht unfehlbar, sie macht nur Vermutungen basierend auf dem Inhalt der Datei, der "Dienstag Druckfehler" ist ein Beispiel dafür, wo es falsch
geraten hat
1
@Jasen fileist unter diesen Umständen nicht falsch.
Nick ODell

Antworten:

16

Holen Sie sich die Quelle des Dateibefehls. Die meisten, wenn nicht alle Open-Source-Unices verwenden diese . Der fileBefehl wird mit der magicDatenbank geliefert, die nach den darin beschriebenen magischen Zahlen benannt ist. (Diese Datenbank ist ebenfalls auf Ihrem Live-System installiert, jedoch in kompilierter Form.) Suchen Sie nach der Datei, die den angezeigten Beschreibungstext enthält:

grep 'Berkeley DB' magic/Magdir/*

Die magicManpage beschreibt das Format der Datei. Die Triggerleitungen für „Berkeley DB“ sind

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

Die erste Spalte gibt den Offset an, bei dem eine bestimmte Bytefolge gefunden werden soll. Die dritte Spalte enthält die Bytesequenz. Die zweite Spalte beschreibt den Typ der Bytesequenz: longbedeutet 4 Bytes in der Endianness der Plattform ; lelongund belongbedeuten 4 Bytes in Little-Endian- bzw. Big-Endian-Reihenfolge.

Anstatt die Regeln zu replizieren, möchten Sie möglicherweise das fileDienstprogramm aufrufen . Es wird von POSIX angegeben , die erkannten Formate und die von ihm ausgegebenen Beschreibungen jedoch nicht. Alternativ können Sie libmagicdie Funktion magic_fileoder verknüpfen und aufrufen magic_buffer.

Gilles 'SO - hör auf böse zu sein'
quelle
10

Du könntest:

  1. Führen Sie es filein Ihrem Programm aus

  2. Verwenden Sie eine Bibliothek, die fileIhrer Programmiersprache Funktionen bietet . zB libmagicfür C, File::Libmagicoder File::MMagicfür die perl, python-magicfür Python usw.

Übrigens finden Sie die Definitionen, filemit denen Dateien identifiziert werden /etc/magic. Siehe man 5 magicfür Dateiformat Details.

cas
quelle
1
Unter Linux ist /etc/magicin der Regel für Ihr eigenes lokales magisches Wissen. Distros neigen dazu, ihre generische Magie einzubringen /usr/share/misc/magic.
Steve
1
Am