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

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

  • автор:

Методы обнаружения «склеенных» файлов

Многие могли слышать о таких файлах, как rarjpeg’и. Это особый вид файлов, представляющий собой склеенную вплотную jpeg-картинку и rar-архив. Он является прекрасным контейнером для скрытия факта передачи информации. Создать rarjpeg можно с помощью следующих команд:

UNIX: cat image1.jpg archive.rar > image2.jpg
WINDOWS: copy /b image1.jpg+archive.rar image2.jpg

Или же при наличии hex-редактора.

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

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

  1. Метод проверки области после EOF-маркера. Множество популярных форматов файлов имеют так называемый маркер конца файла, который отвечает за отображение нужных данных. Например, программы для просмотра фотографий считывают все байты вплоть до этого маркера, однако, область после него остается игнорируемой. Этот метод идеально подходит для форматов: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Метод проверки размера файла. Структура некоторых форматов (аудио- и видеоконтейнеры) позволяет вычислить реальный размер файла и сравнить его с исходным размером. Форматы: AVI, WAV, MP4, MOV.
  3. Метод проверки CFB-файлов. CFB или Compound File Binary Format — формат документов, разработанный в Microsoft, представляющий собой контейнер с собственной файловой системой. Этот метод основан на обнаружении аномалий в файле.

Есть ли жизнь после конца файла?

Для нахождения ответа на этот вопрос, необходимо углубиться в спецификации формата, который является «родоначальником» склеенных файлов и понять его структуру. Любой JPEG начинается с сигнатуры 0xFF 0xD8.

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

Первые восемь байт PNG-файла занимает следующая сигнатура: 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A. Сигнатура конца, которая заканчивает поток данных: 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82.

Общая сигнатура для всех rar-архивов: 0x52 0x61 0x72 0x21 (Rar!). После неё идет информация о версии архива и прочие сопутствующие данные. Опытным путем было установлено, что архив заканчивается сигнатурой 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46.

Таблица форматов и их сигнатур:

Формат Начальная сигнатура Конечная сигнатура
JPEG 0xFF 0xD8 0xFF 0xD9
PNG 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A 0x49 0x45 0x4E 0x44 0xAE 0x42 0x60 0x82
RAR 0x52 0x61 0x72 0x21 0x0A 0x25 0x25 0x45 0x4F 0x46

Алгоритм проверки на склейку в данных форматах предельно прост:

  1. Найти начальную сигнатуру;
  2. Найти конечную сигнатуру;
  3. Если после конечной сигнатуры нет данных — ваш файл чист и не содержит вложений! В ином случае необходимо искать после конечной сигнатуры другие форматы.

GIF и PDF

Формат Начальная сигнатура Конечная сигнатура
GIF 0x47 0x49 0x46 0x38 0x00 0x3B
PDF 0x25 0x50 0x44 0x46 0x0A 0x25 0x25 0x45 0x4F 0x46

PDF документ может иметь более одного EOF-маркера, например, из-за неправильной генерации документа. Количество конечных сигнатур в GIF-файле равно количеству кадров в нем. Исходя из особенностей этих форматов, можно улучшить алгоритм проверки наличия приклеенных файлов.

  1. Пункт 1 повторяется из предыдущего алгоритма.
  2. Пункт 2 повторяется из предыдущего алгоритма.
  3. При нахождении конечной сигнатуры запомнить её расположение и искать дальше;
  4. Если таким образом дошли до последнего EOF-маркера — файл чист.
  5. Если файл не заканчивается конечной сигнатурой — goto место последней найденной конечной сигнатуры.

Особенность ZIP-архивов заключается в наличие трех различных сигнатур:

Сигнатуры Описание
0x50 0x4B 0x03 0x04 Сигнатура обычного архива
0x50 0x4B 0x05 0x06 Сигнатура пустого архива
0x50 0x4B 0x07 0x08 Сигнатура архива, разделенного на части

Структура архива такова:

Local File Header 1
File Data 1
Data Descriptor 1
Local File Header 2
File Data 2
Data Descriptor 2
.
Local File Header n
File Data n
Data Descriptor n
Archive decryption header
Archive extra data record
Central directory

Больше всего интересна центральная директория, которая содержит метаданные о файлах в архиве. Центральная директория всегда начинается с сигнатуры 0x50 0x4b 0x01 0x02 и заканчивается сигнатурой 0x50 0x4b 0x05 0x06, после которых следует 18 байт метаданных. Что интересно, пустые архивы состоят только из конечной сигнатуры и 18 нулевых байт. После 18 байт следует область комментария к архиву, которая является идеальным контейнером для скрытия файла.

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

Размер имеет значение

Структура AVI-файла следующая: каждый файл начинается с сигнатуры RIFF (0x52 0x49 0x46 0x46). На 8 байте идет уточняющая формат сигнатура AVI (0x41 0x56 0x49 0x20). Блок на смещении 4, состоящий из 4 байт, содержит начальный размер блока данных (порядок байт — little endian). Чтобы узнать номер блока, содержащего следующий размер, необходимо сложить размер заголовка (8 байт) и размер, полученный в блоке 4-8 байт. Таким образом вычисляется полный размер файла. Допускается, что вычисленный размер может быть меньше, чем реальный размер файла. После вычисленного размера файл будет содержать только нулевые байты (необходимо для выравнивания границы в 1 Кб).

Пример вычисления размера:

Смещение Размер Следующее смещение
4 31442 8+31442=31450

Как и AVI, WAV-файл начинается с сигнатуры RIFF, однако, у этого файла сигнатура с 8 байта — WAVE (0x57 0x41 0x56 0x45). Размер файла вычисляется таким же образом, как и AVI. Реальный размер должен полностью совпадать с вычисленным.

MP4 или MPEG-4 – формат медиаконтейнера, используемый для хранения видео- и аудиопотоков, также предусматривает хранение субтитров и изображений.
На смещении 4 байта расположены сигнатуры: тип файла ftyp (66 74 79 70) (QuickTime Container File Type) и подтип файла mmp4 (6D 6D 70 34). Для распознания скрытых файлов, нас интересует возможность вычисления размера файла.

Рассмотрим пример. Размер первого блока находится на нулевом смещении, и он равен 28 (00 00 00 1С, порядок байт Big Endian); он же указывает на смещение, где находится размер второго блока данных. На 28 смещении находим следующий размер блока равный 8 (00 00 00 08). Чтобы найти следующий размер блока, необходимо складывать размеры найденных предыдущих блоков. Таким образом, вычисляется размер файла:

Смещение Значение Следующее смещение
0 28 28+0=28
28 8 28+8=36
36 303739 36+303739=303775
303775 6202 303775+6202=309977

Этот широко используемый формат является также контейнером MPEG-4. MOV использует проприетарный алгоритм сжатия данных, имеет похожую на MP4 структуру и используется в тех же целях — для хранения аудио и видеоданных, а также сопутствующих материалов.
Как и MP4, любой mov-файл имеет на 4 смещении 4-х байтную сигнатуру ftyp, однако, следующая сигнатура имеет значение qt__ (71 74 20 20). Правило вычисления размера файла не изменилось: начиная с начала файла вычисляем размер следующего блока и складываем.

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

Проверяем Compound File Binary Format

Этот формат файла, разработанный в Microsoft, также известен под названием OLE (Object Linking and Embedding) или COM (Component Object Model). Файлы DOC, XLS, PPT принадлежат к группе CFB-форматов.

CFB-файл состоит из 512-байтного заголовка и секторов одинаковой длины, хранящих потоки данных или служебную информацию. Каждый сектор имеет свой собственный неотрицательный номер, исключение составляют специальные номера: «-1» — нумерует свободный сектор, «-2» — нумерует сектор, замыкающий цепочку. Все цепочки секторов определены в FAT-таблице.

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

Аномальный размер файла

Как было сказано выше, любой CFB-файл состоит из заголовка и секторов равной длины. Чтобы узнать размер сектора, необходимо считать двухбайтное число на 30 смещении от начала файла и возвести 2 в степень этого числа. Данное число должно быть равно или 9 (0x0009), или 12 (0x000C), соответственно, размер сектора файла равен 512 или 4096 байт. После нахождения сектора необходимо проверить следующее равенство:

(FileSize — 512) mod SectorSize = 0

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

Неизвестный тип сектора

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

FileSize = 512 + CountReal * SectorSize, где FileSize — размер файла, SectorSize — размер сектора, CountReal — количество секторов.

Определим также следующие переменные:

  1. CountFat – количество секторов FAT. Находится на 44 смещении от начала файла (4 байта);
  2. CountMiniFAT – количество секторов MiniFAT. Находится на 64 смещении от начала файла (4 байта);
  3. CountDIFAT – количество секторов DIFAT. Находится на 72 смещении от начала файла (4 байта);
  4. CountDE – количество секторов Directory Entry. Для нахождения этой переменной необходимо найти первый сектор DE, который находится на 48 смещении. Затем необходимо получить полное представление DE из FAT и посчитать число DE-секторов;
  5. CountStreams – количество секторов с датастримами;
  6. CountFree – количество свободных секторов;
  7. CountClassified – количество секторов с определенным типом;

Очевидно, что при неравенстве CountClassified и CountReal можно сделать вывод о возможной склейке файлов.

Лекция 7. Форматы данных стандартных типов

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

Например, подавляющее большинство программ-архиваторов помимо своего формата архива поддерживают открытый формат ZIP. Описание его доступно в интернете, а компания-разработчик стандарта PKWARE открыла исходный код (текст программ) для работы с архивами этого формата, его тоже можно свободно скачивать в Интернете (InfoZip.org). Этот же формат используется для сжатия интернет-трафика. Большинство браузеров позволяют работать со сжатыми в таком формате данными и при соединении с сервером сообщают ему о этой своей готовности.

Один из алгоритмов метода сжатия (LZW) использует и стандарт файлов PDF.

Рис. 1. Пример данных PDF файла (Portable Document Format)

/Filter [/ASCII85Decode /LZWDecode ]

На (Рис. ) показан пример такого файла. В нем в текстовом формате описываются разные объекты документа. К некоторым из них для сжатия могут применяться фильтры. Например, для чтения объекта 1 нужно применить фильтры ASCII85 и LZW. Сами двоичные данные объекта идут между строками stream и endstream.

Сам PDF с 1 июля 2008 года является открытым стандартом ISO 32000 и его тоже умеют понимать многие программы.

1. Определение типов данных

Во многих случаях тип данных, представленный в файле может быть определен из имени файла (в Windows – из расширения). В силу того, что на имя файла и расширение требований нет, их может быть бесконечно много. Некоторые типичные наименования для различных программ можно посмотреть в справочниках. Часть данных одного из них представлена в таблице.

Таблица 1. Пример описания расширений файлов (до буквы «c»)

Временный файл редактора

Упакованный файл Microsoft

Тома архива Rar вплоть до 999

Файл базы данных 1С:Предприятия 8 (файловая версия)

Usually README.1ST text file

Windows virtual device driver

3D Studio Graphics format

3D Studio

3rd generation mobile video

Musical file

Архив 7zip

Многотомный ARJ архив

MS Office

ARCPKARC/PKXARCPKPASPKUNPAKQUARK

ARJARJZ

Файл резервной копии

Файл команд DOS

OS/2 или Win графический формат (BitMap Picture)

QPegCorelDrawPC Paintbrush — и многие другие

Архив bzip2

Исходный текст программы на языке C

Watcom C/C++ и многие другие

Unix file archive

Сжатый файл Win 95

Исходный текст программы на языке C со вставками на ASM

Turbo C

CDAudio

Рисунок в векторном формате

dBASEWaffle

OS/2 batch/REXX file, Win cmd

Win, OS/2

C++ language source

Crack file (usually text)

Data file

Comma Separated Values text file format (ASCII)

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

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

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

Например, любой откомпилированный класс языка Java начинается с «магического числа» 0xCAFEBABE. Сомнительно, чтобы это число было как-то связано с английским Cafe Babe.

Name already in use

course-2021-info / 2. Стеганография / README.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

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

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

Как решать таск по стеганографии

Дан файл, содержащий набор байт. Известно, что в этом файле закодирован флаг.

Формат данных контейнера

Сначала необходимо понять, в каком контейнере закодирована информация. Иными словами: данные какого формата содержит файл. Для определения формата данных можно использовать сигнатуру (magic header). Сигнатура — набор байт в начале файла, который содержат любые данные этого формата. Например, вот лого хакердома в формате PNG:

Если скачать картинку и открыть ее в любом hex-редакторе, то можно увидеть следующее:

Файл начинается с байтов 89 50 4E 47 0D 0A 1A 0A , что соответствует формату PNG:

В ОС Linux для определения формата существует утилита file. Она также использует сигнатуры для определения формата данных файла. В ОС Windows можно найти аналогичные программы.

Не у всех форматов есть своя сигнатура, в этом случае стоит поискать формат по определенных паттернам в структуре:

  • повторяющиеся байты
  • блоки определенного размера, дополненные нулевыми байтами в конце
  • участки с монотонным возрастанием/убыванием значений байтов

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

Методы кодирования информации в контейнере

Метод больших файлов

Сообщение может быть скрыто в файле большого размера. Файл при этом может содержать как те байты, что можно декодировать в текст, так и те байты, которые нельзя. Для того чтобы посмотреть текстовые строки, которые могут содержаться в таком файле, можно использовать утилиту strings. Пример использование утилиты на файле JAR:

В выводе утилиты можно видеть как «мусор», так и осмысленные строки, например Main.classPK , название одного из классов Java в этой программе.

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

Метод сокрытия в метаданных

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

Проанализировав изображение утилитой exiftool, можно увидеть:

В EXIF заголовке comment спрятан флаг.

Метод отличий байтов

Кодировать информацию можно отличиями между данными. Например:

  • отличие выданного в таске изображения от оригинала
  • отличие звуковых дорожек одного файла
  • отличие кадров видео

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

Одним из простых способов найти отличия между наборами байт является побитовый XOR. При XOR-е биты с одинаковыми значениями будут давать 0, с разными — 1. Таким образом можно понять, что получается, если из одной последовательности байт «вычесть» другую.

Для анализа изображений можно использовать утилиту stegsolve. Она имеет необходимый режим XOR для поиска отличий. Пусть у нас есть два изображения:

Откроем изображения в stegsolve в режиме XOR (Analyze -> Image Combiner):

Метод наименее значимого бита (LSB)

Рассмотрим метод наименее значащего бита на примере с изображениями. В наиболее распространенном способе кодирования, описанном в модели RGB, каждый пиксель представляется тремя байтами — количеством красного цвета (Red), зеленого цвета (Green) и голубого (Blue). Поскольку каждый байт принимает значения от 0 до 255, всего можно закодировать более 16 млн цветов, в то время как человеческий глаз различает не более 10 млн. Поэтому, если незначительно менять значение байтов, представляющих пиксели, обычный человек не заметит разницы. Один из вариантов реализации такой стеганографии: запись информации по битам в младшие биты каждого байта каждого пикселя по порядку. Такая техника называется Least Significant Bit (LSB) — наименее значащий, то есть самый младший, бит.

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

Метод LSB можно применять не только для изображений, но и для других контейнеров.

Когда ОС определяет тип файла для отображения пользователю, она смотрит или на расширение (Windows) или на заголовки в начале файла (утилита file, Linux). Первый случай не такой интересный, так как если вы переименуете файл, сменив его расширение, то получите файл, который будет выглядеть как что-то нечитаемое и не соответствующее своему формату. Иными словами, будет сразу видно, что с файлом что-то не так.

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

Такие таски можно пробовать решить утилитой binwalk. Рассмотрим изображение:

Если скачать его и передать в качестве аргумента binwalk, то увидим следующее:

Видно, что кроме изображения в файле есть и исполняемый файл elf64. Распакуем файлы, добавим файлу 11958 право исполнения (значит, что теперь файл можно запустить), запустим:

Исполняемый файл выводит флаг.

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

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

Скачаем, откроем изображение в утилите TweakPNG, изменим размер:

Сохраним изображение, получим:

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

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

Статья Правила Yara. Учимся опознавать вредоносное ПО

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

План работы
Итак, прежде всего давай по этапам разберем план действий. Без каких-либо знаний в работе файла и его инициализации идти в бой нельзя, поэтому первым делом я расскажу тебе по каким параметрам известные антивирусы детектят малварь. Далее нас ждет увлекательное путешествие по работе с условным языком Yara. Я расскажу о его синтаксисе, особенностях установки и других мелких деталях. Ну а после этого мы попробуем создать собственное правило для одного типа вирусов из моей коллекции. С объяснениями я закончил, поэтому приступаем к работе.

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

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

Антивирус, который основывается на таком понятии принято называть сигнатурным. В основном они ищут определенную последовательность байт в файле и после сравнивают ее со своей базой. Но если вирус был подвержен обфускации или криптованию, то программа будет искать похожую сигнатуру с определенной погрешностью в байтах. Допустим любой PE-файл будет иметь такой порядок байт в начале: 4d 5a 90 00 03 00 00 00 04 00 00 00 . Именно по нему можно сказать, что это исполняемый файл, даже если мы поменяем расширение на jpg или даже wav. Давай проведем небольшое исследования. Возьми два абсолютно любых исполняемых файла и по отдельности закинь их в HEX редактор. Первые двенадцать байт будут всегда одинаковыми. Для такого опыта я взял два проекта со своего Github и закинул их в HxD. Результат работы ты видишь ниже, а ссылки на репозитории для тестов я оставлю здесь (infocat/synscan):

infocat.jpg

synscan.jpg

Начала файла абсолютно одинаковое и поэтому в HEX редакторе мы можем точно сказать, что они имеют EXE расширение. Теперь давай поговорим о PE-файлах и его составляющих.

pefile.jpg

По такой крайне понятной таблицы я коротко опишу как работает исполняемый файл. Загрузчик первым делом выгружает всю информацию на устройство. После она тут же распаковывается и приводится в действие. Но не всегда так просто, ведь вирьмейкеры используют все более и более изощренные методы сокрытия информации от системы. По мимо этого файл имеет таблицу импорта и экспорта. Хотя экспорт встречается не так часто, но все же про него не стоит забывать. По ней можно определить какие модули импортирует файл. Одна из самых известных библиотек, которую используют вирусы это user32.dll.

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

Знай своего врага в лицо
Итак, для начала я расскажу тебе в какой среде мы будем работать. Так как Yara условный язык программирования, то и полноценной IDE для него не найти, поэтому для работы нам потребуется

. После установки создаем новый файл в любом удобном месте с именем malware.yar. Теперь открываем этот файл в VS и делаем наш каталог доверенным окном (при открытии тебе вылезет уведомление с таким требованием). Теперь все готово к работе и мы можем приступать к коду.

Первым делом давай импортируем модуль для работы с PE файлами.

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

Теперь у нас есть основа в которую мы можем поместить все условия для поиска подходящего вируса. В роли испытуемого я взял старого, но интересного кота Memz. Кто не знает его работу. Для начала давай заглянем в свойства файла и посмотрим метаданные. По ним у нас почти пусто, но мы знаем, что наш файл не превышает 14,5 КБ, возьмем это на заметку. Далее прошарим строки при помощи DiE. В результате ты увидишь примерно такую картину.

strings.jpg

Давай выделим сразу, что нам нужно, а что можно выбросить в помойку. Прежде всего это открытие вкладок в гугле. Арсенал любого ратника предполагает такую функцию как составление запросов в браузере, поэтому если мы внесем в правила запрос из Google вероятнее всего антивирус будет идентифицировать не тот файл. Искать нужно что-то особенное и необычное от других вирусов. Дам подсказку, это строка находится на 151 месте и носит название GetDestopWindow. Ее мы точно должны внести в список поскольку вирус напрямую взаимодействует с рабочим столом, меняя его в цветах. Также давай обратим внимания на 156 строчку BitBit. Я думаю мало кто додумается вставлять ее в свое творение. Далее идет работа с токенами и процессами, что крайне не характерно для многих малварей, поэтому давай добавим к нашей работе строчки с 159 до 163. Не стоит забывать про подозрительные библиотеки GDI32.dll, ADVAPI32.dll и PSAPI.DLL.

Теперь нам нужно всю информацию превратить в правила, для этого воспользуемся функцией strings и запишем данные в таком виде:

Чтобы правило работало наиболее эффективно давай добавим к этому коду условие. Входить в него будет всего два параметра. Прежде всего это проверка файла на то, что он является исполняемым и плюсом сканирования секции импорта на наличие библиотек: kernal32.dll, user32.dll, shell32.dll и winmm.dll. В результате этого по мимо наших строк Yara будет обращать внимание на условие. Также если ты не понял, условие fullword отвечает за кодировку отображаемых строк. Если ее поменять, то наш код не будет корректно читаться.

Для реализации всего нашего плана в правило следует добавить следующую часть кода:

Итак, по сути наше правило полностью готово к работе. Но как же его использовать? Для этого стоит посетить репозиторий Github и скачать самый свежий релиз ретранслятора. После этого можем запускать тест при помощи консоли.

Также забыл предупредить о том, что если ты используешь условие, то в нем ты должен указывать, что одна из переменных должна выполнятся (1 of them). Можно также использовать неограниченное число выполнений при помощи any, но это уже на твое усмотрение. Ну а после запуска нашего правила тебе в консоли высветится сам исполняемый файл.

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

Итак, для этого создадим папку examples, переместим туда Memz и также попробуем закинуть какой-нибудь DOCX файл. По мимо этого я добавил Kaspersky Cureit, TDSSKiller и картинку в формате JPEG. Выглядит все примерно так:

examples.jpg

Начнем создавать правила для Cureit. Для этого в нашем файле malware.yar записываем такие строки:

Программа не хранит в себе никаких метаданных, но мы как всегда закрепляем для себя, что объем файла не превышает 264 МБ. Далее поработаем с PEStudio и посмотрим на строки, которые хранятся в файле. Первым делом обращаем внимание на md5 формат. В нашем правиле мы можем записать его в условиях:

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

Теперь попробуем проделать ту же работу, но уже на примере TDSSKiller. Также создаем наше правило, но уже с названием Toolkit_TDSSKiller. Сразу же взглянем на свойства и перейдем на вкладку Подробнее. Здесь тебя ожидает приятный сюрприз, ведь файл имеет метаданные. Теперь мы можем научится вводить их в наше правило.

metadata.jpg

Поэтому обновляем наш файл и записываем в него такие строчки:

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

Теперь требуется создать условие при котором наш файл будет отображаться. Прежде всего нужно помнить про сигнатуру EXE файла и не забывать про выполнения одного или нескольких условий. Также глянем таблицу импорта и запишим все библиотеки (RPCRT4, KERNEL32, ADVAPI32). В результате всех манипуляций у нас получается полноценное правило.

Если ты до сих пор не понимаешь, зачем я добавляю в конце строки fullword, то давай объясню. В Yara имеется несколько параметров поиска строк. Один из них wide, позволяет искать совпадения по кодированию один символ два байта. Еще nocase поможет тебе найти строку в разном регистре. Ну а fullword дает возможность найти целиком строку без каких либо изменений.

Хорошо, с PE-файлами мы разобрались, как опознавать теперь остальные? Будем идти от самого простого. В самом начале я говорил про понятие сигнатуры для разных файлов. Для расширения JPEG и DOCX такой термин тоже применим. Поэтому давай создадим правило и посмотрим как все различается. Начнем с картинки.

Первым делом открываем ее и закидываем в HxD для просмотра. Переведи свой взгляд на первые 2 байта информации. За это мы и будем цепляться. Любой файл в формате JPEG будет иметь такое название. В связи с этим запишем это дело в наше правило.

Не забудь про объем файла на диске, ведь у меня он не превышает 36 КБ, поэтому это спокойно можно записать в условие. Как ни страно у такого рисунка есть также и строки, их мало, но зацепиться за такую находу все же стоит. Поэтому добавим строки к нашему правилу.

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

Далее я попробую создать правила для DOCX файла. Чтобы он не оказался пустой, я записал в нем некоторое количество символов. Приступим к созданию. Первым делом закинем наш файл в HEX редактор и посмотрим на первые 2 байта. Запишем их в обратном порядке для нашего правила. Мой вариант документа весит 645 КБ и поэтому я спокойно перевожу все в байты и записываю в условие. Часть работы будет выглядеть так:

Как ни странно файл имеет строки и мы можем воспользоваться этим. Посмотреть их можно как всегда через DiE. Заходим и ищем уникальные строчки. Я на прицел взял такие команды как: urlTEXT, nullTEXT, MsgeTEXT, altTagTEXT, cellTextTEXT. Хватаем их за основу и копируем в наше правило. Этого нам хватит, чтобы идентифицировать такие файлы. Можем завершать работу и итоговый формат будет выглядить следующим образом:

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

Подводим итоги
В этой статье я показал как работает анализ файла при помощи Yara. Этот инструмент поможет тебе в дальнейшем идентифицировать вредоносное ПО по его особенностям, тем самым предотвращая заражание таким вирусом других систем. Также Yara адаптирована под язык Python и создавать правила можно теперь в нем. Узнать все подробности ты можешь из

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

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