
Strumento di recupero dei tipi basato su N-gram per binari, che recupera strutture e firme di funzioni da codice decompilato con alta resa e punteggi di confidenza utilizzabili per pipeline automatizzate.
Presentiamo XTRIDE, un approccio migliorato basato su n-grammi (cfr. STRIDE) per il recupero dei tipi nei binari, focalizzato sulla praticità: un throughput altamente ottimizzato e punteggi di confidenza utilizzabili ne consentono l'implementazione in pipeline automatizzate. Rispetto allo stato dell'arte nel recupero delle struct, il nostro metodo raggiunge prestazioni comparabili pur essendo da 70 a 2300 volte più veloce.
Lo strumento CLI in ./bin richiede una libreria di versione 1.8.4 o successiva per hdf5 installata (come da documentazione del crate). La compilazione con l'ultima versione fallisce su MacOS, raccomandiamo di installare hdf5 v1.10, ad esempio con
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
Usa recover per eseguire il recupero dei tipi (best-effort) su un singolo elenco di funzioni decompilate (input in testo semplice).
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>: percorso esplicito del vocabolario delle funzioni (se omesso, recover prova <vocab_stem>.fn.vocab)--strip: abilita la modalità legacy di strip completa (retrocompatibilità DIRT / STRIDE, usare con cautela)--threshold <float>: nasconde le previsioni al di sotto del cutoff del punteggio (1.0 disabilita il filtraggio)--top-k <int>: numero di candidati mostrati per simbolo (default: 5)I punteggi presentati sono punteggi di ranking in stile confidenza dalla pipeline del modello. Sono utili per ranking relativo e filtraggio, non sono probabilità calibrate. Il riepilogo riporta i simboli rilevati, i simboli filtrati e i simboli senza output del modello.
Includiamo i dati preprocessati per replicare i modelli $XTRIDE_{PLUS}$ descritti nel nostro articolo nella directory ./data. I file JSONL possono essere utilizzati direttamente per estrarre un vocabolario e addestrare il modello (passaggi 3 e successivi, scegliere la configurazione a 16 db in bin/src/db_creation.rs). Sebbene il dataset di addestramento includa una grande quantità di dati provenienti da un'ampia varietà di binari, vogliamo ribadire che la generalizzabilità degli approcci basati su n-grammi è limitata. Raccomandiamo sempre di aggiungere campioni specifici del dominio al dataset, a seconda di dove si prevede di impiegare il modello.
Il dataset fornito contiene campioni che sono
Tentare di eseguire l'inferenza su campioni che divergono da questa distribuzione molto probabilmente produrrà previsioni inutilizzabili.
Ulteriori informazioni su come estrarre dati per nuovi dataset o per riaddestrare e valutare sul dataset DIRT sono incluse in Documentazione Preparazione Dataset.
Il modulo retyper mostra un'implementazione di riferimento per un'integrazione profonda del sistema di recupero dei tipi XTRIDE con un decompilatore. La funzionalità è protetta da un feature flag e può essere attivata con cargo build --features retyper.
Utilizziamo il framework BIAS di Binarly per l'analisi dei programmi, pubblicato come parte di VulHunt. Il framework presenta un sistema di tipi espressivo che si integra perfettamente con il fork del backend del decompilatore Ghidra utilizzato per sollevare le rappresentazioni recuperate internamente in pseudo C. Abbiamo esteso questo fork e la sua ffi con interfacce che consentono di modificare direttamente i tipi delle variabili nel decompilatore. Ciò consente l'applicazione diretta dei tipi inferiti nel contesto del decompilatore, inclusa la propagazione dei tipi di campo e simili.
| Prima: | Dopo: |
![]() | ![]() |
Per ulteriori informazioni ed esempi, consulta il nostro post sul blog.
In generale, qualsiasi integrazione con un decompilatore richiede un livello di traduzione dalle previsioni testuali (dal vocabolario) a una rappresentazione specifica dello strumento. Il formato utilizzato in DIRT è abbastanza espressivo da consentirlo, ma richiede la risoluzione ricorsiva dei tipi (ad esempio, nelle struct) e il calcolo manuale di offset e dimensioni (tutte le informazioni necessarie sono presenti, incluse le annotazioni di padding). Per il modulo retyper, i tipi nel vocabolario (e quindi nel dataset di addestramento) devono essere serializzati tipi BIAS. Al momento non prevediamo di pubblicare una pipeline completa per l'estrazione dei dati e la creazione del dataset, e pertanto riteniamo che questa sia un'implementazione di riferimento piuttosto che un PoC completo.
Se utilizzi il codice, le tecniche o i risultati forniti con questo repository e il relativo articolo, ti preghiamo di citare il nostro lavoro come segue:
@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},
}