DDisasm: дизассемблер на Datalog, который пересобирает бинарник в код

DDisasm: дизассемблер на Datalog, который пересобирает бинарник в код

GrammaTech ведёт на GitHub репозиторий DDisasm, дизассемблера, который заявлен как достаточно точный, чтобы получившийся ассемблерный код можно было пересобрать обратно в работающий бинарник. Правила и эвристики разбора описаны не императивным кодом, а на декларативном языке Datalog через движок Souffle. DDisasm умеет работать с бинарными форматами ELF (Linux) и PE (Windows) и поддерживает пять архитектур набора команд: x86_32, x86_64, ARM32, ARM64 и MIPS32.

Пайплайн устроен так: инструмент разбирает информацию ELF/PE-файла, декодирует избыточный набор возможных инструкций и строит по нему исходный набор datalog-фактов; затем эти факты анализируются, чтобы определить границы кода, символизацию и границы функций. Уточнённый набор фактов переводится в промежуточное представление GTIRB, предназначенное для анализа бинарного кода и обратной разработки (reverse engineering). Через компонент GTIRB pretty printer это представление можно снова превратить в ассемблерный код, пригодный для пересборки.

Практически инструмент распространяется как готовый Docker-образ grammatech/ddisasm:latest. В документации показан рабочий цикл: контейнер запускается с примерами из репозитория, внутри собирается тестовый бинарник (gcc), затем командой ddisasm он превращается в GTIRB-файл. Дальше в GTIRB-представление можно вносить программные изменения через библиотеки GTIRB и gtirb-rewriting, а компонент gtirb-pprinter либо сразу соберёт из изменённого представления новый бинарник, сам подобрав нужные флаги компилятора, зависимости библиотек и скрипты линковки версий, либо выгрузит редактируемый ассемблерный листинг (флаг --asm), который затем вручную дособирается тем же gcc.

В основе метода, статья "Datalog Disassembly" Антонио Флорес-Монтойи и Эрика Шульте, представленная на USENIX Security 2020. Развитие того же направления описано в статье 2025 года "Disassembly as Weighted Interval Scheduling with Learned Weights" на IEEE Symposium on Security and Privacy, среди её авторов снова Флорес-Монтойя, а также Джанхи Лим, Адам Зайц, Акшай Суд, Эдвард Рафф и Джеймс Холт. Среди участников проекта в документации отдельно указаны Programming Language Group Сиднейского университета, добавившая начальную поддержку ARM64, и пользователь GitHub gogo2464, переработавший документацию.

В доступном тексте репозитория нет ни указания лицензии, ни даты выхода или последнего обновления текущей версии инструмента, ни опубликованных цифр по скорости или точности разбора, при том что именно на "быстрый" и "достаточно точный" сделан акцент в описании.

Ключевые факты

  • DDisasm дизассемблирует бинарники ELF и PE для x86_32, x86_64, ARM32, ARM64 и MIPS32, используя декларативный язык Datalog (движок Souffle) для описания правил и эвристик разбора.
  • Результат анализа переводится в промежуточное представление GTIRB для обратной разработки; его можно программно менять через библиотеки GTIRB и gtirb-rewriting, а затем пересобрать в новый бинарник или ассемблерный листинг компонентом gtirb-pprinter.
  • gtirb-pprinter при сборке нового бинарника сам подбирает нужные опции компиляции, зависимости библиотек и скрипты линковки версий.
  • Готовый Docker-образ grammatech/ddisasm:latest позволяет запустить дизассемблер и пример из репозитория без ручной сборки инструмента.
  • В основе инструмента статья "Datalog Disassembly" (USENIX Security 2020) Антонио Флорес-Монтойи и Эрика Шульте; развитие метода описано в статье "Disassembly as Weighted Interval Scheduling with Learned Weights" (IEEE S&P 2025) того же автора и ещё пяти соавторов.

Почему это важно

DDisasm решает больную для обратной разработки задачу: типичный дизассемблер выдаёт код, который нельзя надёжно собрать обратно в работающий бинарник, а здесь именно это заявлено целью и подкреплено промежуточным представлением GTIRB, поверх которого можно программно редактировать бинарник и пересобирать его заново. То, что правила разбора описаны декларативно на Datalog, а не зашиты в императивную логику, делает набор эвристик более прозрачным и расширяемым. При этом проект, не разовый скрипт, а линия исследований с академической историей: от статьи на USENIX Security 2020 до продолжения на IEEE S&P 2025, где тот же алгоритм улучшают через взвешенное планирование интервалов с обучаемыми весами.

Кому это важно

Специалистам по обратной разработке и информационной безопасности, которые анализируют, патчат или исследуют бинарники без исходного кода. Инженерам, которые строят инструменты для перезаписи и инструментирования бинарного кода поверх библиотек GTIRB и gtirb-rewriting. Исследователям в области анализа программ, которым важна корректность дизассемблирования и кто опирается на лежащие в основе научные статьи.

Как это применить

Инструмент распространяется как Docker-образ grammatech/ddisasm:latest. Документация показывает цикл: запустить контейнер с примонтированной папкой примеров, собрать внутри тестовый бинарник gcc-ом, затем командой ddisasm с флагом --ir получить GTIRB-представление. Это представление можно менять программно через библиотеки GTIRB или gtirb-rewriting. Дальше gtirb-pprinter либо сразу соберёт из изменённого представления новый бинарник, сам подставив нужные флаги компилятора и линковки, либо выгрузит ассемблерный листинг флагом --asm для ручного редактирования с последующей пересборкой тем же gcc.

Можно ли доверять

В основе метода, рецензируемая статья "Datalog Disassembly" Антонио Флорес-Монтойи и Эрика Шульте на USENIX Security 2020, а тот же ведущий автор продолжил эту линию исследований статьёй 2025 года на IEEE S&P об улучшении алгоритма через взвешенное планирование интервалов с обучаемыми весами. Это не разовый эксперимент, а продолжающаяся публикуемая работа GrammaTech. При этом в доступном тексте репозитория нет ни указания лицензии, ни даты текущего релиза, ни независимых цифр по скорости или точности разбора, заявления "быстрый" и "достаточно точный" по самому этому тексту проверить нельзя.

Риски и подводные камни

В доступном фрагменте репозитория не указана лицензия, поэтому условия использования и распространения по этому тексту не определены. Поддержка ограничена пятью архитектурами набора команд и двумя форматами бинарников (ELF, PE), это не универсальное решение для любого бинарника. Заявления о скорости и точности разбора, при которой ассемблерный код можно пересобрать обратно, не подкреплены в тексте опубликованными цифрами или бенчмарками, так что реальное поведение инструмента на сложных или обфусцированных бинарниках по этому источнику не проверить.