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

Обновлено: 06.07.2024

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

Прочитавшие ранее опубликованную статью «Как Windows удаляет файлы и почему их можно восстановить» справедливо зададутся вопросом, как именно функционируют данные программы при повреждении или отсутствии файловой системы. В самом деле, классические инструменты по восстановлению данных работают с информацией о файлах, полученной из файловой системы. Соответственно, если записи о файле в файловой системе не обнаружено, классические инструменты (такие, как команда «undelete» из ранних версий операционных систем) не смогут даже обнаружить удалённую информацию.

Сигнатурный поиск

Поиск по сигнатурам позволяет восстановить файлы после форматирования диска или удаления логических разделов. Для технологии существует множество коммерческих названий. «Power Search», «Content-Aware Analysis», «Smart Scan» – все эти технологии от разных производителей работают по одному и тому же принципу.

Как работает поиск по сигнатурам

Определение файлов

Основной принцип работы алгоритмов сигнатурного поиска такой же, как у самых первых антивирусов. Как антивирус сканирует файл в поисках участков данных, совпадающих с известными фрагментами кода вирусов, так и алгоритмы сигнатурного поиска, использующиеся в программах для восстановления данных, считывают информацию с поверхности диска в надежде встретить знакомые участки данных. Заголовки многих типов файлов содержат характерные последовательности символов. К примеру, файлы в формате *.jpg содержат последовательность символов «JFIF», *.bmp изображения начинаются с «BM», архивы *.zip начинаются с символов «PK», *.dbf базы данных содержат сигнатуру «OPLDatab», а документы PDF начинаются с символов «%PDF-».

Некоторые файлы (к примеру, текстовые и HTML файлы) не обладают характерными сигнатурами, но могут быть определены по косвенным признакам, т.к. содержат только символы из таблицы ASCII.

Определение размера файла

Для восстановления файла мало найти его начало, нужно также определить его конец. Конец файла можно найти, зная размер и адрес начала файла. Размер файла определяется либо анализом заголовка (*.zip, *.jpg, *.avi, *.psd, *.pst, *.rar, *.tiff и т.п.), либо считыванием и анализом секторов диска, идущих сразу за заголовком. К примеру, концом текстового или HTML файла алгоритм будет считать первый же сектор, который будет содержать символы, не входящие в таблицу ASCII.

Ограничения

Сигнатурный поиск – не панацея. Перезапись содержимого файла и фрагментирование дисков (особенно – файлов большого размера) оказывают негативное влияние на возможность восстановления информации.

Гибридные алгоритмы

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

Начальство поставило мне довольно интересную задачу. В сжатые сроки написать анализатор исполняемых файлов, который по сигнатурам умел бы находить тела вирусов и определять используемый упаковщик/криптор. Готовый прототип появился уже через пару часов.

Слово автора

Сразу хочу сказать, что это статья не про суровый реверсинг. И даже не про анализ малвари. Скорее я хотел бы поделиться опытом, как огромное количество открытых разработок позволяет быстро, буквально на коленке собрать прототипы систем, которые на начальных этапах вполне смогут справляться с поставленной задачей. Такого прототипа вполне может быть достаточно, чтобы оценить состоятельность разработки и понять, нужно ли двигаться в этом направлении вообще. Разработать прототип сигнатурного анализатора, который бы работал онлайн и мог быть дополнен новыми сигнатурами через веб-интерфейс, и стало моей задачей.
Сначала предлагалось найти какие-то открытые базы сигнатур малвари, что оказалось довольно просто. Но обо всем по порядку.

Сигнатурный анализ

Поиск вредоносного объекта по сигнатурам — это то, что умеет любой антивирус. В общем случае сигнатура — это формализованное описание некоторых признаков, по которым можно определить, что сканируемый файл — это вирус и вирус вполне определенный.

Тут есть различные методики. Как вариант — использовать сигнатуру, составленную из N байт вредоносного объекта. При этом можно сделать не тупое сравнение, а сравнение по некоторой маске (типа искать байты EB ?? ?? CD 13). Или задавать дополнительные условия вроде «такие-то байты должны находиться у точки входа в программу» и так далее. Сигнатура именно малвари — это частность.

Что такое YARA?

Я был с самого начала убежден, что где-то в Сети уже есть открытые разработки, которая бы взяли на себя задачу определения соответствия между некоторой сигнатурой и исследуемым файлом. Если бы я смог найти такой проект, то его легко можно было бы поставить на рельсы веб-приложения, добавить туда разных сигнатур и получить то, что от меня требовалось. План стал казаться еще более реальным, когда я прочитал описание проекта YARA.

Сами разработчики позиционируют его как инструмент для помощи исследователям малвари в идентификации и классификации вредоносных семплов. Исследователь может создать описания для разного типа зловредов, используя текстовые или бинарные паттерны, в которых описываются формализованные признаки малвари. Таким образом получаются сигнатуры. По сути, каждое описание состоит из набора строк и некоторого логического выражения, на основе которого определяется логика срабатывания анализатора.

Если для исследуемого файла выполняются условия одного из правил, он определяется соответствующим образом (к примеру, червь такой-то). Простой пример правила, чтобы понимать, о чем идет речь:

rule silent_banker : banker
meta:
description = "This is just an example"
thread_level = 3
in_the_wild = true
strings:
$a =
$b =
$c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
condition:
$a or $b or $c
>

В этом правиле мы говорим YARA, что любой файл, который содержит хотя бы одну из строк-семплов, описанных в переменных $a, $b, $c, должен классифицироваться как троян silent_banker. И это очень простое правило. На деле рулесы могут быть гораздо сложнее (мы об этом поговорим ниже).
Об авторитете проекта YARA говорит уже даже список проектов, которые его используют, а это:

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

Немного покопавшись, я довольно быстро разобрался, как писать для YARA правила, а также как прикрутить к нему сигнатуры вирусов от бесплатного авера и упаковщиков от PEiD. Но начнем мы с установки.

Установка

Как я уже сказал, проект написан на Python’е, поэтому легко может быть установлен и на Linux, и на Windows, и на Mac. На первых порах можно просто взять бинарник. Если вызвать приложение в консоли, то получим правила для запуска.

$ yara
usage: yara [OPTION]. [RULEFILE]. FILE | PID

То есть формат вызова программы следующий: сначала идет имя программы, затем список опций, после чего указывается файл с правилами, а в самом конце — имя исследуемого файла (или каталога, содержащего файлы), либо идентификатор процесса. Сейчас бы по-хорошему объяснить, как эти самые правила составляются, но не хочу сразу грузить тебя сухой теорией. Поэтому мы поступим по-другому и позаимствуем чужие сигнатуры, чтобы YARA мог выполнять одну из поставленных нами задач — полноценное определение вирусов по сигнатурам.

Свой антивирус

Первый содержит основную базу сигнатур, второй — самую полную на данный момент базу с различными дополнениями. Для поставленной цели вполне хватит daily.cvd, в котором собрано более 100 000 слепков малвари. Однако база ClamAV — это не база YARA, так что нам необходимо преобразовать ее в нужный формат. Но как? Ведь мы пока ничего не знаем ни о формате ClamAV, ни о формате Yara. Об этой проблеме уже позаботились до нас, подготовив небольшой скриптик, конвертирующий базу вирусных сигнатур ClamAV в набор правил YARA. Сценарий называется clamav_to_ yara.py и написан Мэтью Ричардом (bit.ly/ij5HVs). Скачиваем скрипт и конвертируем базы:

$ python clamav_to_yara.py -f daily.cvd -o clamav.yara

В результате в файле clamav.yara мы получим сигнатурную базу, которая сразу будет готова к использованию. Попробуем теперь комбинацию YARA и базы от ClamAV в действии. Сканирование папки с использованием сигнатуры выполняется одной единственной командой:

$ yara -r clamav.yara /pentest/msf3/data

Опция -r указывает, что сканирование необходимо проводить рекурсивно по всем подпапкам текущей папки. Если в папке /pentest/msf3/data были какие-то тела вирусов (по крайней мере тех, что есть в базе ClamAV), то YARA немедленно об этом сообщит. В принципе, это уже готовый сигнатурный сканер. Для большего удобства я написал простой скрипт, который проверял обновления базы у ClamAV, закачивал новые сигнатуры и преобразовывал их в формат YARA. Но это уже детали. Одна часть задачи выполнена, теперь можно приступать к составлению правил для определения упаковщиков/крипторов. Но для этого пришлось немного с ними разобраться.

Игра по правилам

Итак, правило — это основной механизм программы, позволяющий отнести заданный файл к какой-либо категории. Правила описываются в отдельном файле (или файлах) и по своему виду очень напоминают конструкцию struct<> из языка С/С++.

rule BadBoy
strings:
$a = "win.exe"
$b = "http://foo.com/badfi le1.exe"
$c = "http://bar.com/badfi le2.exe"
condition:
$a and ($b or $c)
>

В принципе, ничего сложного в написании правил нет. В рамках этой статьи я коснулся лишь основных моментов, а детали ты найдешь в мануле. Пока же десять самых важных пунктов:

1. Каждое правило начинается с ключевого слова rule, после которого идет идентификатор правила. Идентификаторы могут иметь такие же имена, как и переменные в C/С++, то есть состоять из букв и цифр, причем первый символ не может быть цифрой. Максимальная длина имени идентификатора — 128 символов.

2. Обычно правила состоят из двух секций: секция определений (strings) и секция условия (condition). В секции strings задаются данные, на основе которых в секции condition будет приниматься решение, удовлетворяет ли заданный файл определенным условиям.

3.Каждая строка в разделе strings имеет свой идентификатор, который начинается со знака $ — в общем, как объявление переменной в php. YARA поддерживает обычные строки, заключенные в двойные кавычки (« ») и шестнадцатеричные строки, заключенные в фигурные скобки (<>), а также регулярные выражения:

$my_text_string = "text here"
$my_hex_string =

4.В секции condition содержится вся логика правила. Эта секция должна содержать логическое выражение, определяющее, в каком случае файл или процесс удовлетворяет правилу. Обычно в этой секции идет обращение к ранее объявленным строкам. А идентификатор строки рассматривается в качестве логической переменной, которая возвращает true, если строка была найдена в файле или памяти процесса, и false в противном случае. Вышеуказанное правило определяет, что файлы и процессы, содержащие строку win.exe и один из двух URL, должны быть отнесены к категории BadBoy (по имени правила).

5. Шестнадцатеричные строки позволяют использовать три конструкции, которые делают их более гибкими: подстановки (wildcards), диапазоны (jumps) и альтернативный выбор (alternatives). Подстановки — это места в строке, которые неизвестны, и на их месте может быть любое значение. Обозначаются они символом «?»:

Такой подход очень удобен при задании строк, длина которых известна, а содержимое может меняться. Если же часть строки может быть разной длины, удобно использовать диапазоны:

Данная запись означает, что в средине строки может быть от 4 до 6 различных байт. Можно реализовать также и альтернативный выбор:

Это означает, что на месте третьего байта может быть 62 В4 или 56, такой записи соответствуют строки F42362B445 или F4235645.

6. Чтобы проверить, что заданная строка находится по определенному смещению в файле или адресном пространстве процесса, используется оператор at:

$a at 100 and $b at 200

Если строка может находиться внутри определенного диапазона адресов, используется оператор in:

$a in (0..100) and $b in (100..fi lesize)

Иногда возникают ситуации, когда необходимо указать, что файл должен содержать определенное число из заданного набора. Делается это с помощью оператора of:

rule OfExample1
strings:
$foo1 = "dummy1"
$foo2 = "dummy2"
$foo3 = "dummy3"
condition:
2 of ($foo1,$foo2,$foo3)
>

Приведенное правило требует, чтобы файл содержал любые две строки из множества ($foo1,$foo2,$foo3). Вместо указания конкретного числа строк в файле можно использовать переменные any (хотя бы одна строка из заданного множества) и all (все строки из заданного множества).

7. Ну и последняя интересная возможность, которую надо рассмотреть — применение одного условия ко многим строкам. Эта возможность очень похожа на оператор of, только более мощная — это оператор for..of:

for expression of string_set : ( boolean_expression )

Данную запись надо читать так: из строк, заданных в string_ set, по крайней мере expression штук должно удовлетворять условию boolean_expression. Или, другими словами: выражение boolean_expression вычисляется для каждой строки из string_set, и expression из них должны возвратить значение True. Далее мы рассмотрим эту конструкцию на конкретном примере.

Делаем PEiD

Итак, когда с правилами все стало более менее ясно, можно приступать к реализации в нашем проекте детектора упаковщиков и крипторов. В качестве исходного материала на первых порах я позаимствовал сигнатуры известных упаковщиков у все того же PEiD. В папке plugins находится файл userdb.txt, который и содержит то, что нам нужно. В моей базе оказалось 1850 сигнатур.

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

[Name of the Packer v1.0]
signature = 50 E8 ?? ?? ?? ?? 58 25 ?? F0 FF FF 8B C8 83 C1 60 51 83 C0 40 83 EA 06 52 FF 20 9D C3
ep_only = true

Первая строка задает имя упаковщика, которое будет отображаться в PEiD, для нас же это будет идентификатор правила. Вторая — непосредственно сама сигнатура. Третья — флаг ep_only, указывающий, искать ли данную строку только по адресу точки входа, или же по всему файлу.

Ну что, попробуем создать правило, скажем, для ASPack? Как оказалось, в этом нет ничего сложного. Сначала создадим файл для хранения правил и назовем его, например, packers.yara. Затем ищем в базе PEiD все сигнатуры, в названии которых фигурирует ASPack, и переносим их в правило:

У всех найденных записей флаг ep_only установлен в true, то есть эти строки должны располагаться по адресу точки входа. Поэтому мы пишем следующее условие: «for any of them : ($ at entrypoint)».

Таким образом, наличие хоть одной из заданных строк по адресу точки входа будет означать, что файл упакован ASPack’ом. Обрати также внимание, что в данном правиле все строки заданы просто с помощью знака $, без идентификатора. Это возможно, так как в condition-секции мы не обращаемся к каким-то конкретным из них, а используем весь набор.

Чтобы проверить работоспособность полученной системы, достаточно выполнить в консоли команду:

$ yara -r packers.yara somefi le.exe

Скормив туда пару приложений, упакованных ASPack’ом, я убедился, что все работает!

Готовый прототип

YARA оказался на редкость понятным и прозрачным инструментом. Мне не составило большого труда написать для него вебадминку и наладить работу в качестве веб-сервиса. Немного креатива, и сухие результаты анализатора уже раскрашиваются разными цветами, обозначая степень опасности найденного зловреда. Небольшое обновление базы, и для многих из крипторов доступно краткое описание, а иногда даже и инструкция по распаковке. Прототип создан и работает отменно, а начальство пляшет от восторга!

Поговорим о нескольких понятиях, которые зачастую понимаются ошибочно: какие бывают сигнатуры, что на самом деле такое вирусы и как работает лечение системы антивирусом.

13 октября 2016

Мы много и часто рассказываем о правилах поведения (а может, даже и выживания) в Интернете, да и в цифровом мире в целом. Очень надеемся, что делаем это все не зря, — что люди учатся и потом учат своих близких. Это правда очень важно.

Однако во всех этих рассказах встречается немало специфических терминов, которые кто-то может не знать или понимать неверно. Сегодня мы поговорим о трех самых распространенных заблуждениях, связанных с антивирусами, и попробуем объяснить, почему мы называем определенные вещи так, а не иначе.

Заблуждение первое: сигнатуры — это что-то устаревшее

Так исторически сложилось, что антивирусные базы в разговоре и даже статьях часто называют сигнатурами. В действительности же классические сигнатуры, пожалуй, ни один антивирус не использует уже лет 20.

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

Три заблуждения, связанные с антивирусами: сигнатуры, вирусы и лечение

Например, характерная последовательность байтов может быть такой

Проблема в том, что сегодня с помощью таких классических сигнатур определить вредоносный файл достаточно проблематично — их создатели используют различные техники для того, чтобы запутать следы. Поэтому современные антивирусы используют значительно более продвинутые методы. И хотя в антивирусных базах примитивных записей по-прежнему много (больше половины), но есть еще и очень много умных записей.

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

Заблуждение второе: вирусы — это любые вредоносные программы

Инфекторы в вирусной лаборатории пользуются особым статусом. Во-первых, их чуть сложнее распознать — с виду файл чистый, а на самом деле в нем инфекция. Во-вторых, они требуют особого подхода: почти всегда для них нужна специальная процедура лечения и, как правило, еще и особая процедура детектирования. Поэтому инфекторами занимаются люди, специализирующиеся именно на этом типе угроз.

Три заблуждения, связанные с антивирусами: сигнатуры, вирусы и лечение

Классификация вредоносных программ

Заблуждение третье: антивирус не умеет лечить

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

А в остальных 99% случаев, когда зловред ничего не инфицирует, а просто делает (или собирается делать) свое черное дело, лечение действительно состоит в банальном удалении файла зловреда. Просто потому, что заражения других файлов нет, так что и лечить их не требуется. Уничтожаем файл — и система здорова.

Три заблуждения, связанные с антивирусами: сигнатуры, вирусы и лечение

В большинстве случаев лечение как таковое не требуется, достаточно просто удалить вредоносный файл

Чтобы упростить понимание изложенной в этой статье информации, достаточно представить носитель (жесткий диск, флэшку или любой другой) как книгу с содержанием. То есть, на первых страницах этой книги есть оглавление, которое содержит в себе перечень всех разделов, подразделов и глав книги с указанием страниц, на которых они находятся. Идеология хранения цифровых данных точно такая же, только конкретная реализация зависит от файловой системы: NTFS, exFAT, HFS+, APFS и так далее. Содержание бумажной книги - аналог файловой системы цифрового носителя. Только в первом приближении, конечно. Если открыть любой исправный жесткий диск в проводнике Windows, мы увидим примерно такую картину:

Если развернуть любую из этих папок, то откроется ее содержимое:

Все, что мы видим в проводнике – имена файлов и папок, их размеры, дата создания и изменения, все эти сведения и хранятся в файловой системе, которую мы договорились называть “оглавлением”. Физически файловая система – это область диска, выделенная для хранения этих данных, которые ещё называют “метаданными”, то есть “данными о данных”. Когда мы удаляем файл или папку с жесткого диска, в файловой системе (оглавлении нашей книги) удаляется соответствующая запись (или просто помечается как удаленная), сами же данные при этом остаются на диске, но то место, которое они занимали теперь считается незанятым, а значит, когда мы будем записывать новые файлы, эта область диска может быть ими перезаписана. Именно поэтому после случайного удаления никогда не следует ничего записывать на диск или флэшку, ведь чем больше информации вы запишете на диск после случайного удаления файлов, тем больше вероятность, что старые данные будут перезаписаны новыми, и тогда восстанавливать уже будет нечего.

  • случайное форматирование с последующей записью;
  • физическое повреждение жесткого диска или флэшки, когда область диска с файловой системой не читается;
  • воздействие вирусов, а как же без них!

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

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

Как известно, данные в файлах хранятся в цифровом виде. Для того, чтобы отличить один тип файла от другого и придумана сигнатура, то есть подпись (разумеется, тоже цифровая). Она размещена в начале файла и является идентификатором типа файлов. Это проще показать, чем рассказать. Рассмотрим сигнатуру файла на примере распространенного формата для хранения фотографий jpeg. Если открыть любой файл jpeg в шестнадцатеричном редакторе, то мы увидим одну и ту же последовательность символов в одном и том же месте:

Сигнатура jpeg в шестнадцатеричном редакторе

Последовательность FF D8 FF в начале первого сектора каждого файла - это и есть сигнатура: идентификатор файла, который означает, что это - именно jpeg файл.

Сигнатуры есть не у всех типов файлов: если, например, открыть в шестнадцатеричном редакторе текстовый файл (с расширением txt), то мы обнаружим, что там нет никакой сигнатуры: с самого первого байта начинается текст:

Пример текстового файла без сигнатуры

  • avi (Audio Video Interleave video format): 52 49 46
  • mp3 (MPEG-1 Layer 3 file): FF FB, FF F3, FF F2
  • tiff (Tagged Image File Format): 49 49 2A 00

Как восстанавливают файлы по сигнатурам

Рассмотрим алгоритм восстановления данных на примере все того же формата jpeg - он наиболее удобен для понимания. Для примера смоделируем ситуацию случайного форматирования флэшки. Для начала я заполнил все сектора нашей подопытной флэшки нулями, чтобы гарантировать, что на ней не останется никаких данных от предыдущих файловых систем. Я сделал это “для чистоты эксперимента”, в реальной жизни все несколько сложнее, но об этом позже. Теперь все сектора флэшки содержат только нули, то есть на ней нет совсем никакой информации, включая файловую систему и даже таблица разделов отсутствует. Такая флэшка, если вставить ее в USB разъем компьютера, то операционная система предложит ее отформатировать:

Пример текстового файла без сигнатуры

А если открыть ее в оснастке “Управление дисками”, то мы увидим, что на ней нет файловой системы:

Отображение пустого диска в оснастке Управление дисками

Компьютер воспринимает ее файловую систему как RAW, то есть “сырые данные”, а проще говоря, - их отсутствие в нашем случае. Теперь отформатируем флэшку в файловую систему NTFS и запишем на нее файлы jpeg:

Флешка с фотографиями формата jpeg

Я создал на флэше одну папку с именем “Осень 2020” и записал в нее 129 файлов jpeg в среднем качестве: каждый файл занимает приблизительно 4-5 Мб дискового пространства. Если теперь еще раз отформатировать эту флэшку, то она будет отображаться в проводнике как пустой диск:

Пустая флешка отображается в проводнике так

Мы смоделировали ситуацию случайного форматирования флэшки. Займемся восстановлением данных с нее. Вообще-то алгоритм восстановления данных по сигнатурам – самый простой из существующих, и он реализован в очень многих программах автоматического восстановления данных, в том числе бесплатных, но профессиональные лаборатории, конечно используют соответствующее их статусу оборудование и программное обеспечение. Мы воспользуемся программно-аппаратным комплексом PC3000 UDMA. Разумеется, функция поиска файлов по сигнатурам входит в его арсенал.

После создания задачи восстановления данных в комплексе PC-3000 мы увидим такую картину:

Отформатированная флешка в программе восстановления данных PC-3000

Во время последнего форматирования была создана новая файловая система NTFS, которая содержит служебные файлы, созданные ей самой. Эти файлы не отображаются в проводнике Windows, но они показаны в программе восстановления данных. Однако данных предыдущей файловой системы, конечно не видно. Проведем сканирование нашей флэшки поиском по сигнатурам:

Результат сканирования флешки поиском файлов по сигнатурам

Как видите, найдены все файлы, которые были на флэшке до форматирования: 129 файлов с расширением jpeg. Как программа находит файлы по сигнатурам? Она просто сканирует всю флэшку, начиная с нулевого сектора и ищет в начале каждого сектора соответствующую шестнадцатеричную последовательность. В нашем случае – это сигнатура jpeg файла FF D8 FF . Найдя такую последовательность в начале сектора алгоритм считает, что все, что следует дальше – это jpeg файл. Но нужно еще определить, где он заканчивается. В случае jpeg это не трудно – все jpeg файлы всегда заканчиваются последовательностью FF D9 , в чем легко убедиться, если открыть такой файл в шестнадцатеричном виде и посмотреть на два его последних байта:

Признак окончания файла jpeg в шестнадцатеричном виде

Такую последовательность программа считает окончанием текущего файла. Осталось только сохранить в памяти смещение, по которому находится начало файла и его размер и можно двигаться дальше в поисках следующего. Итак, все файлы найдены и теперь их можно сохранить на диск (разумеется не на тот же, с которого мы восстанавливаем данные). После сохранения, зайдя в папку с восстановленными файлами, мы видим, что восстановление прошло корректно:

Восстановленные файлы скопированы на диск

Но здесь мы обнаружим одну особенность: файлы имеют другие названия, а главное они все сложены в одну папку. Почему? Потому, что информация об именах файлов, каталогах в которых они хранились (и множество других атрибутов файлов), хранится только в файловой системе. А при поиске по сигнатурам эту информацию просто негде взять. Это один из существенных минусов способа чернового восстановления данных, но не единственный. Об остальных позже.

Стоит отметить, что jpeg – это, пожалуй, один из самых простых форматов для восстановления по сигнатурам, именно поэтому я взял его в качестве примера. Алгоритм восстановления файлов других форматов сложнее и имеет в каждом случае свои особенности: например, многие форматы файлов не имеют признака окончания файла. Тогда для определения последнего сектора файла используется либо начало следующего файла, либо размер определяется по метаданным, которые содержатся в самом файле. Более сложные алгоритмы восстановления данных учитывают все эти нюансы, которые у каждого типа файлов свои, их описание выходит за рамки этой статьи.

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

Когда восстановление по сигнатурам не поможет?

  • удаленные файлы были перезаписаны новыми данными;
  • файлы были фрагментированы на диске;
  • данные на диске были зашифрованы;
  • файлы восстановлены корректно, но без информации о структуре папок и именах файлов, эти данные бессмысленны;

Удаленные файлы были перезаписаны новыми данными

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

Файлы были фрагментированы на диске

Что значит “фрагментированы”? Такая ситуация возникает, когда диском или флэшкой активно пользуются (то есть почти всегда): записывают какие-то данные, потом удаляют ненужную или устаревшую информацию, затем снова записывают новые данные и так далее. В этом случае дисковое пространство становиться похоже на лоскутное одеяло: сначала идет часть с данными, потом пробелы, потом снова данные, снова пробелы из свободного пространства и так далее до конца диска. И если на диск нужно записать новый файл достаточно большого объема, то файловая система ищет на диске большую свободную область, и если весь файл туда не помещается, то записывает туда начало файла, затем дописывает оставшуюся часть (или части) в другую область диска. В этом случае один файл может быть разбит на несколько разных фрагментов, а информация о том, где какой фрагмент находится, хранится опять же в файловой системе (помните про оглавление книги), только теперь уже одному файлу соответствует не одна строчка в нашем оглавлении, а несколько, в зависимости от количества фрагментов, на которые он был разбит. И если этих записей больше нет в файловой системе, то никакой поиск не поможет восстановить файл целиком: ведь по сигнатуре мы можем определить только начало файла, а вот где находится его продолжение алгоритм уже не сумеет определить: эта информация хранится только в самой файловой системе и нигде больше ее нет. Поэтому восстановление файлов по сигнатурам не сработает в случае с фрагментированными файлами. Такие фалы либо вообще не будут открываться, либо будут “битыми” (поврежденными). Вот как выглядит такой “битый”, частично восстановленный файл, на примере все того-же jpeg:

Пример частично восстановленного файла jpeg

Найдено только начало изображения, где находится его вторая половина - неизвестно.

Данные на диске были зашифрованы

Здесь тоже все понятно: зашифрованные файлы с точки зрения любой внешней программы восстановления выглядят как бессмысленная “каша”, найти в ней какие-то разумные последовательности, в том числе сигнатуры файлов попросту невозможно. Вообще-то именно в этом и состоит смысл шифрования, - было бы странно если бы было иначе. А это значит, что восстановить зашифрованные данные можно только имея ключ, которым они были зашифрованы. Впрочем, тема шифрования, как и тема восстановления зашифрованных данных слишком обширна и не так однозначна, как может показаться на первый взгляд. Мы обязательно поднимем ее позже. Следите за новостями.

Требуется полноценное восстановление файловой системы

Часто бывает, что для получения доступа к данным недостаточно извлечь сами файлы, требуется еще и восстановление имен файлов и папок, в которых они были разложены. Например, это необходимо, если сами файлы были частью какого-то структурированного набора данных: базы 1С, коллекцией музыкальных сэмплов, и т.п. В этом случае требуется полноценное восстановление файловой системы со всей структурой папок, иначе программа не заработает, а сами данные будут бессмысленны для пользователя.

Резюмируя, можно сказать, что рассмотренный в этой статье метод восстановления данных по сигнатурам хорошо подходит для восстановления фотографий, а также небольших по объему медиа файлов или документов Office, но только тогда, когда они не фрагментированы и информация об их размещении не важна. Во всех остальных случаях метод чернового восстановления не дает качественного результата.

Ну а у меня на сегодня все. Берегите себя и свои данные! Автор: Вадим Шестернин aka WAIK. Лаборатория восстановления данных Advanced Group, Санкт-Петербург 11.09.2020.

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

Прочитавшие ранее опубликованную статью «Как Windows удаляет файлы и почему их можно восстановить» справедливо зададутся вопросом, как именно функционируют данные программы при повреждении или отсутствии файловой системы. В самом деле, классические инструменты по восстановлению данных работают с информацией о файлах, полученной из файловой системы. Соответственно, если записи о файле в файловой системе не обнаружено, классические инструменты (такие, как команда «undelete» из ранних версий операционных систем) не смогут даже обнаружить удалённую информацию.

Сигнатурный поиск

Поиск по сигнатурам позволяет восстановить файлы после форматирования диска или удаления логических разделов. Для технологии существует множество коммерческих названий. «Power Search», «Content-Aware Analysis», «Smart Scan» – все эти технологии от разных производителей работают по одному и тому же принципу.

Как работает поиск по сигнатурам

Определение файлов

Основной принцип работы алгоритмов сигнатурного поиска такой же, как у самых первых антивирусов. Как антивирус сканирует файл в поисках участков данных, совпадающих с известными фрагментами кода вирусов, так и алгоритмы сигнатурного поиска, использующиеся в программах для восстановления данных, считывают информацию с поверхности диска в надежде встретить знакомые участки данных. Заголовки многих типов файлов содержат характерные последовательности символов. К примеру, файлы в формате *.jpg содержат последовательность символов «JFIF», *.bmp изображения начинаются с «BM», архивы *.zip начинаются с символов «PK», *.dbf базы данных содержат сигнатуру «OPLDatab», а документы PDF начинаются с символов «%PDF-».

Некоторые файлы (к примеру, текстовые и HTML файлы) не обладают характерными сигнатурами, но могут быть определены по косвенным признакам, т.к. содержат только символы из таблицы ASCII.

Определение размера файла

Для восстановления файла мало найти его начало, нужно также определить его конец. Конец файла можно найти, зная размер и адрес начала файла. Размер файла определяется либо анализом заголовка (*.zip, *.jpg, *.avi, *.psd, *.pst, *.rar, *.tiff и т.п.), либо считыванием и анализом секторов диска, идущих сразу за заголовком. К примеру, концом текстового или HTML файла алгоритм будет считать первый же сектор, который будет содержать символы, не входящие в таблицу ASCII.

Ограничения

Сигнатурный поиск – не панацея. Перезапись содержимого файла и фрагментирование дисков (особенно – файлов большого размера) оказывают негативное влияние на возможность восстановления информации.

Гибридные алгоритмы

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

Читайте также: