DDisasm is een snelle disassembler die gebruikmaakt van de declaratieve logische programmeertaal Datalog (Soufflé) om disassembly-regels en heuristieken te compileren. Het proces werkt door informatie uit ELF- en PE-bestanden te parsen, deze via analyse te verfijnen tot Datalog-feiten, en deze vervolgens te vertalen naar de GTIRB-tussenrepresentatie (intermediate representation).
Belangrijkste kenmerken:
- Ondersteunde architecturen: x8632, x8664, ARM32, ARM64 en MIPS32.
- Bestandsformaten: Ondersteuning voor Linux (ELF) en Windows (PE).
- Workflow: De tool kan via Docker worden gebruikt. Na disassembly naar GTIRB kunnen gebruikers programmatische wijzigingen aanbrengen via
gtirb-rewriting en met gtirb-pprinter nieuwe binaries of assembly-overzichten genereren.
Het project is stevig geworteld in academisch onderzoek naar binaire analyse en security, zoals blijkt uit de referenties naar USENIX Security en IEEE Symposium on Security and Privacy.
Datalog Disassembly (DDisasm)
De disassembler parseert eerst informatie uit ELF/PE-bestanden en decodeert een superset van mogelijke instructies om een initiële set Datalog-feiten te creëren. Deze feiten worden geanalyseerd om codelocaties, symbolisatie en functiegrenzen te identificeren. De resultaten van deze analyse — een verfijnde set Datalog-feiten — worden vervolgens vertaald naar de GTIRB-tussenrepresentatie (intermediate representation) voor binaire analyse en reverse engineering. De GTIRB pretty printer kan vervolgens worden gebruikt om de GTIRB te converteren naar leesbare, herbruikbare assembly-code.
Ondersteunde Binaries
Bestandsformaten:
Instruction Set Architectures (ISA's):
- x86_32
- x86_64
- ARM32
- ARM64
- MIPS32
Aan de slag
Je kunt een vooraf gebouwde versie van DDisasm draaien met Docker:
docker pull grammatech/ddisasm:latest
DDisasm kan worden gebruikt om een binary te disassembleren naar de GTIRB-representatie. Dit kan worden getest met een van de voorbeelden in de repository.
- Start eerst de DDisasm Docker-container:
``bash docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest ``
- Bouw binnen de Docker-container een van de voorbeelden:
``bash apt update && apt install gcc -y cd /examples/ex1 gcc ex.c -o ex ``
- Disassembleer nu de binary:
``bash ddisasm ex --ir ex.gtirb ``
Zodra je de GTIRB-representatie hebt, kun je programmatische wijzigingen aanbrengen in de binary met behulp van GTIRB of gtirb-rewriting.
Vervolgens kun je gtirb-pprinter (meegeleverd in het Docker-image) gebruiken om een nieuwe versie van de binary te produceren:
gtirb-pprinter ex.gtirb -b ex_rewritten
Intern genereert gtirb-pprinter een assembly-bestand en roept de compiler/assembler aan (bijv. gcc) om een nieuwe binary te produceren. De tool regelt alle nodige opdrachtregelopties, inclusief compilatie-opties, bibliotheekafhankelijkheden of versie-linker scripts.
Je kunt gtirb-pprinter ook gebruiken om een assembly-overzicht te genereren voor handmatige aanpassingen:
gtirb-pprinter ex.gtirb --asm ex.s
Dit assembly-overzicht kan vervolgens handmatig worden gecompileerd:
gcc -nostartfiles ex.s -o ex_rewritten
Bijdragen
Voor informatie over het bijdragen aan dit project kun je kijken in CONTRIBUTING.md.
Externe bijdragers
- Programming Language Group, The University of Sydney: Initiële ondersteuning voor ARM64.
- GitHub-gebruiker gogo2464: Refactoring van de documentatie.
Referenties
Datalog Disassembly
@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,
}
GTIRB
@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}
}
Ddisasm WIS
@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}}
Datalog Disassembly (DDisasm)
De disassembler parseert eerst informatie uit ELF/PE-bestanden en decodeert een superset van mogelijke instructies om een initiële set Datalog-feiten te creëren. Deze feiten worden geanalyseerd om codelocaties, symbolisatie en functiegrenzen te identificeren. De resultaten van deze analyse — een verfijnde set Datalog-feiten — worden vervolgens vertaald naar de GTIRB-tussenrepresentatie (intermediate representation) voor binaire analyse en reverse engineering. De GTIRB pretty printer kan vervolgens worden gebruikt om de GTIRB te converteren naar leesbare, herbruikbare assembly-code.
Ondersteunde Binaries
Bestandsformaten:
Instruction Set Architectures (ISA's):
- x86_32
- x86_64
- ARM32
- ARM64
- MIPS32
Aan de slag
Je kunt een vooraf gebouwde versie van DDisasm draaien met Docker:
docker pull grammatech/ddisasm:latest
DDisasm kan worden gebruikt om een binary te disassembleren naar de GTIRB-representatie. Dit kan worden getest met een van de voorbeelden in de repository.
- Start eerst de DDisasm Docker-container:
``bash docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest ``
- Bouw binnen de Docker-container een van de voorbeelden:
``bash apt update && apt install gcc -y cd /examples/ex1 gcc ex.c -o ex ``
- Disassembleer nu de binary:
``bash ddisasm ex --ir ex.gtirb ``
Zodra je de GTIRB-representatie hebt, kun je programmatische wijzigingen aanbrengen in de binary met behulp van GTIRB of gtirb-rewriting.
Vervolgens kun je gtirb-pprinter (meegeleverd in het Docker-image) gebruiken om een nieuwe versie van de binary te produceren:
gtirb-pprinter ex.gtirb -b ex_rewritten
Intern genereert gtirb-pprinter een assembly-bestand en roept de compiler/assembler aan (bijv. gcc) om een nieuwe binary te produceren. De tool regelt alle nodige opdrachtregelopties, inclusief compilatie-opties, bibliotheekafhankelijkheden of versie-linker scripts.
Je kunt gtirb-pprinter ook gebruiken om een assembly-overzicht te genereren voor handmatige aanpassingen:
gtirb-pprinter ex.gtirb --asm ex.s
Dit assembly-overzicht kan vervolgens handmatig worden gecompileerd:
gcc -nostartfiles ex.s -o ex_rewritten
Bijdragen
Voor informatie over het bijdragen aan dit project kun je kijken in CONTRIBUTING.md.
Externe bijdragers
- Programming Language Group, The University of Sydney: Initiële ondersteuning voor ARM64.
- GitHub-gebruiker gogo2464: Refactoring van de documentatie.
Referenties
Datalog Disassembly
@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,
}
GTIRB
@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}
}
Ddisasm WIS
@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}}