
Дисассемблер на основе Datalog, создающий повторно собираемый ассемблер из ELF/PE-бинарных файлов, с промежуточным представлением GTIRB для анализа и перезаписи бинарного кода в архитектурах x86, ARM и MIPS.
DDisasm — это быстрый дизассемблер, достаточно точный для того, чтобы полученный ассемблерный код можно было повторно собрать. DDisasm реализован с использованием декларативного языка логического программирования datalog (souffle) для компиляции правил и эвристик дизассемблирования. Дизассемблер сначала анализирует информацию из ELF/PE-файлов и декодирует надмножество возможных инструкций для создания начального набора фактов datalog. Эти факты анализируются для выявления расположения кода, символизации и границ функций. Результаты этого анализа — уточнённый набор фактов datalog — затем преобразуются в промежуточное представление GTIRB для двоичного анализа и обратной разработки. Затем можно использовать pretty printer GTIRB для форматированного вывода GTIRB в пересобираемый ассемблерный код.
Поддерживаемые форматы:
Архитектуры набора команд (ISA):
Вы можете запустить предварительно собранную версию Ddisasm с помощью Docker:
docker pull grammatech/ddisasm:latest
Ddisasm можно использовать для дизассемблирования бинарного файла в представление GTIRB. Мы можем попробовать это на одном из примеров, включённых в репозиторий.
Сначала запустите контейнер Ddisasm Docker:
docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest
Внутри контейнера Docker соберём один из примеров:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex
Теперь можно приступить к дизассемблированию:
ddisasm ex --ir ex.gtirb
После получения представления GTIRB вы можете программно изменять бинарный файл с помощью GTIRB или gtirb-rewriting.
Затем можно использовать gtirb-pprinter (входит в образ Docker) для создания новой версии бинарного файла:
gtirb-pprinter ex.gtirb -b ex_rewritten
Внутри gtirb-pprinter сгенерирует ассемблерный файл и вызовет компилятор/ассемблер (например, gcc) для создания нового бинарного файла. gtirb-pprinter сам позаботится о генерации всех необходимых параметров командной строки для создания нового бинарного файла, включая параметры компиляции, зависимости библиотек или скрипты компоновщика версий.
Вы также можете использовать gtirb-pprinter для создания листинга на ассемблере для ручного редактирования:
gtirb-pprinter ex.gtirb --asm ex.s
Этот листинг затем можно вручную перекомпилировать:
gcc -nostartfiles ex.s -o ex_rewritten
Пожалуйста, ознакомьтесь с нашей документацией для получения дополнительной информации.
См. CONTRIBUTING.md
@inproceedings {flores-montoya2020,
author = {Antonio Flores-Montoya and Eric Schulte},
title = {Datalog Disassembly},
booktitle = {29th USENIX Security Symposium (USENIX Security 20)},
year = {2020},
isbn = {978-1-939133-17-5},
pages = {1075--1092},
url = {https://www.usenix.org/conference/usenixsecurity20/presentation/flores-montoya},
publisher = {USENIX Association},
month = aug,
}
@misc{schulte2020gtirb,
title={GTIRB: Intermediate Representation for Binaries},
author={Eric Schulte and Jonathan Dorn and Antonio Flores-Montoya and Aaron Ballman and Tom Johnson},
year={2020},
eprint={1907.02859},
archivePrefix={arXiv},
primaryClass={cs.PL}
}
@INPROCEEDINGS{11023516,
author={Flores-Montoya, Antonio and Lim, Junghee and Seitz, Adam and Sood, Akshay and Raff, Edward and Holt, James},
booktitle={2025 IEEE Symposium on Security and Privacy (SP)},
title={Disassembly as Weighted Interval Scheduling with Learned Weights},
year={2025},
volume={},
number={},
pages={3033-3050},
keywords={Measurement;Privacy;Accuracy;Heuristic algorithms;Reverse engineering;Binary codes;Benchmark testing;Scheduling;Inference algorithms;Security;disassembly;reverse engineering;learning;binary analysis},
doi={10.1109/SP61157.2025.00192}}