XDA est un outil pour désassembler les instructions et récupérer les limites des fonctions des binaires supprimés. Il est basé sur l'apprentissage par transfert utilisant l'encodeur Transformer avec un objectif de modélisation de langage masqué [1, 2, 3]. Il surpasse les outils de pointe (par exemple, IDA Pro, Ghidra et RNN bidirectionnel [4]). Veuillez trouver les détails dans notre article : XDA : Démontage précis et robuste avec apprentissage par transfert
@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)}
}
Nous vous recommandons d'utiliser conda
pour configurer l'environnement et installer les packages requis.
Tout d’abord, créez l’environnement conda,
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
et activez l'environnement conda :
conda activate xda
Ensuite, installez la dernière version de Pytorch (en supposant que vous disposez d'un GPU) :
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
Enfin, entrez dans le répertoire racine xda : par exemple, path/to/xda
et installez XDA :
pip install --editable .
Créez les sous-répertoires checkpoints
et checkpoints/pretrain_all
dans path/to/xda
mkdir -p checkpoints/pretrain_all
Téléchargez nos paramètres de poids pré-entraînés et insérez-les dans checkpoints/pretrain_all
Nous fournissons également le modèle affiné pour que vous puissiez jouer directement sur la récupération des limites des fonctions. Le modèle affiné est formé sur des binaires compilés par MSVC x64. Créez le sous-répertoire checkpoints/finetune_msvs_funcbound_64
dans path/to/xda
mkdir -p checkpoints/finetune_msvs_funcbound_64
Téléchargez nos paramètres de poids affinés et insérez checkpoints/finetune_msvs_funcbound_64
.
Nous avons mis quelques exemples de données du corpus BAP compilé par MSVC x64 dans data-raw/msvs_funcbound_64_bap_test
. Il y a deux colonnes dans les fichiers de données. La première colonne contient tous les octets bruts du binaire et la deuxième colonne est l'étiquette indiquant qu'il s'agit du début de la fonction (F), de la fin de la fonction (R) ou ni l'un ni l'autre.
Pour prédire la limite des fonctions dans ces fichiers, exécutez :
python scripts/play/play_func_bound.py
Ces scripts chargeront les poids affinés que vous mettez dans checkpoints/finetune_msvs_funcbound_64
et prédisent les limites de la fonction. Il sera également comparé à la vérité sur le terrain et aux résultats de l'IDA.
Nous fournissons les exemples de fichiers de formation/test de pré-entraînement et de réglage fin dans data-src/
data-src/pretrain_all
contient les exemples d'octets bruts des binaires supprimés pour le pré-entraînementdata-src/funcbound
contient les exemples d'octets bruts avec les limites des fonctions Nous avons déjà fourni les modèles pré-entraînés sur un grand nombre de binaires. Mais si vous souhaitez effectuer un pré-entraînement sur vos propres données collectées, vous pouvez préparer les exemples de fichiers similaires au format data-src/pretrain_all
(concaténer tous les octets de tous les binaires et délimiter par une nouvelle ligne n
pour vous assurer que chaque ligne ne dépasser la longueur maximale acceptée par le modèle). De même, si vous souhaitez préparer vous-même les données de réglage fin, assurez-vous de suivre le format indiqué dans data-src/funcbound
.
Nous devons binariser les données pour les préparer à être entraînées. Pour binariser les données d'entraînement pour le pré-entraînement, exécutez :
./scripts/pretrain/preprocess-pretrain-all.sh
Les données d'entraînement binarisées prêtes pour le pré-entraînement seront stockées dans data-bin/pretrain_all
Pour binariser les données d'entraînement à des fins de réglage, exécutez :
./scripts/finetune/preprocess.sh
Les données d'entraînement binarisées prêtes pour le réglage fin (pour les limites de la fonction) seront stockées dans data-bin/funcbound
Si vous utilisez vos propres binaires analysés pour le pré-entraînement et que vous les avez déjà binarisés dans data-bin/pretrain_all
, exécutez :
./scripts/pretrain/pretrain-all.sh
Pour affiner le modèle, exécutez :
./scripts/finetune/finetune.sh
Les scripts chargent les paramètres de poids pré-entraînés à partir de checkpoints/pretrain_all/
et affinent le modèle.
birnn/
Pour l'évaluation de la vitesse, j'ai mis un script sur https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
[1] Vaswani, Ashish et coll. "L'attention est tout ce dont vous avez besoin." Progrès dans les systèmes de traitement de l’information neuronale. 2017.
[2] Devlin, Jacob et coll. "Bert : Pré-formation de transformateurs bidirectionnels profonds pour la compréhension du langage." Préimpression arXiv arXiv:1810.04805 (2018).
[3] Liu, Yinhan et coll. "Roberta : une approche de pré-formation bert robustement optimisée." Préimpression arXiv arXiv:1907.11692 (2019).
[4] Shin, Eui Chul Richard, Dawn Song et Reza Moazzezi. "Reconnaissance des fonctions dans les binaires avec des réseaux de neurones." 24e Symposium sur la sécurité USENIX. 2015.