
Herramienta de recuperación de tipos basada en n-gramas para binarios, que recupera estructuras y firmas de funciones a partir de código descompilado con alto rendimiento y puntuaciones de confianza procesables para pipelines automatizados.
Presentamos XTRIDE, un enfoque mejorado basado en n-gramas (cf. STRIDE) para la recuperación de tipos en binarios que se centra en la practicidad: un rendimiento altamente optimizado y puntuaciones de confianza procesables permiten su despliegue en pipelines automatizados. En comparación con el estado del arte en recuperación de estructuras, nuestro método logra un rendimiento comparable mientras es entre 70 y 2300 veces más rápido.
La herramienta CLI en ./bin requiere una biblioteca de versión 1.8.4 o posterior para hdf5 instalada (según la documentación de la crate). La compilación con la última versión falla en MacOS, recomendamos instalar hdf5 v1.10, por ejemplo, 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
Use recover para ejecutar una recuperación de tipos de mejor esfuerzo en un listado de función descompilada (entrada de texto plano).
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 <ruta>: ruta explícita del vocabulario de funciones (si se omite, recover intenta <vocab_stem>.fn.vocab)--strip: habilitar el modo de eliminación completa heredado (compatibilidad inversa con DIRT / STRIDE, usar con precaución)--threshold <flotante>: ocultar predicciones por debajo del umbral de puntuación (1.0 desactiva el filtrado)--top-k <entero>: número de candidatos mostrados por símbolo (predeterminado: 5)Las puntuaciones presentadas son puntuaciones de clasificación estilo confianza del pipeline del modelo. Son útiles para clasificación relativa y filtrado, no probabilidades calibradas. El resumen reporta símbolos detectados, símbolos filtrados y símbolos sin salida del modelo.
Incluimos los datos preprocesados para replicar los modelos $XTRIDE_{PLUS}$ descritos en nuestro artículo en el directorio ./data.
Los archivos JSONL se pueden usar directamente para extraer un vocabulario y entrenar el modelo (pasos 3 en adelante, elija la configuración de 16 bases de datos en bin/src/db_creation.rs).
Si bien el conjunto de datos de entrenamiento incluye una gran cantidad de datos de una amplia variedad de binarios, queremos reiterar que la generalizabilidad de los enfoques basados en n-gramas es limitada. Siempre recomendamos agregar muestras específicas del dominio al conjunto de datos, según dónde planee emplear el modelo.
El conjunto de datos proporcionado contiene muestras que están
Intentar ejecutar inferencia en muestras que se desvíen de esta distribución probablemente resultará en predicciones inutilizables.
Más información sobre cómo extraer datos para nuevos conjuntos de datos o para reentrenar y evaluar en el conjunto de datos DIRT se incluye en Documentos de Preparación del Conjunto de Datos.
El módulo retyper muestra una implementación de referencia para una integración profunda del sistema de recuperación de tipos XTRIDE con un descompilador. La funcionalidad está protegida detrás de un flag de característica y se puede activar con cargo build --features retyper.
Hacemos uso del framework BIAS de Binarly para análisis de programas que fue publicado como parte de VulHunt. El framework cuenta con un sistema de tipificación expresivo que se integra perfectamente con el fork del backend del descompilador de Ghidra que se utiliza para elevar las representaciones recuperadas internamente a pseudo C. Extendimos este fork y su ffi con interfaces que permiten modificar directamente los tipos de variables en el descompilador. Esto permite la aplicación directa de tipos inferidos dentro del contexto del descompilador, incluyendo la propagación de tipos de campos y similares.
| Antes: | Después: |
![]() | ![]() |
Para más información y ejemplos, consulte nuestra publicación en el blog.
En general, cualquier integración con descompilador requiere una capa de traducción desde predicciones basadas en texto (del vocabulario) a una representación específica de la herramienta. El formato utilizado en DIRT es lo suficientemente expresivo para permitir esto, pero requiere resolución recursiva de tipos (por ejemplo, en estructuras) y cálculo manual de offsets y tamaños (toda la información necesaria está ahí, incluidas anotaciones de relleno). Para el módulo retyper, los tipos en el vocabulario (y por lo tanto, en el conjunto de datos de entrenamiento) deben ser tipos BIAS serializados. Actualmente no planeamos publicar un pipeline completo para la extracción de datos y creación de conjuntos de datos, por lo que consideramos esto una implementación de referencia más que una prueba de concepto completa.
Si utiliza el código, las técnicas o los resultados proporcionados con este repositorio y el artículo correspondiente, cite nuestro trabajo de la siguiente manera:
@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},
}