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), это не универсальное решение для любого бинарника. Заявления о скорости и точности разбора, при которой ассемблерный код можно пересобрать обратно, не подкреплены в тексте опубликованными цифрами или бенчмарками, так что реальное поведение инструмента на сложных или обфусцированных бинарниках по этому источнику не проверить.