XDA — это инструмент для дизассемблирования инструкций и восстановления функциональных границ удаленных двоичных файлов. Он основан на трансферном обучении с использованием кодировщика Transformer с целью моделирования замаскированного языка [1, 2, 3]. Он превосходит современные инструменты (например, IDA Pro, Ghidra и двунаправленный RNN [4]). Подробности можно найти в нашей статье: XDA: Точная, надежная дизассемблирование с трансферным обучением.
@inproceedings{pei2021xda,
title={XDA: Accurate, Robust Disassembly with Transfer Learning},
author={Pei, Kexin and Guan, Jonas and King, David Williams and Yang, Junfeng and Jana, Suman},
year={2021},
booktitle={Proceedings of the 2021 Network and Distributed System Security Symposium (NDSS)}
}
Мы рекомендуем использовать conda
для настройки среды и установки необходимых пакетов.
Сначала создайте среду conda,
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
и активируйте среду conda:
conda activate xda
Затем установите последнюю версию Pytorch (предположим, что у вас есть графический процессор):
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
Наконец, введите корневой каталог xda: например, path/to/xda
и установите XDA:
pip install --editable .
Создайте checkpoints
и подкаталог checkpoints/pretrain_all
в path/to/xda
mkdir -p checkpoints/pretrain_all
Загрузите наши предварительно обученные параметры веса и поместите их в checkpoints/pretrain_all
Мы также предоставляем настроенную модель, с помощью которой вы можете напрямую играть на восстановлении границ функций. Точно настроенная модель обучается на двоичных файлах, скомпилированных MSVC x64. Создайте подкаталог checkpoints/finetune_msvs_funcbound_64
в path/to/xda
mkdir -p checkpoints/finetune_msvs_funcbound_64
Загрузите наши настроенные параметры веса и поместите их в checkpoints/finetune_msvs_funcbound_64
.
Мы поместили некоторые образцы данных из корпуса BAP, скомпилированные MSVC x64, в data-raw/msvs_funcbound_64_bap_test
. В файлах данных есть два столбца. Первый столбец — это все необработанные байты двоичного файла, а второй столбец — это метка, указывающая, что это начало функции (F), конец функции (R) или ни то, ни другое.
Чтобы предсказать границу функции в этих файлах, запустите:
python scripts/play/play_func_bound.py
Эти сценарии будут загружать точно настроенные веса, которые вы указали в checkpoints/finetune_msvs_funcbound_64
и прогнозировать границы функции. Его также можно будет сравнить с фактическими данными и результатами IDA.
Мы предоставляем образцы файлов обучения/тестирования предварительной подготовки и точной настройки в data-src/
data-src/pretrain_all
содержит образцы необработанных байтов из очищенных двоичных файлов для предварительного обучения.data-src/funcbound
содержит образцы необработанных байтов с границами функций. Мы уже предоставили предварительно обученные модели для огромного количества двоичных файлов. Но если вы хотите предварительно обучить собранные вами данные, вы можете подготовить примеры файлов, аналогичные формату data-src/pretrain_all
(объединить все байты из всех двоичных файлов и разделить их новой строкой n
чтобы убедиться, что каждая строка не превышать максимальную длину, которую допускает модель). Аналогично, если вы хотите подготовить данные для точной настройки самостоятельно, убедитесь, что вы следуете формату, указанному в data-src/funcbound
.
Нам нужно бинаризировать данные, чтобы подготовить их к обучению. Чтобы бинаризировать данные обучения для предварительного обучения, запустите:
./scripts/pretrain/preprocess-pretrain-all.sh
Бинаризированные данные обучения, готовые к предварительному обучению, будут храниться в data-bin/pretrain_all
Чтобы бинаризировать данные обучения для точной настройки, запустите:
./scripts/finetune/preprocess.sh
Бинаризованные данные обучения, готовые для точной настройки (для границы функции), будут храниться в data-bin/funcbound
Если вы используете свои собственные проанализированные двоичные файлы для предварительного обучения и уже бинаризовали их в data-bin/pretrain_all
, запустите:
./scripts/pretrain/pretrain-all.sh
Для точной настройки модели выполните:
./scripts/finetune/finetune.sh
Скрипты загружают предварительно обученные параметры веса из checkpoints/pretrain_all/
и настраивают модель.
birnn/
Для оценки скорости я разместил скрипт по адресу https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
.
[1] Васвани, Ашиш и др. «Внимание — это все, что вам нужно». Достижения в области нейронных систем обработки информации. 2017.
[2] Девлин, Джейкоб и др. «Берт: Предварительная подготовка глубоких двунаправленных преобразователей для понимания языка». Препринт arXiv arXiv:1810.04805 (2018).
[3] Лю, Иньхан и др. «Роберта: тщательно оптимизированный подход к предварительной тренировке Берта». Препринт arXiv arXiv:1907.11692 (2019).
[4] Шин, Юй Чул Ричард, Дон Сонг и Реза Моаццези. «Распознавание функций в двоичных файлах с помощью нейронных сетей». 24-й симпозиум USENIX по безопасности. 2015.