
Outil de récupération de types basé sur N-gram pour binaires, récupérant les structures et les signatures de fonctions à partir de code décompilé avec un haut débit et des scores de confiance exploitables pour les pipelines automatisés.
Nous présentons XTRIDE, une approche améliorée basée sur les N-grammes (cf. STRIDE) pour la récupération de types dans les binaires, qui met l'accent sur l'aspect pratique : un débit hautement optimisé et des scores de confiance exploitables permettent un déploiement dans des pipelines automatisés. Comparée à l'état de l'art en récupération de structures, notre méthode atteint des performances comparables tout en étant entre 70 et 2300 fois plus rapide.
L'outil CLI dans ./bin nécessite une bibliothèque hdf5 version 1.8.4 ou ultérieure installée (selon la documentation de la crate). La compilation avec la dernière version échoue sur MacOS, nous recommandons d'installer hdf5 v1.10, par exemple avec
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
Utilisez recover pour exécuter une récupération de types au mieux sur une seule fonction décompilée (entrée en texte brut).
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 <path>: chemin explicite du vocabulaire des fonctions (si omis, recover essaie <vocab_stem>.fn.vocab)--strip: activer le mode de suppression complète hérité (rétrocompatibilité DIRT / STRIDE, à utiliser avec précaution)--threshold <float>: masquer les prédictions en dessous du seuil de score (1.0 désactive le filtrage)--top-k <int>: nombre de candidats affichés par symbole (par défaut : 5)Les scores présentés sont des scores de classement de type confiance issus du pipeline du modèle. Ils sont utiles pour le classement relatif et le filtrage, mais ne sont pas des probabilités calibrées. Le résumé rapporte les symboles détectés, les symboles filtrés et les symboles sans sortie du modèle.
Nous incluons les données prétraitées pour reproduire les modèles $XTRIDE_{PLUS}$ décrits dans notre article dans le répertoire ./data. Les fichiers JSONL peuvent être utilisés directement pour extraire un vocabulaire et entraîner le modèle (étapes 3 et suivantes, choisissez la configuration 16-db dans bin/src/db_creation.rs). Bien que l'ensemble d'entraînement contienne une grande quantité de données provenant d'une large variété de binaires, nous tenons à réitérer que la généralisabilité des approches basées sur les N-grammes est limitée. Nous recommandons toujours d'ajouter des échantillons spécifiques au domaine à l'ensemble de données, en fonction de l'endroit où vous prévoyez d'utiliser le modèle.
L'ensemble de données fourni contient des échantillons qui sont
Essayer d'exécuter une inférence sur des échantillons qui divergent de cette distribution donnera très probablement des prédictions inutilisables.
Des informations supplémentaires sur la façon d'extraire des données pour de nouveaux ensembles de données ou de réentraîner et évaluer sur l'ensemble de données DIRT sont incluses dans Documentation de préparation des données.
Le module retyper présente une implémentation de référence pour une intégration profonde du système de récupération de types XTRIDE avec un décompilateur. La fonctionnalité est verrouillée derrière un drapeau de fonctionnalité et peut être activée avec cargo build --features retyper.
Nous utilisons le framework BIAS de Binarly pour l'analyse de programmes, publié dans le cadre de VulHunt. Le framework dispose d'un système de typage expressif qui s'intègre de manière transparente avec le fork du backend du décompilateur Ghidra utilisé pour relever les représentations internes récupérées en pseudo C. Nous avons étendu ce fork et son ffi avec des interfaces permettant de modifier directement les types de variables dans le décompilateur. Cela permet l'application directe des types inférés dans le contexte du décompilateur, y compris la propagation des types de champs et autres.
| Avant : | Après : |
![]() | ![]() |
Pour plus d'informations et d'exemples, consultez notre article de blog.
En général, toute intégration de décompilateur nécessite une couche de traduction entre les prédictions textuelles (provenant du vocabulaire) et une représentation spécifique à l'outil. Le format utilisé dans DIRT est suffisamment expressif pour permettre cela, mais nécessite une résolution récursive des types (par exemple, dans les structures) et un calcul manuel des décalages et des tailles (toutes les informations nécessaires sont présentes, y compris les annotations de padding). Pour le module retyper, les types dans le vocabulaire (et donc dans l'ensemble d'entraînement) doivent être des types BIAS sérialisés. Nous ne prévoyons actuellement pas de publier un pipeline complet pour l'extraction de données et la création d'ensembles de données, et considérons donc ceci comme une implémentation de référence plutôt qu'une preuve de concept complète.
Si vous utilisez le code, les techniques ou les résultats fournis avec ce dépôt et l'article correspondant, veuillez citer notre travail comme suit :
@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},
}