← На главную

DDisasm на Datalog выдаёт пересобираемый ассемблер с Docker-образом

03.08.2026 04:13 · hackernews

DDisasm — это быстрый дизассемблер, который выдаёт ассемблерный код, достаточно точный для повторной сборки. Он написан на декларативном языке логического программирования Datalog (компилятор Souffle) и использует его для компиляции правил дизассемблирования и эвристик. Работает так: сначала парсит информацию из ELF/PE файлов и декодирует супермножество возможных инструкций, создавая начальный набор фактов Datalog. Затем этот набор анализируется, чтобы определить расположение кода, символизацию и границы функций. Уточнённые факты переводятся в промежуточное представление GTIRB, предназначенное для бинарного анализа и реверс-инжиниринга. Через gtirb-pprinter GTIRB превращается в ассемблерный код, который можно собрать заново.

DDisasm поддерживает архитектуры x86_32, x86_64, ARM32, ARM64 и MIPS32. Готовый образ лежит в Docker: grammatech/ddisasm:latest.

Вот как с ним работать. Запускаете контейнер: docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest. Внутри ставите gcc: apt update && apt install gcc -y. Переходите в /examples/ex1 и собираете пример: gcc ex.c -o ex. Затем дизассемблируете бинарник — получаете файл ex.gtirb. С этим представлением можно делать изменения программно: например, через библиотеки GTIRB или gtirb-rewriting. После правок запускаете gtirb-pprinter (он уже есть в Docker-образе):

gtirb-pprinter ex.gtirb -b ex_rewritten

Утилита сама сгенерирует ассемблерный файл и вызовет компилятор или ассемблер (например, gcc), подобрав все необходимые опции: параметры компиляции, библиотечные зависимости, version linker scripts. Если нужно вручную поправить ассемблерный листинг, можно сначала получить его:

gtirb-pprinter ex.gtirb --asm ex.s

А затем собрать вручную:

gcc -nostartfiles ex.s -o ex_rewritten

В разработке участвовали группа Programming Language Group из Сиднейского университета (добавила начальную поддержку ARM64) и пользователь GitHub gogo2464 (рефакторинг документации). Научная основа описана в статьях: Datalog Disassembly (USENIX Security 2020, Антонио Флорес-Монтойя и Эрик Шульте), GTIRB (arXiv:1907.02859) и Ddisasm WIS (IEEE Symposium on Security and Privacy 2025) — там дизассемблирование рассматривается как взвешенное интервальное планирование с обученными весами.

Читать оригинал →