
Быстро находите различия и сходства в дизассемблированном коде

Авторские права 2011-2026 Google LLC.
Этот репозиторий содержит исходный код BinDiff. BinDiff — это инструмент с открытым исходным кодом для сравнения бинарных файлов, позволяющий быстро находить различия и сходства в дизассемблированном коде.
BinDiff — это инструмент с открытым исходным кодом для сравнения бинарных файлов, который помогает исследователям уязвимостей и инженерам быстро находить различия и сходства в дизассемблированном коде.
С помощью BinDiff исследователи могут выявлять и изолировать исправления уязвимостей в патчах, предоставленных вендорами. Его также можно использовать для переноса символов и комментариев между дизассемблированными версиями одного и того же бинарного файла. Это упрощает отслеживание изменений со временем, позволяет организациям сохранять результаты анализа и обеспечивает передачу знаний между бинарными аналитиками.
Если вы хотите просто начать использовать BinDiff, загрузите готовые установочные пакеты со страницы релизов.
Примечание: BinDiff полагается на отдельный дизассемблер. Из коробки он поддерживает IDA Pro, Binary Ninja и Ghidra. На странице дизассемблеров перечислены поддерживаемые конфигурации.
Подмножество существующего руководства доступно в каталоге docs/.
BinDiff содержит следующие компоненты:
cmake — файлы сборки CMake, объявляющие внешние зависимостиfixtures — набор тестовых файлов для проверки основного движка BinDiffida — интеграция с дизассемблером IDA Projava — исходный код на Java. Содержит пользовательский интерфейс визуального сравнения BinDiff и соответствующую библиотеку утилит.match — алгоритмы сопоставления для основного движка BinDiffpackaging — исходники пакетов для установочных пакетовtools — вспомогательные исполняемые файлы, поставляемые с продуктомПриведённых ниже инструкций должно быть достаточно для сборки как нативного кода, так и компонентов на Java.
Более подробные инструкции по сборке будут добавлены позже. Они включают готовые Dockerfile и скрипты для сборки установочных пакетов.
BinDiff использует CMake для генерации файлов сборки для компонентов, состоящих из нативного кода C++.
Требуются следующие зависимости для сборки:
Общие шаги сборки одинаковы для Windows, Linux и macOS. Ниже показаны команды для Linux.
Затем настройте каталог сборки и сгенерируйте файлы сборки:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
Наконец, выполните фактическую сборку. Бинарные файлы будут размещены в build/:
cmake --build build --config Release
(cd build; ctest --build-config Release --output-on-failure)
cmake --install build --config Release
Чтобы собрать без IDA, просто измените описанный выше шаг настройки на
cmake -S . -B build/out -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DBINEXPORT_ENABLE_IDAPRO=OFF
Сборка GUI на Java требует коммерческой сторонней библиотеки визуализации графов yFiles для отображения и компоновки графов. Эта библиотека чрезвычайно мощная и её нелегко заменить.
Для сборки BinDiff использует Gradle 6.x и Java 11 LTS. Обратитесь к руководству по установке за инструкциями по установке.
Если вы являетесь владельцем лицензии yFiles, задайте переменную окружения YFILES_DIR, указав каталог, содержащий y.jar и ysvg.jar из yFiles.
Примечание: BinDiff по-прежнему использует более старую ветку 2.x yFiles.
Затем вызовите Gradle для загрузки внешних зависимостей и сборки:
Windows:
set YFILES_DIR=<path\to\yfiles_2.17>
cd java
gradle shadowJar
Linux или macOS:
export YFILES_DIR=<path/to/yfiles_2.17>
cd java
gradle shadowJar
После этого в каталоге ui/build/libs в подкаталоге java должен находиться автономный артефакт bindiff-ui-all.jar, который можно запустить стандартной командой java -jar.
Оригинальные статьи, описывающие общие идеи, лежащие в основе BinDiff:
Другие инструменты в той же области задач:
Проекты, использующие BinDiff:
BinDiff распространяется на условиях лицензии Apache. См. LICENSE для получения дополнительной информации.
Если вы хотите внести свой вклад, пожалуйста, прочитайте CONTRIBUTING.md перед отправкой pull request. Вы также можете сообщать об ошибках или отправлять запросы на новые функции.