
N-gramm-basiertes Typwiederherstellungstool für Binärdateien, das Strukturen und Funktionssignaturen aus dekompiliertem Code mit hohem Durchsatz und verwertbaren Konfidenzwerten für automatisierte Pipelines wiederherstellt.
Wir stellen XTRIDE vor, einen verbesserten N-gramm-basierten (vgl. STRIDE) Ansatz zur Typwiederherstellung für Binärdateien, der auf Praktikabilität abzielt: hochoptimierter Durchsatz und verwertbare Konfidenzwerte ermöglichen den Einsatz in automatisierten Pipelines. Im Vergleich zum Stand der Technik bei der Strukturwiederherstellung erreicht unsere Methode eine vergleichbare Leistung bei einer 70- bis 2300-fachen Geschwindigkeit.
Das CLI-Tool in ./bin benötigt eine Bibliothek der Version 1.8.4 oder neuer für hdf5 (gemäß der Crate-Dokumentation). Das Bauen mit der neuesten Version schlägt auf MacOS fehl; wir empfehlen die Installation von hdf5 v1.10, z. B. mit
brew install [email protected]
cargo run --release -- create-dataset -i ../new_dataset/ -o ./
cargo run --release -- build-vocab ./xtride_plus_train.jsonl xtride_plus.vocab -t type
bin/src/db_creation.rs).
cargo run --release -- build-all-dbs -t type -k 5 --flanking -o xtride_plus_dbs/ ./xtride_plus_train.jsonl xtride_plus.vocab
cargo run --release -- evaluate --threshold-sweep ./xtride_plus_test.jsonl xtride_plus.vocab ./out_xtride.json --flanking --db-dir ./xtride_plus_dbs
Verwenden Sie recover, um eine bestmögliche Typwiederherstellung für eine einzelne dekompilierte Funktionsliste (reine Texteingabe) durchzuführen.
var*, param*, stack*, iVar*, sub_*)cargo run --release -- recover ./decompiled_function.c \
--vocab ./xtride_plus.vocab \
--db-dir ./xtride_plus_dbs \
--flanking \
--top-k 5 \
--fn-vocab <pfad>: expliziter Pfad zum Funktionsvokabular (wenn weggelassen, versucht recover <vokabelstamm>.fn.vocab)--strip: aktiviert den veralteten Vollstrip-Modus (Rückwärtskompatibilität mit DIRT / STRIDE, mit Vorsicht verwenden)--threshold <float>: Vorhersagen unterhalb eines Score-Grenzwerts ausblenden (1.0 deaktiviert Filterung)--top-k <int>: Anzahl der pro Symbol angezeigten Kandidaten (Standard: 5)Die angezeigten Scores sind konfidenzartige Ranking-Scores aus der Modellpipeline. Sie sind nützlich für relatives Ranking und Filterung, jedoch keine kalibrierten Wahrscheinlichkeiten. Die Zusammenfassung meldet erkannte Symbole, gefilterte Symbole und Symbole ohne Modellausgabe.
Wir haben die vorbereiteten Daten zur Reproduktion der in unserem Papier beschriebenen $XTRIDE_{PLUS}$-Modelle im Verzeichnis ./data beigelegt.
Die JSONL-Dateien können direkt verwendet werden, um ein Vokabular zu extrahieren und das Modell zu trainieren (Schritte 3 und folgende; wählen Sie die 16-DB-Konfiguration in bin/src/db_creation.rs).
Obwohl der Trainingsdatensatz eine große Menge an Daten aus einer Vielzahl von Binärdateien enthält, möchten wir betonen, dass die Generalisierbarkeit von N-gramm-basierten Ansätzen begrenzt ist.
Wir empfehlen stets, domänenspezifische Stichproben zum Datensatz hinzuzufügen, je nachdem, wo Sie das Modell einsetzen möchten.
Der bereitgestellte Datensatz enthält Stichproben, die
Der Versuch, Inferenz auf Stichproben durchzuführen, die von dieser Verteilung abweichen, wird höchstwahrscheinlich zu unbrauchbaren Vorhersagen führen.
Weitere Informationen zur Datenextraktion für neue Datensätze oder zum erneuten Trainieren und Auswerten des DIRT-Datensatzes finden Sie in der Dataset Preparation Docs.
Das Modul retyper zeigt eine Referenzimplementierung für eine tiefe Integration des XTRIDE-Typwiederherstellungssystems in einen Dekompiler.
Die Funktionalität ist hinter einem Feature-Flag verborgen und kann mit cargo build --features retyper aktiviert werden.
Wir nutzen das BIAS-Framework von Binarly für die Programmanalyse, das im Rahmen von VulHunt veröffentlicht wurde. Das Framework verfügt über ein ausdrucksstarkes Typsystem, das sich nahtlos in den Fork des Ghidra-Dekompiler-Backends integriert, der zur Hebung intern wiederhergestellter Repräsentationen in Pseudocode verwendet wird. Wir haben diesen Fork und sein FFI erweitert mit Schnittstellen, die es erlauben, Variablentypen direkt im Dekompiler zu ändern. Dies ermöglicht die direkte Anwendung abgeleiteter Typen im Dekompiler-Kontext, einschließlich der Propagation von Feldtypen und Ähnlichem.
| Vorher: | Nachher: |
![]() | ![]() |
Weitere Informationen und Beispiele finden Sie in unserem Blogbeitrag.
Generell erfordert jede Dekompiler-Integration eine Übersetzungsschicht von textbasierten Vorhersagen (aus dem Vokabular) in eine werkzeugspezifische Repräsentation.
Das in DIRT verwendete Format ist ausdrucksstark genug, um dies zu ermöglichen, erfordert aber rekursive Auflösung von Typen (z. B. in Strukturen) und manuelle Berechnung von Offsets und Größen (alle notwendigen Informationen sind vorhanden, inklusive Padding-Anmerkungen).
Für das Modul retyper wird erwartet, dass die Typen im Vokabular (und somit im Trainingsdatensatz) als BIAS-Typen serialisiert sind.
Wir planen derzeit nicht, eine vollständige Pipeline zur Datenextraktion und Datensatzerstellung zu veröffentlichen, und betrachten dies daher eher als Referenzimplementierung denn als vollständigen PoC.
Wenn Sie den Code, die Techniken oder die Ergebnisse aus diesem Repository und dem zugehörigen Papier verwenden, zitieren Sie bitte unsere Arbeit wie folgt:
@inproceedings{Seidel_Practical_Type_Inference_2026,
author = {Seidel, Lukas and Thomas, Sam L. and Rieck, Konrad},
title = {{Practical Type Inference: High-Throughput Recovery of Real-World Structures and Function Signatures}},
series = {The 16th ACM Conference on Data and Application Security and Privacy},
month = jun,
year = {2026},
url = {https://arxiv.org/abs/2603.08225},
}