XDA ist ein Tool zum Zerlegen von Anweisungen und zum Wiederherstellen von Funktionsgrenzen entfernter Binärdateien. Es basiert auf Transferlernen unter Verwendung eines Transformer-Encoders mit maskierter Sprachmodellierungszielsetzung [1, 2, 3]. Es übertrifft modernste Tools (z. B. IDA Pro, Ghidra und bidirektionales RNN [4]). Die Details finden Sie in unserem Artikel: XDA: Accurate, Robust Disassembly with Transfer Learning
@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)}
}
Wir empfehlen die Verwendung conda
, um die Umgebung einzurichten und die erforderlichen Pakete zu installieren.
Erstellen Sie zunächst die Conda-Umgebung.
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
und aktivieren Sie die Conda-Umgebung:
conda activate xda
Installieren Sie dann das neueste Pytorch (vorausgesetzt, Sie verfügen über eine GPU):
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
Geben Sie abschließend das xda-Stammverzeichnis ein, z. B. path/to/xda
, und installieren Sie XDA:
pip install --editable .
Erstellen Sie die Unterverzeichnisse checkpoints
und checkpoints/pretrain_all
im path/to/xda
mkdir -p checkpoints/pretrain_all
Laden Sie unsere vorab trainierten Gewichtsparameter herunter und geben Sie checkpoints/pretrain_all
ein
Wir stellen Ihnen auch das fein abgestimmte Modell zur Verfügung, mit dem Sie direkt auf die Wiederherstellung von Funktionsgrenzen eingehen können. Das fein abgestimmte Modell wird auf Binärdateien trainiert, die von MSVC x64 kompiliert wurden. Erstellen Sie das Unterverzeichnis checkpoints/finetune_msvs_funcbound_64
im path/to/xda
mkdir -p checkpoints/finetune_msvs_funcbound_64
Laden Sie unsere fein abgestimmten Gewichtsparameter herunter und geben Sie checkpoints/finetune_msvs_funcbound_64
ein.
Wir haben einige Beispieldaten aus dem von MSVC x64 kompilierten BAP-Korpus in data-raw/msvs_funcbound_64_bap_test
abgelegt. Die Datendateien enthalten zwei Spalten. Die erste Spalte enthält alle Rohbytes der Binärdatei, und die zweite Spalte enthält die Beschriftung, die angibt, dass es sich um Funktionsstart (F), Funktionsende (R) oder keines von beidem handelt.
Führen Sie Folgendes aus, um die Funktionsgrenze in diesen Dateien vorherzusagen:
python scripts/play/play_func_bound.py
Dieses Skript lädt die fein abgestimmten Gewichtungen, die Sie in checkpoints/finetune_msvs_funcbound_64
eingegeben haben, und sagt die Funktionsgrenzen voraus. Es wird auch mit der Grundwahrheit und den Ergebnissen von IDA verglichen.
Wir stellen die Beispieltrainings-/Testdateien für das Vortraining und die Feinabstimmung in data-src/
bereit.
data-src/pretrain_all
enthält die Beispiel-Rohbytes aus entfernten Binärdateien für das Vortrainingdata-src/funcbound
enthält die Beispiel-Rohbytes mit Funktionsgrenzen Wir haben die vorab trainierten Modelle bereits für eine große Anzahl von Binärdateien bereitgestellt. Wenn Sie jedoch Ihre eigenen gesammelten Daten vorab trainieren möchten, können Sie die Beispieldateien ähnlich dem Format in data-src/pretrain_all
vorbereiten (verketten Sie alle Bytes aller Binärdateien und trennen Sie sie durch eine neue Zeile n
um sicherzustellen, dass dies nicht in jeder Zeile der Fall ist die maximale Länge überschreiten, die das Modell akzeptiert). Wenn Sie die Feinabstimmungsdaten selbst vorbereiten möchten, achten Sie ebenfalls darauf, dass Sie das in data-src/funcbound
gezeigte Format befolgen.
Wir müssen die Daten binarisieren, um sie für das Training vorzubereiten. Führen Sie Folgendes aus, um die Trainingsdaten für das Vortraining zu binarisieren:
./scripts/pretrain/preprocess-pretrain-all.sh
Die für das Vortraining bereiten binarisierten Trainingsdaten werden unter data-bin/pretrain_all
gespeichert
Führen Sie Folgendes aus, um die Trainingsdaten zur Feinabstimmung zu binarisieren:
./scripts/finetune/preprocess.sh
Die binärisierten Trainingsdaten, die zur Feinabstimmung (für Funktionsgrenzen) bereit sind, werden unter data-bin/funcbound
gespeichert
Wenn Sie Ihre eigenen geparsten Binärdateien für das Vortraining verwenden und diese bereits in data-bin/pretrain_all
binarisiert haben, führen Sie Folgendes aus:
./scripts/pretrain/pretrain-all.sh
Führen Sie zur Feinabstimmung des Modells Folgendes aus:
./scripts/finetune/finetune.sh
Die Skripte laden die vorab trainierten Gewichtsparameter aus checkpoints/pretrain_all/
und optimieren das Modell.
birnn/
ein. Zur Geschwindigkeitsbewertung habe ich ein Skript unter https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
abgelegt
[1] Vaswani, Ashish et al. „Aufmerksamkeit ist alles was du brauchst.“ Fortschritte in neuronalen Informationsverarbeitungssystemen. 2017.
[2] Devlin, Jacob et al. „Bert: Vorschulung tiefer bidirektionaler Transformatoren zum Sprachverständnis.“ arXiv-Vorabdruck arXiv:1810.04805 (2018).
[3] Liu, Yinhan et al. „Roberta: Ein robust optimierter Bert-Pretraining-Ansatz.“ arXiv-Vorabdruck arXiv:1907.11692 (2019).
[4] Shin, Eui Chul Richard, Dawn Song und Reza Moazzezi. „Funktionen in Binärdateien mit neuronalen Netzen erkennen.“ 24. USENIX-Sicherheitssymposium. 2015.