
Ferramenta de recuperação de tipos baseada em N-gram para binários, recuperando estruturas e assinaturas de funções de código descompilado com alta vazão e pontuações de confiança acionáveis para pipelines automatizados.
Apresentamos o XTRIDE, uma abordagem melhorada baseada em n-gramas (cf. STRIDE) para recuperação de tipos em binários que foca na praticidade:
taxa de transferência altamente otimizada e pontuações de confiança acionáveis permitem implantação em pipelines automatizados.
Quando comparado ao estado da arte em recuperação de structs, nosso método atinge desempenho comparável enquanto é entre 70 e 2300 vezes mais rápido.
A ferramenta CLI em ./bin requer uma biblioteca da versão 1.8.4 ou posterior para hdf5 instalada (conforme a documentação do crate).
Compilar com a versão mais recente falha no MacOS, recomendamos instalar hdf5 v1.10, por exemplo, com
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 executar recuperação de tipo de melhor esforço em uma única listagem de função descompilada (entrada de texto simples).
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>: caminho explícito do vocabulário de funções (se omitido, recover tenta <vocab_stem>.fn.vocab)--strip: ativa o modo de strip completo legado (compatibilidade reversa com DIRT / STRIDE, use com cautela)--threshold <float>: oculta previsões abaixo do limite de pontuação (1.0 desativa a filtragem)--top-k <int>: número de candidatos mostrados por símbolo (padrão: 5)As pontuações apresentadas são pontuações de classificação no estilo de confiança do pipeline do modelo. Elas são úteis para classificação relativa e filtragem, não probabilidades calibradas. O resumo relata símbolos detectados, símbolos filtrados e símbolos sem saída do modelo.
Incluímos os dados pré-processados para replicar os modelos $XTRIDE_{PLUS}$ descritos em nosso artigo no diretório ./data.
Os arquivos JSONL podem ser usados diretamente para extrair um vocabulário e treinar o modelo (passos 3 em diante, escolha a configuração de 16 bancos de dados em bin/src/db_creation.rs).
Embora o conjunto de dados de treinamento inclua uma grande quantidade de dados de uma ampla variedade de binários, queremos reiterar que a generalizabilidade das abordagens baseadas em n-gramas é limitada.
Recomendamos sempre adicionar amostras específicas do domínio ao conjunto de dados, dependendo de onde você planeja empregar o modelo.
O conjunto de dados fornecido contém amostras que são
Tentar executar inferência em amostras que divergem dessa distribuição provavelmente resultará em previsões inutilizáveis.
Mais informações sobre como extrair dados para novos conjuntos de dados ou para retreinar e avaliar no conjunto de dados DIRT estão incluídas em Documentação de Preparação do Conjunto de Dados.
O módulo retyper apresenta uma implementação de referência para uma integração profunda do sistema de recuperação de tipos XTRIDE com um descompilador.
A funcionalidade está protegida por uma feature flag e pode ser ativada com cargo build --features retyper.
Fazemos uso do framework BIAS da Binarly para análise de programas, que foi publicado como parte do VulHunt. O framework possui um sistema de tipagem expressivo que se integra perfeitamente ao fork do backend do descompilador Ghidra usado para elevar representações internamente recuperadas para pseudo C. Estendemos este fork e sua ffi com interfaces que permitem modificar diretamente os tipos de variáveis no descompilador. Isso permite a aplicação direta de tipos inferidos dentro do contexto do descompilador, incluindo propagação de tipos de campo e similares.
| Antes: | Depois: |
![]() | ![]() |
Para mais informações e exemplos, confira nosso post no blog.
Em geral, qualquer integração com descompilador requer uma camada de tradução de previsões baseadas em texto (do vocabulário) para uma representação específica da ferramenta.
O formato usado no DIRT é expressivo o suficiente para permitir isso, mas requer resolução recursiva de tipos (ex.: em structs) e cálculo manual de offsets e tamanhos (todas as informações necessárias estão lá, incluindo anotações de padding).
Para o módulo retyper, os tipos no vocabulário (e, portanto, no conjunto de dados de treinamento) precisam ser tipos BIAS serializados.
Atualmente, não planejamos publicar um pipeline completo para extração de dados e criação de conjuntos de dados e, portanto, consideramos esta uma implementação de referência em vez de uma prova de conceito completa.
Se você usar o código, técnicas ou resultados fornecidos com este repositório e o artigo correspondente, por favor, cite nosso trabalho da seguinte forma:
@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},
}