BinDiffHelper
Расширение Ghidra, которое использует BinDiff в вашем проекте Ghidra для поиска совпадающих функций и их автоматического переименования (поддерживаются BinDiff 6, 7, 8).
Ознакомьтесь с руководством BinDiff, чтобы понять, как это работает и как сопоставляются функции / базовые блоки. Однако с этим расширением BinDiff автоматизирован изнутри Ghidra, так что вам не нужно самостоятельно выполнять diff ваших бинарников.
Пожалуйста, сообщайте об ошибках через функцию issues на github
Список изменений
v0.7.1
v0.7.0 (версии Ghidra >= 11.4)
- Изменений нет, кроме совместимости с версией Ghidra
v0.6.4 (версии Ghidra < 11.4)
- Поддержка экспорта пространств имён
- Исправлено бесконечное зависание при diffing
v0.6.3
- Разрешена сортировка таблицы
v0.6.2
- Исправлена ошибка, из-за которой diffing зависал навсегда в BinDiff 8
- При двойном щелчке по символу происходит переход к нему как в основном, так и во вторичном листинге кода
v0.6
v0.5
- Поддержка BinDiff 8
- Релиз для Ghidra 11.1
Более старые изменения
### v0.4.3
* Релиз для Ghidra 11.0
v0.4.2
- Добавлена функция импорта всех функций (не только отмеченных в таблице)
- Добавлена функция переключения флажка для нескольких элементов в таблице
- Обновление для поддержки Ghidra 10.3
v0.4.1
- Обновление для поддержки Gradle 7.5 и Ghidra 10.1
v0.4.0
- Поддержка BinDiff 7 и Ghidra 10
v0.3.2
- Исправлена ошибка, из-за которой diffing с другим файлом из того же проекта не работал
- Исправлена ошибка, из-за которой файлы с короткими именами (< 3 символов>) не могли быть подвергнуты diffing
v0.3.1
- Исправлено падение при открытии файла через опцию "from project"
v0.3
- Раскраска совпавших функций в листинге
- Добавление комментариев к совпавшим функциям в листинге со ссылкой на другой бинарник
- Исправлена ошибка, из-за которой библиотека protobuf отсутствовала в некоторых сборках
- Новое меню загрузки файлов
v0.2
- Исправлена ошибка, из-за которой файл для импорта нужно было извлекать (check out).
- Увеличен размер диалогового окна выбора файла проекта
v0.1
- BinDiff бинарника, открытого в Ghidra, с другим бинарником из того же проекта Ghidra, показ результатов и импорт имён функций
- Открытие файла BinDiff, созданного с помощью BinDiff 6, из двух файлов .BinExport и импорт совпадающих имён функций в Ghidra
Как установить
Либо скачайте .zip-файл из релиза, если он совместим с вашей версией Ghidra, иначе см. Как собрать ниже.
- Откройте Ghidra
- В Main Window: перейдите в File->Install Extensions...
- Нажмите кнопку + в правом верхнем углу и выберите zip-файл BinDiffHelper
- Закройте менеджер плагинов. Перезапустите Ghidra, чтобы загрузить новый плагин
- См. Использование ниже
Рекомендуемые другие инструменты
Без них вы сможете только импортировать файлы .BinDiff, но не автоматически экспортировать и выполнять diff из вашего проекта Ghidra
Использование
Убедитесь, что плагин загружен в Code Explorer, открыв файл в Ghidra и в Code Explorer перейдя в File->Configure
Нажмите маленькую иконку вилки в правом верхнем углу:

и убедитесь, что флажок рядом с BinDiffHelperPlugin установлен.

Импорт внешнего .BinDiff
Соответствующие файлы .BinExport должны находиться в той же папке.
Откройте файл, в который вы хотите импортировать имена, в Code Browser, затем перейдите в Window->BinDiffHelper

Используйте кнопку Open from BinDiff или пункт меню и выберите ваш файл .BinDiff.

Выберите все имена функций, которые хотите импортировать, и нажмите кнопку Import function names в правом верхнем углу или соответствующий пункт меню.
Сравнение между файлами в проекте Ghidra
Перейдите в Window->BinDiffHelper, убедитесь, что нет предупреждений, касающихся BinExport или BinDiff, затем нажмите кнопку Open from project.
Выберите другой файл из дерева и нажмите OK.

Как собрать
Требования:
- Установка Ghidra (https://ghidra-sre.org) или скомпилированная из исходников
- Какой-либо jdk. Могут быть определённые ограничения в зависимости от того, как была собрана ваша Ghidra и какие другие плагины вы используете. Я рекомендую использовать Temurin 21 LTS, так как на данный момент он, похоже, работает как с BinExport, так и с BinDiffHelper.
- gradle (протестировано с 7.5, 8.10)
Клонирование репозитория
Клонируйте репозиторий рекурсивно, так как он зависит от BinExport для соответствующего определения protocol buffer.
git clone --recurse-submodules https://github.com/ubfx/BinDiffHelper.git
Сборка
Вам нужно установить переменную окружения GHIDRA_INSTALL_DIR в каталог установки Ghidra.
Если у вас установлены разные JDK, убедитесь, что переменная окружения JAVA_HOME указывает на тот, который использует ваша установка Ghidra.
Расширение будет собрано именно для этой версии Ghidra.
Затем перейдите в папку BinDiffHelper в вашей оболочке и выполните
gradle
Это соберёт как BinExport в соответствующем подмодуле, так и BinDiffHelper в родительском каталоге. В каталоге dist должен быть создан .zip-файл. Используйте этот .zip-файл для установки согласно инструкциям выше.
Настройка для разработки / отладки
Иногда полезно иметь возможность отлаживать расширение вместе с Ghidra, вот несколько заметок об этом: