
Плагин Ghidra для поиска границ объектных файлов.
Плагин Ghidra для DeepCut / CodeCut GUI
CodeCut позволяет пользователю назначать функции объектным файлам в Ghidra, а затем взаимодействовать с бинарным файлом на уровне объектных файлов. Функции назначаются объектным файлам путём установки поля Namespace в базе данных Ghidra. DeepCut пытается установить начальные границы объектных файлов, которые пользователь затем может корректировать с помощью окна CodeCut Table.
Большинство бинарных файлов происходят из нескольких файлов исходного кода. При реверс-инжиниринге аналитики часто вырабатывают ощущение того, какие функции связаны, и, следовательно, вероятно, принадлежали одному и тому же исходному файлу. CodeCut позволяет аналитику выдвинуть гипотезу, например: «Я думаю, что этот блок функций — функции ОС». Теперь, если в этой области есть неисследованные функции, они будут отображаться в дизассемблировании и декомпиляции как OS::FUN_XXXXXXXX, а не просто FUN_XXXXXXXX. Это приводит к более быстрому пониманию того, для чего могут использоваться функции при просмотре в контексте.
Следуйте стандартным процедурам установки расширений Ghidra. Скопируйте zip-архивы расширений CodeCut и DeepCut в $GHIDRA_INSTALL_DIR/Extensions, затем в главном окне Ghidra выберите File -> Install Extensions и отметьте флажки CodeCut и DeepCut. Ghidra сообщит вам, что необходимо перезапустить. Поскольку Ghidra теперь требует от плагинов только соответствия major/minor версии базовой версии, а не патч-версиям, мы ожидаем, что будем выпускать только чётные major/minor версии.
ПРИМЕЧАНИЕ. После перезапуска и загрузки окна CodeBrowser Ghidra сообщит, что найдены новые плагины, и спросит, хотите ли вы их настроить. В этом окне отображается только CodeCut. Это связано с тем, что DeepCut является «одноразовым» анализатором (он по-прежнему установлен).
И CodeCut, и DeepCut полагаются на нативное расширение PyGhidra и несовместимы с Jython. CodeCut использует нативный Python для подбора имён модулей. Инференс модели DeepCut выполняется в нативном Python.
CodeCut:
DeepCut:
Чтобы установить зависимости, выполните:
pip install nltk
pip install torch torch-geometric networkx scipy
используя установку Python, связанную с вашим PyGhidra.
DeepCut лучше всего запускать как одноразовый анализатор после первоначального автоматического анализа. Выберите Analysis -> One Shot -> Deepcut. После выполнения DeepCut вы можете просмотреть результаты, взглянув на поле Namespace в представлении Symbol Table.

После выполнения DeepCut вы можете взаимодействовать на уровне объектных файлов с помощью представления CodeCut Table. Выберите Window -> CodeCut Table, чтобы отобразить таблицу. Таблица CodeCut по сути представляет собой объединённый набор таблиц символов, по одной для каждого модуля.
Вы можете попросить CodeCut угадать имена модулей (на основе строковых ссылок), выбрав Analysis -> Guess Module Names в окне CodeCut Table. Это полезно, если ваша целевая программа содержит много отладочных строк. Скрипт подбора имён сначала пытается найти имена исходных файлов, затем переходит к строкам (включая биграммы и триграммы), которые повторяются несколько раз.
Вы можете разделять/объединять объектные файлы, щёлкнув правой кнопкой мыши по объекту и выбрав Split Namespace Here / Combine Namespaces. Вы можете перемещать функции между объектными файлами (изменяя границы объектных файлов) с помощью перетаскивания.
CodeCut содержит два варианта экспорта полного модуля или поддиапазона модуля в перекомпилируемый C в меню Export, когда вы щёлкаете правой кнопкой мыши по модулю в таблице CodeCut. Эта функция помечена как ЭКСПЕРИМЕНТАЛЬНАЯ и недостаточно протестирована.

В CodeCut теперь есть опция графа для просмотра взаимодействий / иерархии модулей внутри бинарного файла. Добавьте пространства имён в представление графа, щёлкнув правой кнопкой мыши по функции в CodeCut Table и выбрав Add Namespace to Graph. Вы можете удалять модули из графа, щёлкнув правой кнопкой мыши и выбрав Show Namespaces in Graph Filter.
Хотя может показаться, что можно щёлкать правой кнопкой мыши по именам модулей на правой стороне, на самом деле CodeCut обращает внимание на то, какая функция выделена в таблице. Так, например, если у вас выделена функция в object3, и вы щёлкаете правой кнопкой мыши по серому полю object2 слева и нажимаете Combine/Split или Rename Namespaces, CodeCut выполнит операцию от функции, выделенной в object3.
CodeCut пытается упорядочить пространства имён по их начальному адресу. Может показаться, что CodeCut перечисляет модули не по порядку, однако это обычно связано с погрешностями дизассемблирования в Ghidra. Например, предположим, у нас есть карта памяти, которая выглядит так:
object2: 0x00010000 - 0x00018000
object3: 0x00018004 - 0x00020000
...
object50: 0x00480000 - 0x00480a00
Допустим, функция по адресу 0x00480000 выполняет ветвление или переход на адрес 0x00016008. Это должна быть новая точка входа в функцию, но если её использует только одна функция, Ghidra может не пометить это как точку входа в функцию и просто считать её частью FUN_00480000. Это означает, что фактический диапазон object50 равен 0x00016008 - 0x00480a00. И поэтому object50 будет отображаться в таблице между object2 и object3. CodeCut выводит диапазоны модулей в журнал приложения Ghidra для помощи в отладке этой проблемы. В этом случае определение 0x00016008 как функции приведёт к тому, что границы object50 станут правильными, и object50 отобразится в нужном месте таблицы.
Функции, определённые после выполнения анализа DeepCut, по умолчанию добавляются в пространство имён Global. В будущем мы планируем добавить функцию, которая будет автоматически добавлять их в ближайшее пространство имён, или предоставить механизм для более простого назначения отдельных функций непосредственно конкретному пространству имён.
Конкретные инструкции по сборке приведены в подпапках DeepCut и CodeCut.