
Datalog-basierter Disassembler, der aus ELF/PE-Binärdateien reassemblierbare Assembly erzeugt, mit GTIRB-Zwischendarstellung für Binäranalyse und -umschreibung auf x86-, ARM- und MIPS-Architekturen.
DDisasm ist ein schneller Disassembler, der genau genug ist, um den resultierenden Assemblercode reassemblieren zu können. DDisasm ist mit der deklarativen Logikprogrammiersprache Datalog (souffle) implementiert, um Disassemblierungsregeln und Heuristiken zu kompilieren. Der Disassembler parst zunächst ELF-/PE-Dateiinformationen und dekodiert eine Obermenge möglicher Instruktionen, um einen initialen Satz von Datalog-Fakten zu erstellen. Diese Fakten werden analysiert, um Code-Standorte, Symbolisierung und Funktionsgrenzen zu identifizieren. Die Ergebnisse dieser Analyse – ein verfeinerter Satz von Datalog-Fakten – werden dann in die Zwischendarstellung GTIRB für Binäranalyse und Reverse Engineering übersetzt. Der GTIRB Pretty Printer kann dann verwendet werden, um das GTIRB in reassemblierbaren Assemblercode zu pretty-printen.
Binärformate:
Befehlssatzarchitekturen (ISAs):
Sie können eine vorgefertigte Version von Ddisasm mit Docker ausführen:
docker pull grammatech/ddisasm:latest
Ddisasm kann verwendet werden, um eine Binärdatei in die GTIRB-Darstellung zu disassemblieren. Wir können es mit einem der im Repository enthaltenen Beispiele versuchen.
Starten Sie zunächst den Ddisasm-Docker-Container:
docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest
Erstellen wir innerhalb des Docker-Containers eines der Beispiele:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex
Nun können wir mit der Disassemblierung der Binärdatei fortfahren:
ddisasm ex --ir ex.gtirb
Sobald Sie die GTIRB-Darstellung haben, können Sie programmatische Änderungen an der Binärdatei vornehmen, indem Sie GTIRB oder gtirb-rewriting verwenden.
Anschließend können Sie gtirb-pprinter (im Docker-Image enthalten) verwenden, um eine neue Version der Binärdatei zu erstellen:
gtirb-pprinter ex.gtirb -b ex_rewritten
Intern erzeugt gtirb-pprinter eine Assemblerdatei und ruft den Compiler/Assembler (z.B. gcc) auf, um eine neue Binärdatei zu erstellen. gtirb-pprinter kümmert sich um die Generierung aller notwendigen Befehlszeilenoptionen zur Erstellung einer neuen Binärdatei, einschließlich Kompilierungsoptionen, Bibliotheksabhängigkeiten oder Version-Linker-Skripten.
Sie können gtirb-pprinter auch verwenden, um eine Assemblerauflistung zur manuellen Änderung zu erstellen:
gtirb-pprinter ex.gtirb --asm ex.s
Diese Assemblerauflistung kann dann manuell neu kompiliert werden:
gcc -nostartfiles ex.s -o ex_rewritten
Bitte werfen Sie einen Blick in unsere Dokumentation für weitere Informationen.
Siehe 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}}