
Инструмент восстановления типов на основе N-грамм для бинарных файлов, восстанавливающий структуры и сигнатуры функций из декомпилированного кода с высокой пропускной способностью и действенными оценками уверенности для автоматизированных конвейеров.
Мы представляем XTRIDE, улучшенный подход на основе n-грамм (ср. STRIDE) к восстановлению типов для бинарных файлов, ориентированный на практичность: высокая оптимизированная пропускная способность и применимые оценки уверенности позволяют развертывание в автоматизированных конвейерах. По сравнению с современным уровнем восстановления структур, наш метод достигает сравнимой производительности, будучи при этом в 70–2300 раз быстрее.
Инструмент CLI в ./bin требует установки библиотеки версии 1.8.4 или новее для hdf5 (согласно документации крейта). Сборка с последней версией не удается на MacOS, мы рекомендуем установить hdf5 v1.10, например, с помощью
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
Используйте recover для запуска восстановления типов с максимальной отдачей на одном листинге декомпилированной функции (ввод в виде обычного текста).
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 <путь>: явный путь к словарю функций (если опущен, recover пытается использовать <vocab_stem>.fn.vocab)--strip: включить устаревший полный режим strip (обратная совместимость с DIRT / STRIDE, используйте с осторожностью)--threshold <число с плавающей точкой>: скрывать прогнозы ниже порога оценки (1.0 отключает фильтрацию)--top-k <целое>: количество кандидатов, показываемых на символ (по умолчанию: 5)Представленные оценки — это ранжирующие оценки в стиле уверенности из конвейера модели. Они полезны для относительного ранжирования и фильтрации, а не для калиброванных вероятностей. В сводке сообщается об обнаруженных символах, отфильтрованных символах и символах без вывода модели.
Мы включаем предварительно обработанные данные для воспроизведения моделей $XTRIDE_{PLUS}$, описанных в нашей статье, в каталог ./data. Файлы JSONL можно напрямую использовать для извлечения словаря и обучения модели (шаги 3 и далее, выберите конфигурацию с 16 базами данных в bin/src/db_creation.rs). Хотя обучающий набор данных включает большой объем данных из множества различных бинарных файлов, мы хотим еще раз подчеркнуть, что обобщаемость подходов на основе n-грамм ограничена. Мы всегда рекомендуем добавлять в набор данных образцы из конкретной предметной области, в зависимости от того, где вы планируете применять модель.
Предоставленный набор данных содержит образцы, которые
Попытка выполнить вывод на образцах, которые отклоняются от этого распределения, скорее всего, приведет к непригодным для использования прогнозам.
Дополнительная информация о том, как извлекать данные для новых наборов данных или переобучать и оценивать на наборе данных DIRT, включена в документацию по подготовке наборов данных.
Модуль retyper демонстрирует эталонную реализацию глубокой интеграции системы восстановления типов XTRIDE с декомпилятором. Функциональность отключена за флагом функции и может быть активирована с помощью cargo build --features retyper.
Мы используем фреймворк BIAS от Binarly для анализа программ, который был опубликован в рамках VulHunt. Фреймворк включает выразительную систему типов, которая бесшовно интегрируется с форком бэкенда декомпилятора Ghidra, используемым для подъема внутренне восстановленных представлений в псевдо-C. Мы расширили этот форк и его FFI с помощью интерфейсов, которые позволяют напрямую изменять типы переменных в декомпиляторе. Это позволяет напрямую применять выведенные типы в контексте декомпилятора, включая распространение типов полей и тому подобное.
| До: | После: |
![]() | ![]() |
Для получения дополнительной информации и примеров ознакомьтесь с нашим сообщением в блоге.
В целом, любая интеграция с декомпилятором требует уровня перевода от текстовых прогнозов (из словаря) к представлению, специфичному для инструмента. Формат, используемый в DIRT, достаточно выразителен для этого, но требует рекурсивного разрешения типов (например, в структурах) и ручного вычисления смещений и размеров (вся необходимая информация есть, включая аннотации заполнения). Для модуля retyper требуется, чтобы типы в словаре (и, следовательно, в обучающем наборе данных) были сериализованными типами BIAS. В настоящее время мы не планируем публиковать полный конвейер для извлечения данных и создания наборов данных, поэтому считаем эту реализацию скорее эталонной, чем полноценным подтверждением концепции.
Если вы используете код, методы или результаты, предоставленные с этим репозиторием и соответствующей статьей, пожалуйста, цитируйте нашу работу следующим образом:
@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},
}