
Desmontador baseado em Datalog que produz código de montagem remontável a partir de binários ELF/PE, com representação intermediária GTIRB para análise e reescrita de binários nas arquiteturas x86, ARM e MIPS.
DDisasm é um desmontador rápido que é preciso o suficiente para que o código de montagem resultante possa ser remontado. DDisasm é implementado usando a linguagem de programação lógica declarativa datalog (souffle) para compilar regras e heurísticas de desmontagem. O desmontador primeiro analisa informações de arquivos ELF/PE e decodifica um superconjunto de instruções possíveis para criar um conjunto inicial de fatos datalog. Esses fatos são analisados para identificar localização de código, simbolização e limites de função. Os resultados desta análise, um conjunto refinado de fatos datalog, são então traduzidos para a representação intermediária GTIRB para análise binária e engenharia reversa. O pretty printer do GTIRB pode então ser usado para imprimir o GTIRB de forma legível para código de montagem remontável.
Formatos binários:
Arquiteturas de Conjunto de Instruções (ISAs):
Você pode executar uma versão pré-construída do Ddisasm usando Docker:
docker pull grammatech/ddisasm:latest
Ddisasm pode ser usado para desmontar um binário na representação GTIRB. Podemos testá-lo com um dos exemplos incluídos no repositório.
Primeiro, inicie o container Docker do Ddisasm:
docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest
Dentro do container Docker, vamos construir um dos exemplos:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex
Agora podemos proceder para desmontar o binário:
ddisasm ex --ir ex.gtirb
Depois de ter a representação GTIRB, você pode fazer alterações programáticas no binário usando GTIRB ou gtirb-rewriting.
Então, você pode usar gtirb-pprinter (incluído na imagem Docker) para produzir uma nova versão do binário:
gtirb-pprinter ex.gtirb -b ex_rewritten
Internamente, gtirb-pprinter irá gerar um arquivo de montagem e invocar o compilador/montador (ex.: gcc) para produzir um novo binário. gtirb-pprinter cuidará de gerar todas as opções de linha de comando necessárias para gerar um novo binário, incluindo opções de compilação, dependências de bibliotecas ou scripts de linker de versão.
Você também pode usar gtirb-pprinter para gerar uma listagem de montagem para modificação manual:
gtirb-pprinter ex.gtirb --asm ex.s
Esta listagem de montagem pode então ser recompilada manualmente:
gcc -nostartfiles ex.s -o ex_rewritten
Por favor, dê uma olhada em nossa documentação para informações adicionais.
Veja 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}}