
Désassembleur basé sur Datalog produisant un assemblage réassemblable à partir de binaires ELF/PE, avec représentation intermédiaire GTIRB pour l'analyse et la réécriture de binaires sur les architectures x86, ARM et MIPS.
DDisasm est un désassembleur rapide suffisamment précis pour que le code assembleur résultant puisse être réassemblé. DDisasm est implémenté en utilisant le langage de programmation logique déclarative datalog (souffle) pour compiler des règles et des heuristiques de désassemblage. Le désassembleur analyse d'abord les informations de fichiers ELF/PE et décode un sur-ensemble d'instructions possibles pour créer un ensemble initial de faits datalog. Ces faits sont analysés pour identifier l'emplacement du code, la symbolisation et les limites des fonctions. Les résultats de cette analyse, un ensemble raffiné de faits datalog, sont ensuite traduits vers la représentation intermédiaire GTIRB pour l'analyse binaire et le rétro-ingénierie. Le pretty printer GTIRB peut ensuite être utilisé pour afficher joliment le GTIRB en code assembleur réassemblable.
Formats binaires :
Architectures de jeux d'instructions (ISA) :
Vous pouvez exécuter une version préconstruite de Ddisasm en utilisant Docker :
docker pull grammatech/ddisasm:latest
Ddisasm peut être utilisé pour désassembler un binaire vers la représentation GTIRB. Nous pouvons l'essayer avec l'un des exemples inclus dans le dépôt.
D'abord, démarrez le conteneur Docker Ddisasm :
docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest
Dans le conteneur Docker, construisons l'un des exemples :
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex
Nous pouvons maintenant procéder au désassemblage du binaire :
ddisasm ex --ir ex.gtirb
Une fois que vous avez la représentation GTIRB, vous pouvez effectuer des modifications programmatiques du binaire en utilisant GTIRB ou gtirb-rewriting.
Ensuite, vous pouvez utiliser gtirb-pprinter (inclus dans l'image Docker) pour produire une nouvelle version du binaire :
gtirb-pprinter ex.gtirb -b ex_rewritten
En interne, gtirb-pprinter générera un fichier assembleur et invoquera le compilateur/assembleur (par exemple gcc) pour produire un nouveau binaire. gtirb-pprinter se chargera de générer toutes les options de ligne de commande nécessaires pour produire un nouveau binaire, y compris les options de compilation, les dépendances de bibliothèques ou les scripts de l'éditeur de liens de version.
Vous pouvez également utiliser gtirb-pprinter pour générer une liste d'assembleur pour modification manuelle :
gtirb-pprinter ex.gtirb --asm ex.s
Cette liste d'assembleur peut ensuite être recompilée manuellement :
gcc -nostartfiles ex.s -o ex_rewritten
Veuillez consulter notre documentation pour plus d'informations.
Voir 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}}