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:

  • ELF (Linux)
  • PE (Windows)

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.

  1. Start eerst de DDisasm Docker-container:

``bash docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest ``

  1. Bouw binnen de Docker-container een van de voorbeelden:

``bash apt update && apt install gcc -y cd /examples/ex1 gcc ex.c -o ex ``

  1. 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}}