Определение типа файла по сигнатуре
Всем привет! Подскажите как определить тип файла по сигнатуре? Есть массив байт, который я сохраняю в файл. Нужно определить тип и присвоить расширение этому файлу.
Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
задан 2 сен 2013 в 7:00
511 2 2 золотых знака 9 9 серебряных знаков 31 31 бронзовый знак
первая ссылка в гугле: garykessler.net/library/file_sigs.html
2 сен 2013 в 7:15
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Можно определить какие-то конкретные типы файлов, но никак не все т.к. нет единого формата контейнеров файлов.
Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
ответ дан 2 сен 2013 в 7:04
Антон Шаманов Антон Шаманов
454 2 2 серебряных знака 10 10 бронзовых знаков
gcmsite.ru/?pg=art&id=delphi-file-type вот функция на делфях нужно что то типа этого??
2 сен 2013 в 7:15
- c#
- файлы
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
определение сигнатуры файла
Нужно индифицировть xls, doc, rar, arj и zip форматы.
Подскажите как в Delphi правильно определить сигнатуру файла. Я так понимаю что надо считать несколько первых байт, а потом их сравнивать с извесными (для exe — MZ).
П.С: разширения у файлов разные, нужно именно правильно пределить тип.
6 ответов
31 августа 2007 года
31 / / 12.03.2007
Для arj первые 4 байта — $60 $EA $28 $00
для zip первые 4 байта — $50 $4B $03 $04
А вот с xls и doc труднее, потому что они используют стандартное хранилище IStorage, и сигнатуры у них абсолютно одинаковы.
01 сентября 2007 года
1.6K / / 18.09.2005
ну, а Rar всем известно: $52 $61 $72 $21 (Rar!).
03 сентября 2007 года
3 / / 30.08.2007
с архиваторами я разобрался, осталось основная задача, различить ворд или ексель.
03 сентября 2007 года
118 / / 08.08.2007
В конце xls-файла есть строка «W o r k b o o k», а в doc-файле «W o r d D o c u m e n t». Вроде бы так. Открой файл, например, блокнотом, и посмотри.
04 сентября 2007 года
3 / / 30.08.2007
«W o r k b o o k», а в doc-файле «W o r d D o c u m e n t». это не самый интересный путь . вот к примеру: есть текстовый файл в котором будет написано «W o r k b o o k» «Excel» . и что должна думать програма в этом случае ? а то что обычный тхт это ексель файл.
04 сентября 2007 года
1.0K / / 25.11.2004
Честно говоря, не совсем понимаю, к чему такой изврат, но можно определять по первым байтам файла (‘РП’) + ‘W o r k b o o k’.
К тому же, следуя твоей логике, можно создать текстовый файл, начинающийся с ‘Rar!’ и программа подумает, что это rar архив.
Расширения для того и были придуманы, чтобы определять тип файла, а уж правильный он имеет формат или нет — определяет программа, которая с ним работет.
Все это — мое сугубое ИМХО.
Определение формата файла
На данной странице можно определить формат файла по имени (расширению), а также по данным файла. Второй метод поможет, если файл был переименован и расширение файла не соответствует его формату. Также будет определен тип данных (двоичные, текстовые), которые содержатся в файле. Двоичные файлы можно открыть только в специальной программе, текстовые — в любом текстовом редакторе.
Обратите внимание, что файл не загружается на наш сервер, нам передаются только первые 25 байт, поэтому размер файла не имеет значения.
Для определения формата выберите файл или перетащите его сюда и дождитесь загрузки страницы
Выберите файл
Программы
- Проигрыватели аудио/видео
- Редакторы изображений
- Текстовые редакторы
- Web-браузеры
- Архиваторы
- Работа с дисками
- Офисные программы/пакеты
Файлы
- Аудио-файлы
- Видео-файлы
- Рисунки, изображения
- Растровые изображения
- Векторные изображения
- 3D-модели, изображения
- CAD-файлы
- Текст, документы
- Электронные таблицы
- Электронные книги
- Архивы, сжатые файлы
- Исполняемые файлы
- Интернет, web файлы
- Файлы игр
- Образы дисков
- Системные файлы
- Файлы шрифтов
- Зашифрованные файлы
- Размеченные документы
- Файлы резервных копий
- Файлы данных
- Файлы баз данных
- Скрипты, исходный код
- Подключаемые модули
- Файлы настроек
- Географические файлы
- Другие файлы
© Open-file.ru, 2008-2024
§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-редакторе, то конец будет другим. Сравнить файлы можно прямо там же: выберем Tools → Compare 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 .
Выводы
- Операционная система решает, какой программой открывать файл, по расширению файла.
- Программы смотрят на структуру файла и ищут там необходимые данные.
- Некоторые форматы файлов можно склеивать в один, и при открытии разными программами будут показываться разные данные. Таким образом можно скрывать факт наличия дополнительной информации в файле.
- Склеивать файлы можно с помощью cat, а обнаруживать склейки — HEX-редактором и утилитой binwalk.