Программное обеспечение

Как приручить Ghidra

Знакомство с Ghidra

Вот уже два десятилетия основным инструментом реверс-инженеров остается дизассемблер IDA Pro. За эти годы появлялось множество программ, призванных дополнить или полностью заменить IDA, но лишь немногие «выжили». Затем наступила эпоха декомпиляции: стоимость ПО для обратной разработки возросла, а порог входа поднялся ещё больше.
В 2019 году появилась Ghidra — абсолютно бесплатная программа с открытым исходным кодом, которая поддерживала несколько платформ и объединяла функции мощного дизассемблера и встроенного декомпилятора. Однако, первый релиз не был даже отдаленно похож на привычные нам инструменты. Опробовав эту программу, многие реверс-инженеры быстро теряли к ней интерес.
Когда я спрашиваю коллег, пробовали ли они Ghidra, чаще всего слышу похожие ответы: «Пробовал, но я привык к IDA» или «У меня нет времени возиться с ней. Как-нибудь потом». Поначалу мои попытки разбирать код с помощью этой программы тоже терпели фиаско, и я возвращался к знакомым инструментам. Тем не менее, время от времени я скачивал новые версии, пытался решить в них какие-то рабочие задачи или просто играл в CTF. И вот однажды, после того как я немного подкрутил настройки и добавил недостающие базы данных, я уже не вернулся к старым инструментам.
В этой статье я вкратце расскажу о том, как установить Ghidra, а затем настроить графический интерфейс и изменить непривычные комбинации горячих клавиш.

Дисклеймер

Ghidra — это сочетание сложного исходного кода и множества сторонних зависимостей, в которых уже находили уязвимости. Нет никакой гарантии, что текущая кодовая база этой программы не содержит уязвимостей или «закладок». Будьте осторожны и действуйте осмотрительно.

Собираем Ghidra

Проще всего, конечно, скачать текущий релиз Ghidra с GitHub. Чаще всего, релиз отстаёт от master-ветки на месяцы и не содержит много важных исправлений и улучшений. Так что, хотя в документации и не советуют этого делать, я предлагаю брать самый свежий код из master-ветки, а бинарные файлы собирать самостоятельно. Мы, в свою очередь, готовим собственную сборку из актуальных исходников, и выложим её через некоторое время. Итак, начнем.

Вот что вам понадобится:
Для всех ОС:

  • JDK 17 (для 64-разрядных систем), рекомендуется использовать Adoptium Temurin;
  • Gradle 7.3+; Ghidra прекрасно работает с версией 7.3.3.

Для создания бинарников на каждой платформе нужен свой компилятор.

  • Windows: Microsoft Visual Studio (2017 или выше; версия 2022 Community работает без проблем);
  • Linux: GNU Compiler Collection (отлично подходят версии 9 и 12);
  • macOS: система сборки Xcode.

Скачайте ZIP-архив с последней версией исходного кода и распакуйте его или клонируйте официальный репозиторий Git.

Сборка для Windows

Запустите командную строку (CMD.EXE).

Перейдите в каталог с исходным кодом:
cd %directory_of_ghidra_source_code%
Запустите файл bin\gradle.bat из каталога Gradle, чтобы инициализировать дерево исходного кода и загрузить все зависимости:
gradle.bat -I .\gradle\support\fetchDependencies.gradle init
Для загрузки зависимостей потребуется подключение к интернету и 5 –10 минут.

В результате в командной строке должны появиться сообщение BUILD SUCCESSFUL и информация о расположении Visual Studio (эта среда понадобится для дальнейшей сборки).

Если вы правильно установили Visual Studio, JDK и Gradle, но тем не менее возникли проблемы, проверьте интернет-соединение. После успешной сборки введите последнюю команду:
gradle.bat buildGhidra
На ее выполнение потребуется больше времени. На экране может появляться множество предупреждений, но вердикт должен быть тот же — BUILD SUCCESSFUL.

ZIP-архив с дистрибутивом Ghidra сохранится в каталог build\dist. Чтобы открыть программу, извлеките файлы из архива и запустите ghidraRun.bat.

На момент написания этой статьи в Ghidra 10.3-DEV по умолчанию используется интерфейс в стиле Windows, поэтому менять его не будем.

Сборка для Linux

Откройте окно терминала или используйте уже открытое.

Перейдите в каталог с исходным кодом:
cd %directory_of_ghidra_source_code%
Запустите файл bin\gradle из каталога Gradle, чтобы инициализировать дерево исходного кода и загрузить все зависимости:
gradle -I ./gradle/support/fetchDependencies.gradle init
Для загрузки зависимостей потребуется 5–10 минут при наличии подключения к интернету. Обратите внимание: если текущий языковой стандарт отличается от en_US, а в GCC используются переведенные сообщения, может возникнуть ошибка:

Такое бывает, например, в русскоязычных системах, потому что строка версии GCC переведена:

Этой ошибки можно избежать, если запустить Gradle с префиксом LANG=C:
LANG=C gradle -I ./gradle/support/fetchDependencies.gradle init
В результате в командной строке должно появиться сообщение BUILD SUCCESSFUL.

После этого запустите сборку Ghidra со всеми зависимостями:
Gradle buildGhidra
После завершения сборки найдите ZIP-архив с дистрибутивом в каталоге build/dist

Запустите Ghidra шелл-скриптом ghidraRun, который находится в корневом каталоге распакованного архива:

На момент написания этой статьи в Ghidra 10.3-DEV по умолчанию используется стиль Nimbus:

Если вы хотите использовать более привычный стиль оформления, перейдите в меню Edit -> Tool Options -> Tool и выберите Native или GTK+ из выпадающего списка Swing Look And Feel. Вот как тема Native выглядит в Gnome 3:

Сборка для macOS

Если у вас Mac, установите инструменты командной строки Xcode, включающие замену для GCC и make. Для этого достаточно открыть терминал и ввести команду gcc. Если эти инструменты не установлены, появится диалоговое окно установки. Подтвердите установку и подождите, пока завершится скачивание.

Процесс сборки после установки инструментария Xcode ничем не отличается от аналогичного процесса в Linux.

Перейдите в каталог с исходным кодом:
cd %directory_of_ghidra_source_code%
Запустите файл bin\gradle из каталога Gradle, чтобы инициализировать дерево исходного кода и загрузить все зависимости:
gradle -I ./gradle/support/fetchDependencies.gradle init
Запустите процесс основной сборки:
gradle buildGhidra

Извлеките дистрибутив Ghidra из ZIP-архива, расположенного в каталоге build/dist, и запустите шелл-скрипт ghidraRun:

По умолчанию используется стиль оформления macOS:

Настройка пользовательского интерфейса

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

Используя меню File -> New Project, укажите расположение и название проекта и нажмите Finish:

Теперь у нас есть пустой проект. Откроем редактор CodeBrowser — это основной инструмент для работы с бинарными файлами:

Откроется пустое окно листинга с несколькими дополнительным окнами:

Это основная рабочая область Ghidra. Давайте настроим привычное оформление для удобства работы.

Панель навигации

Панель навигации расположена вертикально с правой стороны окна листинга, рядом с полосой прокрутки. Она включается нажатием кнопки Overview.

Остальные опции доступны в окне Options (Edit -> Tool Options).

Шрифт hex-редактора

В разделе Options -> ByteViewer выберите:

Шестнадцатеричное смещение в структурах

В разделе Options -> Structure Editor выберите:

Горячие клавиши

В разделе Key Bindings вы найдете используемые по умолчанию горячие клавиши, однако они могут ввести в ступор даже опытного реверс-инженера. Кажется, за основу были взяты сочетания из Eclipse. Вы можете найти нужные вам сочетания клавиш и настроить или изменить их с помощью фильтра. Чтобы упростить этот процесс, мы подготовили готовую к использованию конфигурацию со знакомыми горячими клавишами (C — код, D — данные, X — перекрестные ссылки, Esc — назад и т. д.). Скачайте ее по этой ссылке и импортируйте в свой проект:

Шрифт листинга дизассемблирования

Выберите шрифт и его цвет в разделе Options -> Listing Display:

Компактный листинг элементов массива

Укажите нужное значение элементов в строке (Elements Per Line) в разделе Listing Fields -> Array Options. В поле Array Index Format можно выбрать hex, чтобы избежать путаницы в листинге.

Одна строка для каждой инструкции

Перейдите в меню Options -> Listing Fields -> Bytes Field и в поле Maximum Lines To Display укажите значение 1. Имеет смысл поставить флажок напротив параметра Display in Upper Case.

Подсветка по щелчку левой кнопки мыши

Это одна из самых искомых настроек, с неожиданными установками по умолчанию. Чтобы включить подсветку значений, регистров, меток и других элементов по щелчку левой кнопки мыши, перейдите в меню Options -> Listing Fields -> Cursor Text Highlight и в поле Mouse Button To Activate выберите LEFT (по умолчанию установлено значение MIDDLE).

Маркировка начала и конца функции

Перейдите в раздел Options -> Listing Fields -> Format Code и установите флажок напротив опций Flag Function Entry и Flag Function Exits.

В разделе Options -> Listing Fields -> Labels Field снимите флажок напротив опции Display Function Label, чтобы удалить лишнюю строку в начале функций.

Отключение горизонтальной прокрутки

Перейдите в раздел Options -> Listing Fields -> Mouse и снимите флажок напротив соответствующей опции:

Отображение «нормальных» имен регистров, длинных массивов и строк

По умолчанию вместо имен регистров Ghidra отображает имена локальных переменных. Иногда это полезно, но при чтении обычного ассемблера очень неудобно.

Чтобы отображать обычные имена регистров, перейдите в раздел Options -> Listing Fields -> Operands Field и снимите флажок напротив опции Markup Register Variable References.

Кроме того, чтобы массивы и строки в листинге было проще читать, в этом же разделе стоит увеличить максимальное количество отображаемых строк (Maximum Lines to Display) до 200 и установить флажок напротив опции Enable Word Wrapping.

Увеличение числа отображаемых перекрестных ссылок

Этот параметр можно настроить в разделе Options -> Listing Fields -> XREFs Field:

Изменение ширины столбцов Address, Bytes и Opcodes

Форматирование и размер полей в Ghidra можно менять через пользовательский интерфейс. Для этого нажмите кнопку Edit the Listing Fields в главном окне листинга.

После активации функции вы сможете перемещать столбцы и менять их ширину. Для сохранения настроек выберите save the tool при закрытии CodeBrowser.

Открытие файла для анализа

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

Для импорта файла перейдите в меню File -> Import File в окне проекта Ghidra. Появится диалоговое окно импорта.

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

Импортированный файл появится в окне проекта. Отсюда можно запустить редактор CodeBrowser для просмотра файла в главном окне листинга:

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

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

После начала анализа информация в окне CodeBrowser будет постепенно обновляться:

Вот несколько советов по работе с CodeBrowser.

  • В окне Symbol Tree можно найти любые функции: экспортированные, включая точки входа, и импортируемые. Отправные точки для анализа ищите здесь.
  • Окно Data Type Manager содержит все типы, структуры, определения типов (typedef), указатели и перечисления (enum). Сюда же загружаются библиотеки внешних типов. Для их просмотра нужно нажать на кнопку со стрелкой вниз.
  • Большинство функций CodeBrowser доступны из меню Window.
  • Сегменты файлов отображаются в окне Memory Map. Его можно открыть, нажав на соответствующую кнопку, или через меню Window.

Дальнейшая работа с программой

В Ghidra есть набор вспомогательных скриптов на Java и Python, которые доступны через менеджер скриптов (Script Manager). Он открывается соответствующей кнопкой или через меню Window. Здесь также есть встроенная интерактивная консоль на Python 2 (фактически, на Jython). Перейдите в меню Window -> Python и введите команду dir() для просмотра «плоского» API:

Полезное расширение

В настоящее время в базовой сборке Ghidra не хватает многих используемых в Windows типов данных, которые нужны для анализа типовых вредоносных программ. Мы подготовили расширенную базу типов для Windows, а также добавили FIDB (runtime-сигнатуры функций) для VS2013 и Delphi. Загрузить их можно отсюда.

Это только начало

Надеемся, что это руководство поможет вам сделать Ghidra более простым и удобным инструментом. С дополнительными типами данных и базами сигнатур эта программа может стать основным инструментом реверс-инженера — причем без лишних затрат. Только не забывайте проверять обновления!

Как приручить Ghidra

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

 

  1. Михаил

    Только начал вникать, на кролике ввиде SH7051. Мощный инструмент.

Отчеты

CloudSorcerer: новая APT-угроза, нацеленная на российские государственные организации

«Лаборатория Касперского» обнаружила новую APT-угрозу CloudSorcerer, нацеленную на российские государственные организации и использующую облачные службы в качестве командных серверов аналогично APT CloudWizard.

StripedFly: двуликий и незаметный

Разбираем фреймворк StripedFly для целевых атак, использовавший собственную версию эксплойта EternalBlue и успешно прикрывавшийся майнером.

Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике