Как файл идентифицировал этот конкретный файл?

8

Я работаю fileс файлом wallet.dat (файл, в котором Биткойн хранит свои закрытые ключи), и, хотя кажется, что в нем нет идентифицируемого заголовка или строки, я fileвсе равно могу сказать, что это файл Berkley DB, даже если я сократить до 16 байтов.

Я знаю, что файл применял какое-то правило или искал последовательность для его идентификации. Я хочу знать, какое правило здесь применяется, чтобы я мог продублировать его в своей программе.

Ник Оделл
источник
1
файл не является непогрешимым, он только делает предположения на основе содержимого файла, «ошибка печати во вторник» является одним из примеров того, где он угадал неправильно
Jasen
1
@ Джейсен fileне ошибается в этом случае.
Ник ODell

Ответы:

16

Возьмите источник файловой команды. Большинство, если не все открытые источники, используют этот . Команда fileпоставляется с magicбазой данных, названной в честь магических чисел, которые она описывает. (Эта база данных также установлена ​​в вашей действующей системе, но в скомпилированной форме.) Найдите файл, который содержит текст описания, который вы видите:

grep 'Berkeley DB' magic/Magdir/*

Страница magicman описывает формат файла. Триггерные линии для «Berkeley DB»:

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

Первый столбец указывает смещение, при котором должна быть найдена определенная последовательность байтов. Третий столбец содержит последовательность байтов. Второй столбец описывает тип последовательности байтов: longозначает 4 байта в порядке следования платформы ; lelongи belongозначают 4 байта в порядке с прямым и младшим порядком байтов соответственно.

Вместо того, чтобы копировать правила, вы можете вызвать fileутилиту; он определяется POSIX , но форматы, которые он распознает, и описания, которые он выводит, не являются. Кроме того, вы можете связать libmagicи вызвать функцию magic_fileили magic_buffer.

Жиль "ТАК - перестань быть злым"
источник
10

Вы могли бы:

  1. Запустите fileиз вашей программы

  2. Используйте библиотеку, которая обеспечивает fileфункциональность вашего языка программирования. например, libmagicдля C, File::Libmagicили File::MMagicдля perl, python-magicдля Python и т. д.

Кстати, определения, которые fileиспользуются для идентификации файлов находятся в /etc/magic. Смотрите информацию man 5 magicо формате файла.

саз
источник
1
На Linux, /etc/magicкак правило, для вашего собственного локального знания магии. В дистрибутивах свойственно волшебство /usr/share/misc/magic.
Стив
1
В итоге я просто прочитал источник: github.com/file/file/blob/…
Ник ODell