![](https://habrastorage.org/getpro/habr/upload_files/9c5/383/d96/9c5383d969ef225a8efa81ba73bfd5c9.png)
![](https://habrastorage.org/getpro/habr/upload_files/c41/5f9/ce2/c415f9ce2ffc0b3ec18398b19783270c.jpg)
Автор статьи: Александр Колесников
Вирусный аналитик
Одна из самых сложных и интересных задач, с которыми сталкивается реверс инженер — это анализ бинарных файлов. Зачастую это может быть просто уже известный формат, и интерес с точки зрения анализа здесь появляется в тот момент, когда нужно написать свой просмотрщик и/или сделать более наглядной структуру файла. В данной статье попробуем проанализировать несколько бинарных файлов.
Основные понятия для начинающих
Любой кусочек информации в компьютере записан в двоичном формате, поэтому для того чтобы сохранить что-то полезное, нужно информацию преобразовать в этот самый вид. Для понимания что именно скрывается в бинарных файлах критически важно:
не бояться читать большое количество цифр.
понимать зачем и как структурированы цифры внутри файла.
Основной единицей представления данных, которые обычно используют для того чтобы хотя бы приблизительно продемонстрировать информацию в "сыром" виде, являются байты. Выглядеть это может вот так:
![](https://habrastorage.org/getpro/habr/upload_files/1a7/176/f1d/1a7176f1df55e5791a79656a1b686613.png)
Просто так прочитать такую информацию практически невозможно, однако, были придуманы специальные правила, какие именно данные должны находиться на какой позиции в файле. То есть это все еще просто нули и единицы, просто их скомпоновали так, чтобы было проще читать.
Что за правила используют для описания файла? Это спецификации форматов файлов, их можно найти в сети, обычно формат файла разрабатывается для ОС, либо для конкретного программного обеспечения. В обоих случаях ресурсы разработчиков софта должны содержать спецификацию. Попробуем найти спецификацию для формата файлов PE, которые используются для работы приложений в ОС Windows. Вот здесь лежит эта самая спецификация. Обычно это очень массивное писание, где по каждому параметру есть хотя бы общие замечания. Что можно или нужно сохранять, но эти правила не носят обязательный характер, так как сам разработчик программного обеспечения может отдельные параметры в файлах использовать под свои задачи. Поэтому в сети очень часто можно найти исследования обычных форматов файлов, но там будет описываться какая‑то особенность, которую не записали в спецификации.
Стоит так же отметить, что даже сами разработчики для более простого восприятия бинарного формата файла могут представлять его в виде таблицы. Это только общее представление которое позволяет добавить визуальную составляющую или некую абстракцию, чтобы проще было создавать парсеры для разбора таких файлов. Кстати вот здесь можно найти у самих MS схематичное представление PE файла когда он хранится на диске и когда попадает в оперативную память.
![](https://habrastorage.org/getpro/habr/upload_files/21e/9fc/5e0/21e9fc5e033dc89b56481f008203c80b.png)
Давайте попробуем рассмотреть инструменты для быстрого просмотра файлов, которые есть в наличии.
Инструменты для просмотра структуры и данных
Универсальным способом просмотра бинарных файлов является открытие файлов с помощью шестнадцатеричного рекдатора. Одними из наиболее популярных в этой области являются:
010 Hex Editor
Hiew
WinHex Editor
Этими инструментами можно пользоваться в двух случаях. Первый — если для написания своего разборщика нужно понять что именно записано в файле. Второй случай — у некоторых приложений есть функции разметки файла. Попробуем как раз задействовать второй вариант.
Для теста возьмем вот этот файл. Откроем его в Hiew:
![](https://habrastorage.org/getpro/habr/upload_files/4bc/2e1/179/4bc2e1179fffa9a1e2ad30b30be8856a.png)
Это приложение позволяет смотреть сырые данные, но так же содержит дизассемблер, поэтому если мы будем смотреть бинарный файл, в котором есть команды для процессора, то возможно их увидеть. Для этого достаточно нажать кнопку Enter.
В общем‑то процедура рассмотрения файла закончена, но это далеко не все возможности. Hiew так же поддерживает плагины, поэтому можно проводить дополнение функционала. Плагинов на самом деле существует очень много, но для нашей статьи наиболее интересен вот этот. Это плагин, который собрали на основе фреймворка для разбора форматов файлов и сетевых протоколов KaiTai Struct. Что же умеет этот плагин? Посмотрим на файл через него. Делать дополнительных настроек не нужно, достаточно просто скопировать файл hem из репозитория в директорию с hiew и открыть файл. Чтобы убедиться, что все работает как нужно, нажмите кнопку F11. Должен появиться список плагинов, который показан на картинке ниже:
![](https://habrastorage.org/getpro/habr/upload_files/5ea/097/1f9/5ea0971f961687f7b63d4e31d1580319.png)
А теперь просто выбираем плагин и смотрим, что он показывает. Как видно, у плагина есть целый список заготовленных форматов файлов, которые можно изучать с точки зрения структуры файла. Работает это так — KaiTai позволяет написать формат файла, так как это видит разработчик, а затем он самостоятельно подсвечивает отдельные части, которые могут быть подписаны или преобразованы для чтения. Выглядеть это может вот так для исполняемого файла ELF:
![](https://habrastorage.org/getpro/habr/upload_files/6a5/0af/18b/6a50af18b659c5beb641fe82f4064707.png)
Теперь при наведении на определенную зону файла будет показываться её название. Это удобно, когда нужно понять какая часть файлика сейчас может быть считана приложением или просто для того чтобы понимать что записано в файл.
Попробуем на других форматах:
PNG:
![](https://habrastorage.org/getpro/habr/upload_files/cb3/f27/72f/cb3f2772f0aa3a56d2d4b7d6c9f12ea5.png)
PE:
![](https://habrastorage.org/getpro/habr/upload_files/ed3/e81/c25/ed3e81c25275ff3c20ec99ec40b59579.png)
Кстати, нечто подобное можно делать и для Hex 010, но там для описания формата файла можно пользоваться так называемыми шаблонами, они пишутся с помощью языка программирования C. Можно сказать, это просто заголовочный файл, который определяет структуру файла, а Hex 010 заполняет его данными. Выглядит это так:
![](https://habrastorage.org/getpro/habr/upload_files/049/ea8/5c3/049ea85c35bfc1a4776f291fb057a7d5.png)
Таким образом можно наметить структуру для будущего приложения, которое сможет просматривать отдельные характеристики файла или пытаться его прочитать и отобразить. В следующей статье попробуем разобраться с сетевыми протоколами и методами их разбора.
А сейчас приглашаю вас на бесплатный урок, в рамках которого рассмотрим способы, с помощью которых, можно перехватить API функции.