XDA es una herramienta para desensamblar instrucciones y recuperar límites de funciones de archivos binarios eliminados. Se basa en el aprendizaje por transferencia utilizando el codificador Transformer con objetivo de modelado de lenguaje enmascarado [1, 2, 3]. Supera a las herramientas de última generación (por ejemplo, IDA Pro, Ghidra y RNN bidireccional [4]). Encuentre los detalles en nuestro documento: XDA: Desmontaje preciso y robusto con aprendizaje por transferencia
@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)}
}
Recomendamos utilizar conda
para configurar el entorno e instalar los paquetes necesarios.
Primero, cree el entorno conda,
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
y activar el entorno conda:
conda activate xda
Luego, instale la última versión de Pytorch (suponga que tiene GPU):
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
Finalmente, ingrese al directorio raíz de xda: por ejemplo, path/to/xda
e instale XDA:
pip install --editable .
Cree los checkpoints
y el subdirectorio checkpoints/pretrain_all
en path/to/xda
mkdir -p checkpoints/pretrain_all
Descargue nuestros parámetros de peso previamente entrenados y colóquelos en checkpoints/pretrain_all
También proporcionamos el modelo ajustado para que pueda jugar directamente en la recuperación de límites de funciones. El modelo ajustado se entrena en binarios compilados por MSVC x64. Cree el subdirectorio checkpoints/finetune_msvs_funcbound_64
en path/to/xda
mkdir -p checkpoints/finetune_msvs_funcbound_64
Descargue nuestros parámetros de peso ajustados y colóquelos en checkpoints/finetune_msvs_funcbound_64
.
Hemos incluido algunos datos de muestra del corpus BAP compilado por MSVC x64 en data-raw/msvs_funcbound_64_bap_test
. Hay dos columnas en los archivos de datos. La primera columna son todos los bytes sin procesar del binario, y la segunda columna es la etiqueta que indica si la función es inicio (F), fin de función (R) o ninguno de los dos.
Para predecir el límite de la función en estos archivos, ejecute:
python scripts/play/play_func_bound.py
Estos scripts cargarán los pesos ajustados que usted puso en checkpoints/finetune_msvs_funcbound_64
y predecirán los límites de la función. También se comparará con la verdad sobre el terreno y los resultados de IDA.
Proporcionamos los archivos de prueba/entrenamiento de muestra de preentrenamiento y ajuste en data-src/
data-src/pretrain_all
contiene los bytes sin procesar de muestra de los binarios eliminados para el entrenamiento previodata-src/funcbound
contiene los bytes sin formato de muestra con límites de función Ya hemos proporcionado modelos previamente entrenados en una gran cantidad de archivos binarios. Pero si desea realizar un entrenamiento previo con sus propios datos recopilados, puede preparar archivos de muestra similares al formato en data-src/pretrain_all
(concatenar todos los bytes de todos los archivos binarios y delimitarlos con una nueva línea n
para asegurarse de que cada línea no exceder la longitud máxima que acepta el modelo). De manera similar, si desea preparar los datos de ajuste usted mismo, asegúrese de seguir el formato que se muestra en data-src/funcbound
.
Tenemos que binarizar los datos para que estén listos para ser entrenados. Para binarizar los datos de entrenamiento para el preentrenamiento, ejecute:
./scripts/pretrain/preprocess-pretrain-all.sh
Los datos de entrenamiento binarios listos para el preentrenamiento se almacenarán en data-bin/pretrain_all
Para binarizar los datos de entrenamiento para realizar ajustes, ejecute:
./scripts/finetune/preprocess.sh
Los datos de entrenamiento binarizados listos para el ajuste fino (para el límite de la función) se almacenarán en data-bin/funcbound
Si está utilizando sus propios archivos binarios analizados para el entrenamiento previo y ya los ha binarizado en data-bin/pretrain_all
, ejecute:
./scripts/pretrain/pretrain-all.sh
Para ajustar el modelo, ejecute:
./scripts/finetune/finetune.sh
Los scripts cargan los parámetros de peso previamente entrenados desde checkpoints/pretrain_all/
y ajustan el modelo.
birnn/
Para evaluar la velocidad, puse un script en https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
[1] Vaswani, Ashish y otros. "Atención es todo lo que necesitas." Avances en los sistemas de procesamiento de información neuronal. 2017.
[2] Devlin, Jacob, et al. "Bert: Entrenamiento previo de transformadores bidireccionales profundos para la comprensión del lenguaje". Preimpresión de arXiv arXiv:1810.04805 (2018).
[3] Liu, Yinhan, et al. "Roberta: un enfoque de preentrenamiento de bert sólidamente optimizado". Preimpresión de arXiv arXiv:1907.11692 (2019).
[4] Shin, Eui Chul Richard, Dawn Song y Reza Moazzezi. "Reconocimiento de funciones en binarios con redes neuronales". 24º Simposio de Seguridad USENIX. 2015.