
SAFE: Self-Attentive Function Embeddings für binäre Ähnlichkeit
Diese Software ist das Ergebnis unserer akademischen Forschung. Siehe unser arXiv-Papier: arxiv
Wenn Sie diesen Code verwenden, zitieren Sie bitte unser akademisches Papier wie folgt:
@inproceedings{massarelli2018safe,
title={SAFE: Self-Attentive Function Embeddings for Binary Similarity},
author={Massarelli, Luca and Di Luna, Giuseppe Antonio and Petroni, Fabio and Querzoni, Leonardo and Baldoni, Roberto},
booktitle={Proceedings of 16th Conference on Detection of Intrusions and Malware & Vulnerability Assessment (DIMVA)},
year={2019}
}
Sie benötigen radare2 auf Ihrem System installiert.
Um die Einbettung einer Funktion zu erstellen:
git clone https://github.com/gadiluna/SAFE.git
pip install -r requirements
chmod +x download_model.sh
./download_model.sh
python safe.py -m data/safe.pb -i helloworld.o -a 100000F30
Sobald Sie zwei Einbettungen embedding_x und embedding_y haben, können Sie die Ähnlichkeit der entsprechenden Funktionen wie folgt berechnen:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE benötigt wenige Informationen, um zu funktionieren. Zwei sind wesentlich: ein Modell, das SAFE sagt, wie Assembleranweisungen in Vektoren umgewandelt werden (i2v-Modell), und ein Modell, das SAFE sagt, wie eine binäre Funktion in einen Vektor umgewandelt wird. Beide Modelle können mit dem Befehl heruntergeladen werden
./download_model.sh
Der Downloader lädt das Modell herunter und platziert es im Verzeichnis data. Der Verzeichnisbaum nach dem Download sollte so aussehen:
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
Die Datei safe.pb enthält das SAFE-Modell zur Umwandlung binärer Funktionen in Vektoren. Der Ordner i2v enthält das i2v-Modell.
Dieser Abschnitt enthält Details, die zur Reproduktion unserer Experimente erforderlich sind. Wenn Sie ein SAFE-Benutzer sind, können Sie ihn überspringen.
Dies ist das eingefrorene TensorFlow-trainierte Modell für die AMD64-Architektur. Sie können es in Ihr Projekt importieren mit:
import tensorflow as tf
with tf.gfile.GFile("safe.pb", "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Graph().as_default() as graph:
tf.import_graph_def(graph_def)
sess = tf.Session(graph=graph)
siehe Datei: neural_network/SAFEEmbedder.py
Der i2v-Ordner enthält zwei Dateien. Eine Matrix, in der jede Zeile die Einbettung einer ASM-Anweisung ist. Eine JSON-Datei, die ein Wörterbuch enthält, das ASM-Anweisungen auf Zeilennummern der obigen Matrix abbildet. siehe Datei: asm_embedding/InstructionsConverter.py
Wenn Sie das Modell mit unseren Datensätzen trainieren möchten, müssen Sie zuerst Folgendes verwenden:
python3 downloader.py -td
Dadurch werden die Datensätze in den Datenordner heruntergeladen. Beachten Sie, dass die Datensätze komprimiert sind, also müssen Sie sie selbst entpacken. Diese Daten werden SQLite-Datenbanken sein. Um das Training zu starten, verwenden Sie neural_network/train.sh. Die DB kann durch Ändern des Parameters in train.sh ausgewählt werden. Weitere Informationen zum Datensatz finden Sie in unserem Paper.
Wenn Sie Ihren eigenen Datensatz erstellen möchten, können Sie das Skript ExperimentUtil im Ordner dataset creation verwenden.
Wenn Sie die SAFE-Suchmaschine für Binärcode verwenden möchten, können Sie das Skript ExperimentUtil verwenden, um die Wissensbasis zu erstellen. Dann können Sie mit dem Skript in function_search darin suchen.
In unserem Code verwenden wir godown zum Herunterladen von Daten von Google Drive. Wir danken circulosmeos, dem Ersteller von godown.
Wir danken Davide Italiano für die nützlichen Diskussionen.