Что такое сигнатура файла
Перейти к содержимому

Что такое сигнатура файла

  • автор:

§1.4. Файлы и их форматы

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

Каким образом операционная система понимает, как открыть тот или иной файл? По расширению: например, dog.jpg — это изображение, а file.mp4 — это видео. С каждым расширением ассоциированы программы, которые могут открывать соответствующие файлы.

В Windows ассоциированные программы изменяются в приложении «Параметры».

Расширения и форматы

Давайте проведём эксперимент: возьмём картинку. Переименуем её в dog.mp3 и попробуем открыть получившийся файл. Откроется аудиопроигрыватель и сообщит, что файл некорректен. Однако, если открыть этот файл с помощью программы для просмотра изображений, то откроется исходная картинка, несмотря на неверное расширение. Как же программа понимает, что это на самом деле картинка? На самом деле, каждый формат имеет определенную структуру, у разных форматов она различна.

Для изучения структуры файлов нам понадобится специальная программа — HEX-редактор. Она позволяет видеть содержимое файлов в шестнадцатеричном формате, чтобы было удобно читать нетекстовые файлы. Откроем файл в HEX-редакторе.

Слева находятся байты в шестнадцатеричном виде, справа — соответствующие ASCII-символы.

Как вы видите, в начале есть байты FF D8 FF — они будут встречаться в начале каждого изображения в формате JPEG. Многие из них содержат ещё и читаемый текст JFIF в правой части. Такие магические байты называются сигнатурами (англ. signature — подпись) — у каждого файла свои. Достаточно большой список есть на Википедии, и можно поискать сигнатуру неизвестного файла там. Но есть способ и проще: в Linux входит встроенная утилита file, которая умеет определять информацию о файле по сигнатуре.

Давайте попробуем ей воспользоваться. Откройте терминал, перейдите в директорию с нашим файлом и введите file dog.mp3 .

Мы увидим, что файл на самом деле является JPEG-изображением.

Кроме сигнатуры, у каждого формата есть своя структура — определенными байтами обозначаются начало и конец файла, задаются размеры картинки и так далее. А что произойдет, если мы вмешаемся в структуру файла? Давайте попробуем дописать что-нибудь в конец, и сохранить файл. В wxHexEditor для этого нужно нажать правой кнопкой мыши в конец, выбрать Insert, указать число дописываемых символов, а дальше дописать текст вместо 00 .

Мы дописали «hello, world!».

Если мы снова откроем картинку просмотрщиком, она покажется без изменений — как ни в чем не бывало. Это связано с тем, что в формате JPEG есть маркер окончания файла — всё после него будет проигнорировано. Таким образом, мы можем дописать любые произвольные данные, и они будут незаметными: человек, не знающий о нашем способе, увидит картинку без изменений. Но как их достать обратно? Можно открыть файл HEX-редактором, и промотать в конец. Но если мы скрываем не текст, то будет трудно найти конец картинки и начало наших данных. Известен такой трюк: существуют форматы, которые разрешают размещать сигнатуру не только в начале файла, а во всём файле. Если сигнатура встретится где-то в середине, то всё, что было раньше, просто отбрасывается. Один из таких форматов — архив RAR.

Давайте рассмотрим в качестве примера другой файл. При открытии файла мы видим тех же самых собак. Если мы откроем файл в HEX-редакторе, то конец будет другим. Сравнить файлы можно прямо там же: выберем ToolsCompare Files и режим Different bytes. Он ищет те байты, которые различаются.

Видим, что в конце появились какие-то байты, начинающиеся с Rar! .

Чтобы увидеть архив, достаточно просто переименовать файл в rarjpeg.rar и открыть: архив откроется, и мы увидим секретный файл.

Другой способ искать склеенные файлы — воспользоваться утилитой binwalk. Снова откроем терминал и попробуем запустить её на нашей картинке: binwalk rarjpeg.jpg .

binwalk видит, что файл составлен из двух частей.

Если запустить утилиту снова с флагом -e (от англ. extract — извлечь): binwalk -e rarjpeg.jpg , то рядом с картинкой появится директория, в которой отдельно будет лежать архив.

Подобные склейки довольно распространены. Их принято называть rarjpeg независимо от того, какие форматы используются.

Как создать такой секретный файл самостоятельно? Возьмём два файла, которые мы хотим склеить. Допустим, image.jpg и archive.rar . В Linux встроена утилита cat, которая поможет нам осуществить склейку. Ей нужно передать два файла в качестве аргумента и указать файл для вывода: cat image.jpg archive.rar > result.jpg .

Выводы

  1. Операционная система решает, какой программой открывать файл, по расширению файла.
  2. Программы смотрят на структуру файла и ищут там необходимые данные.
  3. Некоторые форматы файлов можно склеивать в один, и при открытии разными программами будут показываться разные данные. Таким образом можно скрывать факт наличия дополнительной информации в файле.
  4. Склеивать файлы можно с помощью cat, а обнаруживать склейки — HEX-редактором и утилитой binwalk.

Что такое сигнатура файла

Tanja Sholokhova » Пн дек 31, 2007 19:54

Кто знает, что такое сигнатура файла? В смысле привязки к его расширению. Случилось намедни удалить 700 МБ-ный почтовый ящик TheBat, продукт 10-летнего непосильного труда. В Ontrack EasyRecovery есть Raw Recovery c восстановлением файлов по расширению. В списке перечислены наиболее известные типы файлов, а нужного типа TBB нет. Чтобы добавить новый тип, надо задать его сигнатуру и смещение. Что это такое?
Спасибо.
Всех с Новым Годом!

Чтобы что-то сделать, нужно это делать.
Tanja Sholokhova
Сообщения: 1583 Зарегистрирован: Чт апр 21, 2005 12:17

Бродяга » Пн дек 31, 2007 21:34

MD5?
C наступающим!
А потом уже поздно было редактировать. © bagira:)

Бродяга
Сообщения: 4948 Зарегистрирован: Ср дек 07, 2005 13:34

Tanja Sholokhova » Вт янв 01, 2008 13:52

Может быть. Не потяну это.
Чтобы что-то сделать, нужно это делать.
Tanja Sholokhova
Сообщения: 1583 Зарегистрирован: Чт апр 21, 2005 12:17

Marko » Вт янв 01, 2008 15:59

А если воспользоваться другой программой? Меня радует EASEUS Data Recovery Wizard Professional.
Где запрещено смеяться, там, как правило, и плакать нельзя.
(Станислав Ежи Лец)

Marko Физик Сообщения: 16559 Зарегистрирован: Ср дек 27, 2006 01:21 Откуда: Киев Язык(-и): en,pl,de,cs,sk>ru,uk

Бродяга » Вт янв 01, 2008 16:00

Нет, похоже, что это всё же не MD5.

Вообще, вероятность восстановления настолько здоровенного файла крайне мала — скорее всего, на его месте уже что-то записано.

А потом уже поздно было редактировать. © bagira:)

Бродяга
Сообщения: 4948 Зарегистрирован: Ср дек 07, 2005 13:34

Tanja Sholokhova » Вт янв 01, 2008 16:23

Это не один файл. Это ряд папок с файлами Messages.tbb и Messages.tbi. Что-то восстановилось, но многое ушло.
Marko: вообще-то продукты Ontrack в определенных кругах считаются лучшими.

Чтобы что-то сделать, нужно это делать.
Tanja Sholokhova
Сообщения: 1583 Зарегистрирован: Чт апр 21, 2005 12:17

Tanja Sholokhova » Вт янв 01, 2008 20:09

Проверено: Ontrack находит несколько больше, чем EASEUS.
Чтобы что-то сделать, нужно это делать.
Tanja Sholokhova
Сообщения: 1583 Зарегистрирован: Чт апр 21, 2005 12:17

mikhailo » Вт янв 01, 2008 20:37

Сигнатура — уникальная последовательность байтов, позволяющая однозначно идентифицировать файл.

Попробуйте первые 6 байт.

Если у Вас папки были на диске С — забудьте о полном восстановлении и радуйтесь хотя бы частичному восстановлению информации.

Any man who is under 30, and is not a liberal, has not heart; and any man who is over 30, and is not a conservative, has no brains. — Sir Winston Churchill

mikhailo
Сообщения: 3880 Зарегистрирован: Пн июл 12, 2004 07:22 Язык(-и): EN,DE,IT>RU; СУРДОПЕРЕВОД

Tanja Sholokhova » Вт янв 01, 2008 21:01

Какие 1-е 6 байт?
Файлы были на С, но система на F. Наблюдение за С у меня отключено, туда почти ничего не пишется. Думаю, если бы впопыхах не были сделаны тут кое-какие действия, то можно было бы восстановить гораздо больше. Теперь уже, конечно, больше не выжмешь.

Вложения Sign.gif (8.86 КБ) Просмотров: 2029
Чтобы что-то сделать, нужно это делать.
Tanja Sholokhova
Сообщения: 1583 Зарегистрирован: Чт апр 21, 2005 12:17

Бродяга » Вт янв 01, 2008 22:18

Tanja Sholokhova писал(а): Думаю, если бы впопыхах не были сделаны тут кое-какие действия, то можно было бы восстановить гораздо больше.

Ну да, теперь в Попыхи нагрянуло Гестапо.

ЗЫ. Картинка зверская.

А потом уже поздно было редактировать. © bagira:)

Бродяга
Сообщения: 4948 Зарегистрирован: Ср дек 07, 2005 13:34

Tanja Sholokhova » Вт янв 01, 2008 23:03

Сейчас вот с помощью сигнатуры чистого TBB нашлись какие-то файлы. Просматриваю, вроде данные есть. Посмотрю, как скушает Bat.

Чтобы что-то сделать, нужно это делать.
Tanja Sholokhova
Сообщения: 1583 Зарегистрирован: Чт апр 21, 2005 12:17

Tanja Sholokhova » Вт янв 01, 2008 23:51

Сообщаю: Bat кушает хорошо, думаю, много данных будет восстановлено. Так что рекомендую Ontrack EasyRecovery.
Отдельное спасибо Михайлу — надоумил, куда двигаться.

Статья Определение типа файла по его сигнатуре с помощью Python

Вполне возможно, что при разработке приложений вам может понадобиться определение типа файла. И не всегда тип файла можно узнать по расширению. Если в ОС Linux это не составляет больших проблем, так как данная операционная система распознает тип файла не по расширению, а по содержимому, то вот в Windows отсутствие расширения иногда вызывает множество вопросов. Давайте попробуем понять, как можно определить тип файла с помощью Python.

68416866.jpg

К сожалению, в Python встроенного модуля для определения типа файлов нет. Но есть модули сторонних разработчиков. Да, в стандартной поставке есть mimetypes, однако распознавать содержимое файла без расширения он не умеет.

Из сторонних модулей можно выделить magic. С ее помощью довольно точно можно узнать mime-тип файла. Вот только работа данного модуля завязана на библиотеку libmagic1. То есть, по сути это просто оболочка вокруг данной библиотеки. И для работы модуля требуется ее наличие. И если в Linux зачастую она установлена по умолчанию, то вот в Windows понадобиться установить библиотеки DLL. Давайте чуть подробнее рассмотрим, что нужно для того, чтобы работать с данным модулем, его установку и требования.

Что понадобиться?

Для начала необходимо установить сам модуль. Поэтому пишем в терминале команду:

pip install python-magic

В принципе, если вы работаете в Linux, установки библиотеки libmagic1 может и не понадобиться. К примеру, в Linux Mint данная библиотека установлена «из коробки». Однако, если, все же, у вас ее нет, то установка библиотеки в Ubuntu/Debian делается командой:

sudo apt-get install libmagic1

Если вы работаете в операционной системе Windows, то нужно установить DLL с помощью команды:

pip install python-magic-bin

В принципе, на этом все. Для работы модуля больше ничего особо не требуется.

Определение mime-типа файла с помощью magic

Давайте напишем маленький скрипт, для примера, чтобы понять, как работает данная библиотека.
Импортируем в скрипт нужные модули:

from pathlib import Path import magic

Теперь напишем небольшую функцию из одной строки, которая будет принимать путь к файлу и просто печатать его mime-тип.

def mime_magic(path): print(magic.Magic(mime=True).from_file(path))

И теперь, в функции main, вызовем данную функцию и передадим в нее путь к файлу.

def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") mime_magic(path) if __name__ == "__main__": main()

Скрипт в сборе

from pathlib import Path import magic def mime_magic(path): print(magic.Magic(mime=True).from_file(path)) def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") mime_magic(path) if __name__ == "__main__": main()

Я специально удалил расширение у файла и передал в функцию путь к нему. И вот, что я получил на выходе:

01.png

Однако, как я уже писал ранее, данный модуль — это только обертка python над библиотекой libmagic1. И здесь, если вы пишите переносимое приложение, придется тащить за собой все остальные зависимости. Проверять, установлена ли библиотека или, в случае с Windows устанавливать библиотеки DLL.

Но, есть еще один, более «хардкорный» путь. Ничего нового в нем нет, но он требует получения сигнатуры файла и сравнения со списком или словарем сигнатур для получения типа файла.

Определение типа файла по его сигнатуре

Понятие сигнатура файла известно так же как «магическое число». Это целочисленная или текстовая константа, с помощью которой можно однозначно идентифицировать ресурс или данные. Само по себе, это число не несет никакого смысла. Примером такого магического числа может служить исполняемый файл Windows с расширением .exe. Он начинается с последовательности байт 0x4D5A, и это само по себе символично, так как соответствует ASCII-символам MZ, которые являются инициалами Марка Збиковски являющегося одним из создателей MS-DOS.

В Linux, как я уже писал выше, тип файла определяется по его содержимому, точнее, по его сигнатуре, вне зависимости от его расширения и названия. Для того, чтобы интерпретировать сигнатуру файла можно использовать стандартную утилиту file.

Как же можно использовать это в скрипте python? Для примера я составил небольшой словарик сигнатур файлов. Конечно же, это только очень маленькая часть от огромного количества самых разнообразных сигнатур. Однако, это уже позволяет определить тип некоторых мультимедийных форматов файлов. Данные сигнатуры были взяты из статьи Википедии по этому

Ссылка скрыта от гостей

. Давайте от теории перейдем к практике.

Для начала импортируем нужные модули в наш скрипт. Здесь нам понадобятся два стандартных модуля: sys и Path из библиотеки pathlib.

import sys from pathlib import Path

Теперь инициализируем словарь с сигнатурами. Конечно же, если бы это был более масштабный проект, имело бы смысл вынести данные сигнатуры в отдельный модуль или json-файл. Но, так как, это лишь пример того, как определить сигнатуру, словарь маленький, а потому выносить его в отдельный модуль не имеет смысла.

signature =

Напишем небольшую функцию, в которой и будет происходить основное действие. Я назвал ее read_file(path). На входе она получает путь к файлу, тип которого требуется определить. А на выходе мы получаем тип файла или сообщение о невозможности определить сигнатуру.

Откроем файл на чтение в байтовом режиме. Считаем первые 256 байт. Этого вполне достаточно для того, чтобы определить тип файла. Переведем полученные данные в шестнадцатеричный вид.

 with open(path, 'rb') as f: file = f.read(256) hex_bytes = " ".join([''.format(byte) for byte in file])

Запустим цикл для итерации по словарю сигнатур. В данном цикле запустим еще один цикл для итерации по полученной сигнатуре с определенным смещением. Сигнатуры типов файлов, которые представлены в моем словаре имею либо нулевое, либо смещение 4 байта. С учетом пробелов, это будет 12 символов. И дальше сравниваем сигнатуру из словаря с текущим куском байт, со смещением имеющим длину текущей сигнатуры. Если сигнатура найдена, возвращаем сообщение с именем файла и его типом. Если же сигнатура не найдена — возвращаем сообщение о неизвестной сигнатуре.

 for hex_ch in signature: for i in [0, 12]: if hex_ch == str(hex_bytes[i:len(hex_ch) + i]): return f'Файл: "" имеет сигнатуру: "" файла' continue return "Неизвестная сигнатура"

Ну и функция main, в которой получаем путь к файлу и вызываем функцию read_file, в которую передаем полученный путь предварительно проверенный на существование.

def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") sys.exit(0) print(read_file(path)) if __name__ == "__main__": main()

Полный код скрипта

import sys from pathlib import Path signature = < "66 74 79 70 33 67": "3gp, 3gp2", "FF D8 FF E0": "jpg", "49 46 00 01": "jpeg", "89 50 4E 47 0D 0A 1A 0A": "png", "25 50 44 46 2D": "pdf", "4F 67 67 53": "ogg, oga, ogv", "52 49 46 46": "wav", "57 41 56 45": "wav", "41 56 49 20": "avi", "FF FB": "mp3", "FF F3": "mp3", "FF F2": "mp3", "49 44 33": "mp3", "66 4C 61 43": "flac", "1A 45 DF A3": "mkv, mka, mks, mk3d, webm", "47": "ts, tsv, tsa", "00 00 01 BA": "mpg, mpeg", "00 00 01 B3": "mpg, mpeg", "66 74 79 70 4D 53 4E 56": "mp4", "66 74 79 70 69 73 6F 6D": "mp4", "66 74 79 70 6D 70 34 32": "m4v" >def read_file(path: str) -> str: """ Получение сигнатуры файла. Итерация по словарю сигнатур и сравнение их с полученной сигнатурой в соответствии со смещением. :param path: Путь к файлу. :return: Строка, тип файла или сообщение о неизвестной сигнатуре. """ with open(path, 'rb') as f: file = f.read(256) hex_bytes = " ".join([''.format(byte) for byte in file]) for hex_ch in signature: for i in [0, 12]: if hex_ch == str(hex_bytes[i:len(hex_ch) + i]): return f'Файл: "" имеет сигнатуру: "" файла' continue return "Неизвестная сигнатура" def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") sys.exit(0) print(read_file(path)) if __name__ == "__main__": main()

Для теста я выбрал файл mp3 без расширения и файл mp4 скачанный с YouTube. И вот что у меня получилось:

02.png

03.png

04.png

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

А на этом пожалуй все.

Спасибо за внимание. Надеюсь, что данная информация будет вам полезна

Создание файла сигнатур

Создать файл сигнатур

Файл сигнатур необходим, когда вы используете инструмент геообработки Классификации по методу максимального подобия (Maximum Likelihood Classification) для классификации изображения. Для создания файла сигнатур используйте инструмент Создать файл сигнатур (Create Signature File) в диалоговом окне Менеджер обучающей выборки .

Использование кнопки Создать файл сигнатур (Create Signature File)

  1. Создайте обучающую выборку с помощью панели инструментов Классификация изображений (Image Classification) , если она еще не создана. См. шаги для создания обучающей выборки в разделе Создание обучающей выборки.
  2. Откройте Менеджер обучающей выборки на панели инструментов Классификация изображений (Image Classification) . Щелкните кнопку Создать файл сигнатур (Create Signature File) .

Появляется диалоговое окно Выберите файл.

Файл сигнатур сохраняется на диск.

Примечание:

Создать файл сигнатур

Кнопка Создать файл сигнатур (Create Signature File) будет недоступна при отсутствии обучающей выборки в Менеджере обучающей выборки .

Связанные разделы

  • Что такое классификация изображений?
  • Менеджер обучающей выборки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *