Как посмотреть сигнатуру файла

Обновлено: 07.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.

Ограничения

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

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

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

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

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

Перед работой со специальными типами хранилищ (RAID-массивы / тома c чередованием, зашифрованные хранилища, образы дисков) обратитесь к соответствующим инструкциям (в разделе Открыть том), иначе Полное сканирование даст некорректные результаты поиска по ФС, если запускать его просто на отдельных исходных дисках. В случае с обычным разделом рекомендуется открывать физический диск и сканировать на нем всю область, которую мог занимать раздел (включая возможные старые и новые области), вместо попытки работать с поврежденным логическим диском. При необходимости сканирование может выходить за пределы выбранной области.

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

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

Столбцы % и Соответствия позволяют предварительно оценить качество восстановления данных для найденного варианта тома. Для NTFS, exFAT, HFS рассчитываются процент и количество правильных соответствий между структрами ФС и файлами, найденными по сигнатурам, для остальных ФС рассчитываются соответствия только для структур ФС.

Мин. размер - минимальная оценка объема, занятого файлами тома (учитываются только наилучшие найденные фрагменты ФС).

Колонка Индикаторы показывает отсутствие (или повреждение) ("-") или наличие ("+") соответствующих структур ФС (B/C - бутсектор/копия; для FAT: F - таблица FAT/копия, R - корневая директория).

Raw-поиск файлов по сигнатурам

Сигнатуры файлов используются для поиска потерянных файлов, когда невозможно использовать результаты поиска по ФС (выше). Кроме того, они используются для улучшения и оценки качества результатов NTFS, exFAT, HFS. Если найдены тома файловых систем (выше), то открывать отдельно результаты Raw-поиска обычно не имеет смысла. Результаты Raw доступны внутри директории $Raw в панели файлов после открытия любого тома.

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

Raw: Сигнатуры файлов : выбор типов файлов для поиска, добавление новых сигнатур.

Сигнатуры файлов

Сигнатура файла - фиксированная последовательность байтов в начале файла определённого типа. Например, при открытии любого PDF-файла в шестнадцатеричном редакторе можно увидеть одну и ту же последовательность первых 4 байт:

В этом случае в DMDE можно задать сигнатуру строкой %PDF (или \x25\x50\x44\x46 с использованием шестнадцатеричных кодов). Для указания произвольного байта используется знак вопроса ( ? ). Код \mXY обозначает фиксированную битовую маску предыдущего байта сигнатуры, где XY - шестнадцатеричное значение маски (например, код \x05\m07 указывает, что маской 7 = 00000 111 (bin) фиксированы только три младших бита значения 5 = 00000 101 (bin) ).

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

Добавление новых типов файлов

Помимо уже встроенных типов файлов и соответствующих сигнатур возможно добавление новых типов пользователем (только если данные типы имеют уникальные сигнатуры): Полное сканирование (Параметры) - Raw: Сигнатуры файлов - Добавить .

В несложных случаях можно автоматически определить сигнатуру нового типа на основе файлов-образцов. Для этого следует нажать на кнопку " . " и указать допустимые расширения файлов (через запятую) и место, где расположены исправные файлы требуемого типа. Если восстановление производится с камеры, для получения образцов можно снять на новый носитель различные фото/видео той же камерой в том же формате.

Кнопка Тест позволяет проверить наличие и правильность сигнатуры на конкретном файле.

Опция использовать для расчета ФС включает проверку соответствий между структурами ФС и файлами, наденными по сигнатуре. Кроме того, файлы внутри ФС будут отмечены в Файловой панели как найденные также по сигнатуре (или не найденные).

Могут быть заданы несколько разделённых запятыми Расширений для расчёта FS.
Можно пометить тип как надёжный , если сигнатура содержит по крайней мере 4 различных байта с фиксированным смещением (в ином случае помечать не следует, чтобы из-за ложных срабатываний не были обрезаны другие файлы).
Файл-контейнер может содержать другие типы файлов внутри себя (следует пометить, чтобы файл не был обрезан при обнаружении файлов другого типа).
Сигнатура EOF - необязательная сигнатура конца файла.

Чтобы упростить понимание изложенной в этой статье информации, достаточно представить носитель (жесткий диск, флэшку или любой другой) как книгу с содержанием. То есть, на первых страницах этой книги есть оглавление, которое содержит в себе перечень всех разделов, подразделов и глав книги с указанием страниц, на которых они находятся. Идеология хранения цифровых данных точно такая же, только конкретная реализация зависит от файловой системы: 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.

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

Слово автора

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

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

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

Тут есть различные методики. Как вариант — использовать сигнатуру, составленную из 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 оказался на редкость понятным и прозрачным инструментом. Мне не составило большого труда написать для него вебадминку и наладить работу в качестве веб-сервиса. Немного креатива, и сухие результаты анализатора уже раскрашиваются разными цветами, обозначая степень опасности найденного зловреда. Небольшое обновление базы, и для многих из крипторов доступно краткое описание, а иногда даже и инструкция по распаковке. Прототип создан и работает отменно, а начальство пляшет от восторга!

Этичный хакинг и тестирование на проникновение, информационная безопасность


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

Если вам кажется, что проблема с определением типов файлов без расширений надуманная, то это далеко не так! Во-первых, если подумать, это не такая уж простая задача. А с файлом без расширения вы можете столкнуть, например, при декодировании строки из Base64 кодировки.

Во-вторых, у этой статьи будет продолжение, в которой эти же самые инструменты, которые вы изучите на этой странице, будут использоваться для:

1) разбора прошивок (например, роутеров, IP камер) на составные части (первый этап обратной инженерии либо анализа работы устройств для поиска уязвимостей и бэкдоров)

2) поиска файловых систем на дисках и их образах (первый этап криминалистической IT экспертизы)

3) поиска удалённых файлов

Как определить тип данных, если у файла нет расширения

Если у файла нет расширения, то единственным вариантом определения его типа остаётся содержимое этого файла. Можно попробовать добавлять различные расширения к имени файла и пытаться открыть соответствующими для этого расширения программами — этот вариант медленные и неэффективный.

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

Такие паттерны на английском часто называют magic — это пошло от «magic number» в исполнимых файлах. Эти файлы имеют «магическое число», хранящееся в определённом месте рядом с началом файла, которое сообщает операционной системе UNIX, что файл является двоичным исполняемым файлом и каким именно из нескольких типов. Концепция «магического числа» была применена к другим бинарным файлам. То есть файлы одинакового типа имеют одинаковую последовательность байтов в определённом месте от начала файлов.

Файл с сигнатурами, описывающими какие именно байты, на каком расстоянии от начала файла характерны для файлов того или иного типа, обычно называют magic file.

Кроме магических чисел могут применяться и другие техники, например, программа file для проведения тестов файловых систем также может использовать системный вызов stat. Тип текстовых файлов определяется по содержащимся в них строкам (например, это может быть PHP код, файл в XML или HTML разметке, JSON и так далее).

Команда file — мгновенное определение типа любого файла

В Linux есть команда file с огромной базой сигнатур, которая очень быстро определяет тип файла:

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


То есть это текстовый файл офисного пакета Microsoft Office.

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


У программы file имеются опции, подробности о них смотрите в отдельной статье «Инструкция по использованию команды file».

Аналог команды file для Windows

file — это утилита командной строки для Linux, поэтому пользователям Windows нужна какая-то альтернатива. Рассмотрим несколько способов использования file в Windows.

1. Утилита file в Cygwin

Данный способ, на мой взгляд, самый простой. Достаточно скачать Cygwin и вы можете пользоваться большинством утилит Linux. Подробности, в том числе как указывать пути в файловой системе, смотрите в ветке «Как начать знакомство с командами Linux: Cygwin».


2. file в WSL

Подсистема Windows для Linux (WSL) это ещё один способ использовать утилиты Linux в Windows. Подробности о работе с WSL смотрите в справочном материале «WSL (подсистема Windows для Linux): подсказки, инструкции, решения проблем».

3. Скомпилированный file для Windows

Файлы различаются архитектурой (64- и 32-битные), а также компилятором.

Распакуйте скаченный архив. Например, я поместил скаченные файлы в папку C:\Users\MiAl\Downloads\file\.

Откройте командную строку, для этого нажмите Win+x, выберите «Windows PowerShell».

Перейдите в папку с программой:

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


Вы можете проверить сразу много файлов, для этого перейдите в папку с утилитой file и выполните команду вида:

Например, я хочу проверить все файлы в папке Z:\testfiles\, тогда команда следующая:


4. TrID — кроссплатформенная альтернатива file для Windows и Linux

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


Если указать несколько файлов для идентификации, то будет выведен только самый вероятный вариант типа файла:


Установка TrID в Windows

Распакуйте оба файла в одну папку.

Распакуйте скаченный архив. Например, я поместил скаченные файлы в папку C:\Users\MiAl\Downloads\trid\.

Откройте командную строку, для этого нажмите Win+x, выберите «Windows PowerShell».

Перейдите в папку с программой:

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

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




Кроме того, использование ключа -ae даст команду TrID добавить предполагаемые расширения к именам файлов. Это удобно, например, при работе с файлами, восстановленными программами для восстановления данных. Например:

На этом этапе файлы в папке c:\temp будут выглядеть так:

Вместо предыдущей опции можно использовать -ce, которая изменит расширение файла на новое; если у файла нет расширения, будет добавлено новыъое. Например:

  • IAmASoundFile.dat -> IAmASoundFile.wav
  • IAmABitmap -> IAmABitmap.bmp

TrID может получить список файлов со стандартного ввода с помощью переключателя -@.

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

Можно указать TrID показывать дополнительную информацию о каждом совпадении (например, тип mime, кто создал эту сигнатуру, сколько файлов было просканировано и так далее); а также можно ограничить количество отображаемых результатов.

Ключ -v активирует подробный режим, а -r:nn указывает максимальное количество совпадений, которое будет отображать TrID. По умолчанию 5 для обычного режима, 2 для подробного, 1 для многофайлового анализа.

Программа TrID обновляется нечасто, но база данных регулярно получает новые сигнатуры, поэтому время от времени обновляйте базу данных.

5. fil — ещё одна кроссплатформенная альтернатива file

Программа fil написана на Go и является кроссплатформенной. Но в программе настолько мало сигнатур, что, на мой взгляд, утилита fil практически бесполезна.

Альтернативы file

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

Detect It Easy

Detect It Easy — это кроссплатформенная программа для определения типов файлов. Имеется вариант с графическим интерфейсом, а также интерфейсом командной строки.

Анализ файла /mnt/disk_d/Share/testfiles/file1 с показом результатов в графическом интерфейсе:

Анализ файла без расширения, расположенного по пути /mnt/disk_d/Share/testfiles/file1 для определения типа файла:

Detect It Easy в первую очередь нацелена на анализ исполнимых файлов, поэтому её функции в большей степени относятся к файлам программ, например, определение архитектуры. Но также имеется поддержка других бинарных файлов.

Binwalk

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

Использование такое же, как и file, достаточно указать путь до одного или нескольких файлов:

Detect It Easy и Binwalk не столько конкуренты утилиты file, сколько «последний шанс» определить тип данных, если команда file не помогла.

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