GReAT рекомендует: полезные плагины IDA Pro

В Глобальном центре исследований и анализа угроз «Лаборатории Касперского» (GReAT) есть традиция – собираться раз в месяц и делиться результатами последних исследований, интересными методиками и полезными инструментами. Недавно мы приняли беспрецедентное решение проводить прежде закрытые встречи в виде публичных онлайн-конференций под названием GReAT Ideas. Powered by SAS. На второй встрече, прошедшей 22 июля 2020 года, я рассказывал о полезных плагинах IDA Pro, которыми регулярно пользуюсь. Эта статья дает представление о некоторых плагинах из моей презентации.

Подсвечивание инструкций, перенаправляющих поток управления

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

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

Как видите, Immunity Debugger, x64dbg и radare2 подсвечивают инструкции, перенаправляющие поток управления, а IDA Pro — нет. Стандартная тема IDA Pro выглядит довольно невзрачно. Ее общий вид можно значительно улучшить, если зайти в меню Options -> Colors…, и затем в окне Colors задать цвета для мнемоник инструкций, реестров, адресов, констант и переменных. В результате на выходе в IDA Pro будет более приятная картина, но до конца это проблему не решит, поскольку все инструкции выделены одним цветом. А если вы полагаетесь на подсвечивание адресов, то оно не поможет вам обнаружить непрямые вызовы функций. Почему в IDA Pro нет функции выделения инструкций CALL? Я никак не могу к этому привыкнуть. И, по всей видимости, не только я. Для решения этой проблемы созданы различные скрипты и плагины. В частности, fluorescence.py и highlight_calls.py — это лишь пара примеров. В этих скриптах используются функции API set_color()/set_item_color() для цветового выделения инструкции путем изменения цвета фона за ней. Хотя эти плагины решают поставленную задачу, конечный результат мог быть лучше, если бы можно было изменить цвет отдельных мнемоник инструкции.

В какой-то момент я решил проверить, можно ли изменить цвет определенной инструкции с помощью более продвинутого плагина, и стал изучать файлы заголовков SDK IDA Pro. Я нашел то, что искал, в файле заголовка lines.hpp, который показывает внутренний формат IDA Pro для отображения дизассемблированного текста. Оказывается, функции API generate_disassembly() и generate_disasm_line() выводят дизассемблированные текстовые строки вместе со специальными управляющими последовательностями, которые используются для выделения синтаксиса. Если вы используете функцию idc.generate_disasm_line(ea, flags) в IDAPython, то эти управляющие последовательности для выделения цветом будут удалены на выходе. Однако вы по-прежнему сможете взглянуть на «сырые» дизассемблированные текстовые строки, если используете функцию ida_lines.generate_disasm_line(ea, flags). Формат последовательностей для управления цветом довольно прост: #COLOR_ON #COLOR_xxx text #COLOR_OFF #COLOR_xxx. Значение #COLOR_ON равно \x01, а значение #COLOR_xxx для мнемоники инструкции определяется как COLOR_INSN и равно \x05. В результате дизассемблированная строка текста для инструкции CALL всегда будет начинаться с последовательности \x01\x05call\x02\x05. SDK IDA Pro также позволяет применить функцию hook_to_notification_point(), которую можно использовать для установки обратных вызовов различных событий. Эти события включают в себя уведомление ui_gen_idanode_text, которое можно использовать для вывода произвольного текста в блок графа IDA. Итак, план таков: создаем обратный вызов для уведомления ui_gen_idanode_text, проверяем, начинается ли дизассемблированная строка по текущему адресу с \x01\x05call\x02\x05, и если начинается, меняем COLOR_INSN на идентификатор какого-нибудь другого цвета. Написав и протестировав нужный код, я с радостью увидел, что мой план сработал!

Я добился именно того, чего хотел, но все еще не был полностью доволен. Проблема этого подхода в том, что он работает только с архитектурами x86/64. А что насчет ARM, MIPS и остальных? Мне нужно было решение, подходящее для любых ЦП. К счастью, это оказалось несложно. В каждом процессорном модуле есть особая экспортированная структура (processor_t), которая называется LPH. Она содержит поле instruc, которое указывает на массив инструкций процессора. Каждая инструкция в этой таблице представлена мнемоникой инструкции и комбинацией ее характеристик: какой операнд функция преобразует (CF_CHGX), какой операнд использует (CF_USEX), останавливает ли выполнение (CF_STOP), совершает ли переход в другую позицию (CF_JUMP) или вызывает другую процедуру (CF_CALL). Это означает, что при запуске плагина мы можем проанализировать список инструкций из загруженного модуля процессора, найти все инструкции с характеристикой CF_CALL и позднее использовать их в сравнении. Результаты вы видите ниже.

Пока модуль процессора правильно заполняет таблицу instruc, плагин должен работать так, как должен. До сих пор у меня возникали проблемы только с архитектурой PowerPC, поскольку в этом случае все необходимые инструкции, такие как bl и bctrl, по какой-то причине отсутствуют в таблице instruc. Однако для таких случаев все еще можно реализовать временное решение.

Ссылка для загрузки

Идентификация известных функций

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

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

Чтобы решить первую проблему, компания Hex-Rays — разработчик IDA Pro — создала технологию хранения и применения сигнатур для идентификации библиотечных функций. Эта технология называется FLIRT. Она позволяет использовать специальную утилиту для предварительной обработки файлов *.obj и*.lib, создания файла *.pat с шаблонами функций и другими необходимыми данными, а затем преобразования этого файла в файл сигнатуры *.sig. В итоге вы получаете файл сигнатуры для конкретной библиотеки, который можно поместить в папку sig\<arch> в каталоге IDA Pro и применить к базе данных IDA Pro в окне View -> Open subviews -> Signatures. Если функции в библиотеке совпадают с функциями в базе данных IDA Pro вплоть до байта, они будут распознаны и соответствующим образом переименованы.

Хотя описанный выше метод частично решает первую проблему, он никак не помогает со второй. Формально технология FLIRT дает возможность создавать файлы сигнатур только для библиотек, поэтому ее нельзя использовать для переноса информации из одной базы данных IDA Pro в другую. В конце концов проблема была решена в версии IDA Pro 7.2. В ней появляется новая технология — сервер Lumina. Его можно использовать для отправки и получения метаданных функций (имен, комментариев и т. д.), представленных в базе данных. Однако передать эту информацию из одной базы данных в другую, не опубликовав ее в общем доступе, не получится. Это происходит из-за того, что в данный момент доступен только публичный сервер Lumina. По этой причине лучшее решение сейчас – это плагины. К счастью, нужные плагины существуют уже давно — IDA2PAT и IDB2SIG можно использовать для создания из существующей базы данных IDA Pro файла FLIRT, который впоследствии можно применить к новой базе данных как обычный файл сигнатуры для библиотеки. Эти плагины легки в использовании, и если функция не определяется в новой базе данных, то сразу становится понятно, что она была изменена. Оригинальные плагины IDA2PAT и IDB2SIG больше не поддерживаются, поэтому вам может пригодиться форк с поддержкой IDA Pro 7.* или современный порт с использованием IDAPython idb2pat.py.

Как я уже упоминал, недостаток технологии FLIRT в том, что она работает только при условии, что сигнатура ни на байт не расходится с телом функции. Но может возникнуть проблема, если, например, у вас есть только исходный код библиотеки, и когда вы пытаетесь его скомпилировать, результат не совпадает с проанализированным исполняемым файлом. В таких случаях пригодятся плагины для сравнения исполняемых файлов. Плагины BinDiff и Diaphora можно использовать не только для сравнения функций в разных файлах, но и для переноса их имен и комментариев. Также рекомендую попробовать плагин Karta. Он разработан специально для определения библиотечных функций в исполняемом файле напрямую из исходного кода. Подробнее о том, как это работает, можно прочитать здесь.

YARA + IDA Pro = ❤

Инструмент YARA многофункционален, как швейцарский нож. Это, пожалуй, самый любимый инструмент исследователей вредоносных программ, но недооцененный всеми остальными. Поиск последовательностей байтов в обратной разработке может быть очень кстати, и для этого лучше всего подходит инструмент YARA. Перечислю лишь несколько способов его применения: поиск важных констант, магических значений, идентификаторов GUID в базе данных IDA Pro, а также печать сообщения, переименование адреса или оставление комментария, если обнаружено совпадение. Главное — знать, что можно найти с помощью YARA и как это может помочь в вашей работе. Например, плагин findcrypt-yara использует YARA для поиска распространенных криптографических констант.

Ниже я покажу, как можно самостоятельно использовать YARA в IDA Pro. Обратите внимание: сначала нужно установить пакет yara-python.

Это только часть плагинов, которые я рассматриваю в своей презентации. Для просмотра полной записи вебинара GReAT Ideas вы можете зарегистрироваться по этой ссылке. Также не забудьте поделитесь своими любимыми плагинами IDA Pro со мной в Twitter.

Публикации на схожие темы

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

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