§1.4. Файлы и их форматы
Данные можно скрывать и не в тексте, а в произвольных файлах. Давайте изучим, как устроены различные форматы файлов и содержимое в них, и как можно спрятать в них информацию. Каждый день мы сталкиваемся с множеством разных форматов — текстовые файлы, таблицы, презентации, видеозаписи, картинки, аудиофайлы и другие.
Каким образом операционная система понимает, как открыть тот или иной файл? По расширению: например, dog.jpg
— это изображение, а file.mp4
— это видео. С каждым расширением ассоциированы программы, которые могут открывать соответствующие файлы.
Расширения и форматы
Давайте проведём эксперимент: возьмём картинку. Переименуем её в dog.mp3
и попробуем открыть получившийся файл. Откроется аудиопроигрыватель и сообщит, что файл некорректен. Однако, если открыть этот файл с помощью программы для просмотра изображений, то откроется исходная картинка, несмотря на неверное расширение. Как же программа понимает, что это на самом деле картинка? На самом деле, каждый формат имеет определенную структуру, у разных форматов она различна.
Для изучения структуры файлов нам понадобится специальная программа — HEX-редактор. Она позволяет видеть содержимое файлов в шестнадцатеричном формате, чтобы было удобно читать нетекстовые файлы. Откроем файл в HEX-редакторе.
Как вы видите, в начале есть байты FF D8 FF
— они будут встречаться в начале каждого изображения в формате JPEG. Многие из них содержат ещё и читаемый текст JFIF
в правой части. Такие магические байты называются сигнатурами (англ. signature — подпись) — у каждого файла свои. Достаточно большой список есть на Википедии, и можно поискать сигнатуру неизвестного файла там. Но есть способ и проще: в Linux входит встроенная утилита file, которая умеет определять информацию о файле по сигнатуре.
Давайте попробуем ей воспользоваться. Откройте терминал, перейдите в директорию с нашим файлом и введите file dog.mp3
.
Кроме сигнатуры, у каждого формата есть своя структура — определенными байтами обозначаются начало и конец файла, задаются размеры картинки и так далее. А что произойдет, если мы вмешаемся в структуру файла? Давайте попробуем дописать что-нибудь в конец, и сохранить файл. В wxHexEditor для этого нужно нажать правой кнопкой мыши в конец, выбрать Insert, указать число дописываемых символов, а дальше дописать текст вместо 00
.
Если мы снова откроем картинку просмотрщиком, она покажется без изменений — как ни в чем не бывало. Это связано с тем, что в формате JPEG есть маркер окончания файла — всё после него будет проигнорировано. Таким образом, мы можем дописать любые произвольные данные, и они будут незаметными: человек, не знающий о нашем способе, увидит картинку без изменений. Но как их достать обратно? Можно открыть файл HEX-редактором, и промотать в конец. Но если мы скрываем не текст, то будет трудно найти конец картинки и начало наших данных. Известен такой трюк: существуют форматы, которые разрешают размещать сигнатуру не только в начале файла, а во всём файле. Если сигнатура встретится где-то в середине, то всё, что было раньше, просто отбрасывается. Один из таких форматов — архив RAR.
Давайте рассмотрим в качестве примера другой файл. При открытии файла мы видим тех же самых собак. Если мы откроем файл в HEX-редакторе, то конец будет другим. Сравнить файлы можно прямо там же: выберем Tools → Compare Files и режим Different bytes. Он ищет те байты, которые различаются.
Чтобы увидеть архив, достаточно просто переименовать файл в rarjpeg.rar
и открыть: архив откроется, и мы увидим секретный файл.
Другой способ искать склеенные файлы — воспользоваться утилитой binwalk. Снова откроем терминал и попробуем запустить её на нашей картинке: binwalk rarjpeg.jpg
.
Если запустить утилиту снова с флагом -e
(от англ. extract — извлечь): binwalk -e rarjpeg.jpg
, то рядом с картинкой появится директория, в которой отдельно будет лежать архив.
Как создать такой секретный файл самостоятельно? Возьмём два файла, которые мы хотим склеить. Допустим, image.jpg
и archive.rar
. В Linux встроена утилита cat, которая поможет нам осуществить склейку. Ей нужно передать два файла в качестве аргумента и указать файл для вывода: cat image.jpg archive.rar > result.jpg
.
Выводы
Операционная система решает, какой программой открывать файл, по расширению файла.
Программы смотрят на структуру файла и ищут там необходимые данные.
Некоторые форматы файлов можно склеивать в один, и при открытии разными программами будут показываться разные данные. Таким образом можно скрывать факт наличия дополнительной информации в файле.
Склеивать файлы можно с помощью cat, а обнаруживать склейки — HEX-редактором и утилитой binwalk.