
Disassemblatore basato su Datalog che produce assembly riassemblabile da binari ELF/PE, con rappresentazione intermedia GTIRB per analisi e riscrittura binaria su architetture x86, ARM e MIPS.
DDisasm è un disassemblatore veloce abbastanza accurato da permettere che il codice assembly risultante possa essere riassemblato. DDisasm è implementato utilizzando il linguaggio di programmazione logica dichiarativa datalog (souffle) per compilare regole e euristiche di disassemblaggio. Il disassemblatore prima analizza le informazioni dei file ELF/PE e decodifica un superset di possibili istruzioni per creare un insieme iniziale di fatti datalog. Questi fatti vengono analizzati per identificare posizione del codice, simbolizzazione e confini delle funzioni. I risultati di questa analisi, un insieme raffinato di fatti datalog, vengono poi tradotti nella rappresentazione intermedia GTIRB per l'analisi binaria e il reverse engineering. Il pretty printer GTIRB può quindi essere utilizzato per stampare il GTIRB in codice assembly riassemblabile.
Formati binari:
Architetture di set di istruzioni (ISA):
È possibile eseguire una versione precompilata di Ddisasm usando Docker:
docker pull grammatech/ddisasm:latest
Ddisasm può essere utilizzato per disassemblare un binario nella rappresentazione GTIRB. Possiamo provarlo con uno degli esempi inclusi nel repository.
Per prima cosa, avviare il container Docker di Ddisasm:
docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest
All'interno del container Docker, costruiamo uno degli esempi:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex
Ora possiamo procedere al disassemblaggio del binario:
ddisasm ex --ir ex.gtirb
Una volta ottenuta la rappresentazione GTIRB, è possibile apportare modifiche programmatiche al binario usando GTIRB o gtirb-rewriting.
Quindi, è possibile utilizzare gtirb-pprinter (incluso nell'immagine Docker) per produrre una nuova versione del binario:
gtirb-pprinter ex.gtirb -b ex_rewritten
Internamente, gtirb-pprinter genererà un file assembly e invocherà il compilatore/assemblatore (es. gcc) per produrre un nuovo binario. gtirb-pprinter si occuperà di generare tutte le opzioni della riga di comando necessarie per generare un nuovo binario, incluse le opzioni di compilazione, le dipendenze delle librerie o gli script del linker di versione.
È anche possibile usare gtirb-pprinter per generare un elenco assembly per modifiche manuali:
gtirb-pprinter ex.gtirb --asm ex.s
Questo elenco assembly può quindi essere ricompilato manualmente:
gcc -nostartfiles ex.s -o ex_rewritten
Si prega di dare un'occhiata alla nostra documentazione per informazioni aggiuntive.
Vedi 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}}