На связи снова Максим Мотиков. Я аналитик киберугроз в «Гарде». В прошлой статье разбирал, как вскрывать Python-малварь, а сегодня хочу зайти с другой стороны и рассказать про так называемый reverse engineering kit, который мне помогает закрывать задачи анализа ВПО, когда часть привычного софта может оказаться недоступной.
IDA Pro, например, стоит около тысячи долларов в год, но если докупать все важные архитектуры сразу, то ценник может перевалить уже за десять тысяч долларов. Каждый декомпилятор продается отдельно, купил поддержку x86 и x64, а за ARM придется доплачивать. Получается как с машиной, которую купил без колес.
К счастью, на IDA Proсвет клином не сошелся. Сегодня есть немало бесплатных инструментов, которые позволяют анализировать ВПО ничуть не хуже, если понимать, в каких задачах каждый из них раскрывается лучше всего.
Но прежде чем говорить о софте, начну с обзора железа — это фундамент любой нормальной «лаборатории» аналитика.
Какое железо нужно
Для реверс-инжиниринга вирусов удобно иметь две виртуальные машины: одну для статического анализа, вторую — для динамического. Зачем вообще нужно две машины? У каждой задачи свой набор инструментов, своя логика настройки сети, и я постараюсь объяснить, почему именно так.
Под задачи статического анализа я держу виртуалку на Windows 10 x64 с такими настройками: от 8 ГБ оперативной памяти, от 120 ГБ диска и сетевым мостом (выходом в интернет). Много места нужно, потому что современная винда и набор утилит сами по себе съедают десятки гигабайт. К примеру, у меня на одной машине из 120 ГБ занято уже более 80%. Причем часть места на диске занимает Visual Studio, которая на секундочку бывает нужна только изредка, чтобы скомпилировать какой-нибудь плагин.
Статический анализ не подразумевает исполнение вредоносного кода, поэтому эта машина работает с открытой сетью. Выход в интернет нужен в первую очередь для работы одного из плагинов IDA (hashDB), у которого база контрольных сумм хранится на удаленном сервере. Без интернета плагин просто не сможет ничего найти. Все остальные инструменты для статического анализа прекрасно работают офлайн.
С динамическим анализом всё наоборот. Безусловно, там тоже виртуалка Windows 10x64, тоже от 8 ГБ оперативки, но памяти уже нужно от 80 ГБ, а вот сеть выключена полностью. Если во время динамического анализа дать вредоносу возможность выхода в сеть, он может начать распространяться, получать от C2 дополнительные команды или выгружать собранные данные. Есть и менее очевидный риск: некоторые вирусы способны определять, что запущены в песочнице или под отладчиком. Малварь сигнализирует об этом на сервер и сразу получает команду затаиться или самоуничтожиться. Поэтому, чтобы не начинать весь анализ заново, динамическую машину отключаю от сети всегда.
Инструменты для статического анализа
Работу с любым новым вредоносом начинаю со статического анализа. Сначала смотрю на структуру файла, анализирую строки, изучаю импорты, ищу криптографические константы и пишу yara-правила. Только потом, если нужно понять поведение образца в динамике, перехожу на вторую виртуалку. Для статики у меня сложился довольно постоянный набор утилит, часть из которых опенсорсная, но есть и платные инструменты. Ниже расскажу про каждый.
IDA Pro
Декомпиляторы и дизассемблеры по большей части решают одни и те же задачи. Выбор инструмента чаще всего зависит от того, на чем сидит команда, а не от объективного превосходства одного софта над другим. С IDA Pro я знаком еще со студенческой скамьи. Когда позже пришел реверсером в компанию, там тоже все использовали IDA, поэтому переучиваться смысла не было.
Кроме платной версии IDA, есть и бесплатная (IDA Free). Для базового анализа ее достаточно. Она умеет дизассемблировать основной функционал и строить граф зависимостей функций. Чего в ней нет, так это декомпилятора и поддержки Python-скриптов для автоматизации, иными словами, плагины там просто не заработают. Но с задачей открыть исполняемый файл и посмотреть исходный код, IDA Free вполне хорошо справляется.
У IDA также есть удобная функция для совместной работы. Поднимается сервер, и несколько человек одновременно смотрят один и тот же код и вносят правки. Для командных проектов это серьезный плюс. Правда, такая опция доступна только в платной версии программы.
Отдельно хочу рассказать про плагины, которые я использую поверх IDA. Все они опенсорсные, и их можно свободно модифицировать. Никто слова не скажет, разве что поблагодарят, если дополнишь функционал и закинешь патч на GitHub.
Плагины для IDA Pro
HashDB. По найденной в коде контрольной сумме плагин ищет совпадение в огромной базе готовых хешей, собранной в интернете по разным алгоритмам и константам. Эта утилита очень полезна в вирусной аналитике, потому что хеши там встречаются постоянно.
HashDB позволяет добавлять кастомные алгоритмы и найденные контрольные суммы с расшифровкой. Минус один — вся база хранится в интернете, и это единственная причина, по которой статическую виртуалку я не могу полностью изолировать от сети.
Yarka. Плагин для автоматической генерации YARA-правил из дизассемблированного кода. Работаю с ним в основном точечно. Так, если в коде нахожу не просто подозрительную строку, а достаточно уникальный алгоритм, выделяю его в IDA, а Yarka превращает этот кусок кода в готовое правило. Под уникальностью в данном случае я понимаю не сложность, а оригинальность алгоритма. Например, один раз мне попался шифровальщик, который передавал по сети данные не известным алгоритмом вроде AES, а самописным ксором с перебором по таблице.
Кроме Yarka, я также пользуюсь утилитой YarGen. В отличие от Yarka, она работает массово. Ей достаточно закинуть на вход папку с образцами вредоносного ПО, а далее она на основе встречающихся в них строк, сама сгенерирует набор YARA-правил. По сути, Yarka нужна, чтобы превратить в правило конкретный найденный алгоритм, а YarGen — чтобы быстро создать черновики сразу для целой пачки семплов.
Find Crypt. Этот плагин работает на YARA-сигнатурах и ищет в коде криптографические константы для определения алгоритма шифрования или хеширования. Тут есть один нюанс: если злоумышленник модифицирует константы, плагин, скорее всего, будет бесполезен. Зато всё, что описано в стандартных ГОСТах и зарубежных спецификациях, Find Crypt увидит без проблем.
К слову, с модифицированной криптографией пока не сталкивался в работе, но считаю, что раз сам плагин опенсорсный и написан на Python, ничто не мешает при желании самим разработать собственные константы и дополнить ими его базу.
ClassInformer. При работе с большим объемом кода классы легко упустить, особенно если они лежат где-то внизу, в дата-секции, и в общем потоке анализа на них просто не обращаешь внимания. Поэтому для выдачи списка всех найденных в дизассемблированном коде классов мне нужен плагин ClassInformer, который выводит классы одним списком. Таким образом по каждому классу видно количество функций, и можно сразу переходить к нужному.
В одном из недавних образцов было очень много виртуальных классов, и, смотря файл вручную, я пропустил одну важную функциональность, спасибо, что ClassInformer вовремя подстраховал. Он вывел все классы из бинарника — стандартные из C++ и пользовательские (см. скрин ниже).

Ghidra как опенсорсная альтернатива IDA
Если приобрести платную версию IDA нет возможности, можно поставить Ghidra. Это опенсорсная разработка Агентства национальной безопасности США (АНБ). Правда, Ghidra больше нацелена на реверс загрузчиков, IoT-устройств, кода микроконтроллеров, тогда как IDA сильна в анализе привычных x86, x64 и ARM-программ.
Честно говоря, я Ghidra почти не пользовался. Внятного рационального объяснения почему так сложилось, у меня нет. Скорее всего, дело в том, что люди не очень любят менять инструменты, с которыми они начинали путь в профессию. Видимо, я слишком долго «сидел» на IDA, чтобы быстро и безболезненно перескочить на другое ПО. Мне интерфейс Ghidra показался неудобным и непонятным, но это, скорее всего, дело привычки.
Если резюмировать и абстрагироваться от личных предпочтений. Мне IDA кажется удобнее для классического реверса исполняемых файлов под x86, x64 и ARM, так как она чаще обновляется. Ghidra полностью бесплатна, удобна для реверса загрузчиков и IoT, но, как по мне, требует больше времени на освоение интерфейса.
Забыл сказать, что у Ghidra тоже есть инструмент для командной работы. Запускается сервер, к нему подключаются разные клиенты, и несколько человек одновременно работают над одним файлом, то есть по функционалу это близко к тому, что предлагает IDA.
Detect It Easy (DiE)
В основном я работаю с PE-файлами и мне часто приходится определять тип бинарника, а также его основные характеристики. Поэтому первое, что я открываю, когда смотрю на новый образец, — это утилита Detect It Easy (DiE). Она сразу показывает базовую информацию. Например, формат файла, размер, а также какие функции он экспортирует и импортирует. Обычно этих данных достаточно для понимания, с чем вообще я имею дело.

На скриншоте выше анализ реального образца. DiE сразу определил тип файла, архитектуру и чем он был скомпилирован.
PEStudio
Это аналог DiE, но с другим фокусом. Если DiE больше про то, в какой среде был скомпилирован файл (она подсвечивает компилятор, линкер и подобные технические детали), то PEStudio смотрит на признаки вредоносности. В частности, флаги, классификацию по базе известных файлов, заголовки. Инструмент оценивает файл с точки зрения его безопасности, а не технического происхождения. Например, на скрине ниже показан разбор файла payload.bin в PEStudio. Видно, что 35 из 72 антивирусов его уже детектируют, а повышенная энтропия указывает на упаковку или шифрование внутри.

PEView
Еще одна бесплатная утилита — PEView. Не могу сказать, что это прямо мастхэв, но иногда эта утилита бывает полезной. По сравнению с IDA у этого инструмента откровенно устаревший интерфейс, поэтому им обращаюсь к ней крайне редко. Например, если нужно быстро посмотреть смещение таблиц импорта и экспорта, тут PEView отлично выручает. На скрине ниже показано, как PEView разбирает заголовок payload.bin по полям. Видны секции и их смещения без запуска IDA.

Strings
Strings входит в пакет Sysinternals (набор утилит, который выпускает Microsoft). Утилита выводит все строки, найденные в бинарнике. Когда это бывает нужно? Например, при разработке YARA-правил, да и просто для первичного просмотра файла. Иногда прямо в строках находится что-то полезное.
У Strings есть конкретное преимущество перед Detect It Easy. Так, если DiE выводит максимум около 10 тыс. строк, то Strings как на духу показывает всё содержимое бинарника. Названия секций, обрывки строк, мусор из заголовка — всё это богатство инструмент собирает в отдельный файл. Это бывает очень удобно для дальнейшего разбора. Пример работы утилиты показал на скрине ниже.

Binwalk
Инструментом пользуюсь, когда анализируемый файл состоит просто из набора байтов, и непонятно вообще, что это такое. Binwalk определяет тип содержимого: загрузчик, PE-файл или, может, ELF под Linux. Дополнительно он умеет показывать энтропию файла. Это позволяет отделить участки, где данные зашифрованы или упакованы, от участков с распаковщиком.
В моей практике задачки для Binwalk попадаются редко. Но возможно, это мне просто не так везло.
CyberChef
С помощью CyberChef можно зашифровать, расшифровать, поксорить, в общем, провести любую операцию с частью данных. Стоит отметить, что CyberChef — это опенсорсный веб-проект, и туда в принципе не стоит загружать что-то закрытое. Но для анализа вредоносного ПО как такового это обычно не проблема. Вирусы и так распространяются открыто, прятать там особо нечего, и в подавляющем большинстве случаев семплы на анализ берутся из открытых источников.
В основном использую CyberChef для перевода из Base64 в человекочитаемый формат. В сетевом трафике почти всё передается именно в Base64, и чтобы понять, что написано в строке, ее нужно сначала декодировать.
Кроме того, если в программе зашит ключ шифрования, а нагрузка зашифрована, скажем, AES, можно вставить в CyberChef алгоритм, ключ и сам шифротекст, и он расшифрует данные. Там реализованы практически все известные алгоритмы шифрования и хеширования. Кастомные, самодельные алгоритмы он, разумеется, не возьмет, но с этим в реальных образцах сталкиваешься редко.
Отдельный плюс CyberChef в том, что он собирает цепочки операций. В частности, расшифровать, затем проксорить, затем сделать что-то еще, и всё это происходит в одном окне без переключения между утилитами.
Hex-редакторы
Иногда в ходе анализа малвари мне приходится спускаться на уровень сырых байтов. Например, чтобы посмотреть структуру файла без интерпретации, вручную проверить контрольную сумму на конкретном участке или убедиться, что значение совпадает с тем, что видно в дизассемблере, я использую hex-редактор.
В этой работе мне помогают два инструмента: платный WinHex и бесплатный HxD. Последний использую, как запасной вариант на случай, если под рукой нет рабочей версии WinHex. Базового функционала HxD мне вполне хватает для просмотра байтов, подсчета контрольной суммы на каком-то отрезке или перевода значения из шестнадцатеричной системы в десятичную. К слову, и в WinHex, и в HxD для таких задач есть специальные расширения.
VS Code
Обычный текстовый редактор с парочкой расширений (подсветка синтаксиса YARA-правил и Python). Это просто удобный редактор для просмотра и редактирования файлов с правилами и скриптами.
YARA-X
Я пишу YARA-правила, поэтому у меня всегда под рукой должен быть инструмент для проверки их работоспособности отдельно до загрузки в IDA. Я пользуюсь YARA-X от VirusTotal. Стоит отметить, что у IDA для проверки правил есть встроенная библиотека, но загружать туда данные ради быстрой проверки одного правила неудобно. А YARA-X — бесплатный инструмент и позволяет за пару минут проверить правило прямо из консоли.
Сapa
Capa анализирует бинарник и показывает, какими возможностями он обладает. Например, какие атакующие MITRE-техники задействованы, как ведет себя файл. С ее помощью я могу увидеть все детали вплоть до конкретных capabilities вроде обращения к PEB, обфускации строк через XOR или проверки на запуск в виртуальной машине.
Ее можно запускать как отдельную утилиту из консоли, а можно через плагин capa-explorer прямо внутри IDA, и тогда результаты будут привязаны к конкретным функциям в дизассемблированном коде.

Например, Capa за секунды показывает, что у вредоносного файла есть защита от запуска в песочнице или на виртуалке (проверка наличия VMware или VirtualBox), или что он шифрует данные через XOR, создает процессы и скрывает свое присутствие на машине жертвы. Те же данные есть и внутри IDA.

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

Скажем, Windows Dependencies показывает, какие DLL использует файл и какие функции из них импортирует.
Динамический анализ
Теперь поговорим про набор утилит для динамического анализа. Еще не всё из виш-листа успел опробовать на реальных образцах. Кроме того, часть инструментов просто держу про запас для специфических задач.
X64dbg
Начать хочется с отладчика пользовательских приложений. Это, пожалуй, мой главный помощник для динамического анализа ВПО. У него огромный функционал. Например, там можно дописывать собственные скрипты, кастомизировать рабочее пространство, в общем, гибкость на голову выше, чем у штатных средств Microsoft.

Выше я продемонстрировал, как ведет себя x64dbg в момент, когда выполнение программы приостановлено. Слева дизассемблированный код, справа регистры, снизу дамп памяти. В комментариях к инструкциям уже видны разыменованные адреса и строки из образца.
WinDbg
Это тоже отладчик, но только с возможностью отладки на уровне ядра. Справедливости ради драйверы, работающие на уровне ядра, в моей практике попадаются нечасто, поэтому и WinDbg я открываю редко.
Но WinDbg бывает полезен, когда в образце есть драйвер: обычный пользовательский отладчик туда не доберется, а WinDbg позволяет работать с кодом, который исполняется в привилегированном режиме. В остальном он менее удобен, чем x64dbg. Интерфейс не самый дружелюбный: это всё-таки штатный продукт Microsoft, но приходится работать с тем, что есть.
Process Monitor
Усиленный диспетчер задач для детального мониторинга действий в винде. Например, он покажет, какие ключи реестра читаются, какие файлы открываются, какие процессы куда обращаются.

Process Monitor пишет всё в реальном времени. На скрине выше видно, как ctfmon.exe опрашивает реестр, и часть запросов возвращает NAME NOT FOUND — это уже потенциальный индикатор.
Process Explorer
Этот инструмент заменил мне устаревший Dependency Walker. Process Explorer показывает дерево процессов, дескрипторы и DLL, которые загружаются по ходу работы вредоносной программы. По сути, утилита запускает исполняемый файл и сразу видит, какие модули он подгружает в процессе работы, какие процессы и потоки создает, сколько памяти они потребляют. Если вредонос что-то добавил, Process Explorer это зафиксирует.
Особенно незаменима утилита, когда файл порождает дочерние процессы в своем пространстве и через них причиняет основной вред. С помощью Process Explorer я как раз могу увидеть всю эту цепочку.

RegShot
Делает два снапшота реестра. Первый — до запуска образца, а второй — после. Затем сравнивает обе версии. На выходе показывает, какие ключи добавились, а какие удалились, что в целом изменилось в системе за время работы вредоноса.

К примеру, на скрине выше RegShot сравнил два снапшота реестра с разницей в полторы минуты. За это время в системе добавилось более 20 тыс. ключей, удалилось четыре, кроме того, среди новых появились записи про lets.exe и letsvpn — следы установочного пакета Valley RAT, через который распространяется вредонос. После установки он докачивает основную нагрузку отдельным файлом, который я назвал payload.bin.
Песочницы
Большинство перечисленных выше инструментов динамического анализа можно использовать по отдельности, а можно объединить через песочницу, чтобы сразу видеть и изменения в реестре, и список запущенных процессов, и подпроцессы, и сетевую активность.
Мои фавориты среди песочниц — ANY.RUN и Triage. Они позволяют запускать подозрительные файлы и получать отчет об изменениях в системе, причем у обеих есть бесплатные тарифы. Но у них есть ограничение: там можно проводить только публичные изыскания. Это значит, что любой человек, у которого есть ссылка с уникальным номером твоего исследования, может посмотреть, что именно ты анализировал. Закрытый режим у таких сервисов обычно платный. Учитывая, что мы работаем с открытыми данными, платный тариф мне пока не пригодился.
Но стоит отметить, что ANY.RUN и Triage — не взаимозаменяемые инструменты. У каждого своя логика работы, и я выбираю между ними в зависимости от текущей задачи.
Например, ANY.RUN предоставляет интерактивную ОС прямо в браузере. В этой песочнице можно в реальном времени кликать, скачивать файлы по ссылке, запускать вложения из писем, нажимать кнопки в интерфейсе вредоноса и сразу смотреть, как система на это реагирует. Допустим, иду в ANY.RUN, если нужно понять, что вирус делает сразу после запуска или что происходит после клика определенной кнопки.
Triage работает несколько иначе. Он сам запускает образец и выдает детальный готовый отчет, где есть и реакция системы, и сетевой трафик. Никакой интерактивности, зато это быстро и хорошо подходит для массового анализа. Например, когда требуется прогнать несколько образцов и автоматически сравнить результаты.
В большинстве случаев я работаю именно с Triage, и только когда нужно «потрогать» малварь руками в реальном времени, переключаюсь на ANY.RUN.
Есть еще CAPE и Cuckoo Sandbox, но эти песочницы я пока не тестировал. CAPE отлично подходит для самостоятельного развертывания на собственных мощностях. Когда дойдет до закрытых исследований, планирую перейти именно на него, поскольку публичные песочницы для таких задач не подходят. Cuckoo Sandbox — классическая опенсорсная песочница, которая широко распространена среди исследователей.
Что по итогам
Опенсорсные продукты почти везде закрывают задачи штатных коммерческих инструментов. Безусловно, где-то приходится мириться с менее удобным интерфейсом, где-то с урезанным функционалом, но в целом полноценно реверсить вредоносное ПО можно и без покупки дорогих лицензий.
И хотя для статического анализа мой основной стек строится вокруг IDA и ее плагинов, но считаю, что если нужна полностью бесплатная альтернатива, — Ghidra и перечисленные выше утилиты для разбора PE-файлов и поиска строк — будут вполне рабочей альтернативой.
Для динамики мои ежедневные палочки-выручалочки — x64dbg и набор Sysinternals. Они полностью бесплатны, как и песочницы, которые сильно экономят время.
А каким набором инструментов пользуетесь вы?
