
SAFE: Само-внимательные вложения функций для бинарного сходства
Данное программное обеспечение является результатом наших академических исследований. См. нашу статью на arXiv: arxiv
Если вы используете этот код, пожалуйста, цитируйте нашу академическую статью:
@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}
}
Вам необходимо установить radare2 в вашей системе.
Чтобы создать эмбеддинг функции:
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
Получив два эмбеддинга embedding_x и embedding_y, вы можете вычислить схожесть соответствующих функций следующим образом:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE требует некоторой информации для работы. Два компонента являются основными: модель, которая сообщает SAFE, как преобразовывать ассемблерные инструкции в векторы (модель i2v), и модель, которая сообщает SAFE, как преобразовывать бинарную функцию в вектор. Обе модели можно загрузить с помощью команды:
./download_model.sh
загрузчик скачивает модель и помещает её в каталог data. Структура каталогов после загрузки должна быть следующей:
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
Файл safe.pb содержит модель safe, используемую для преобразования бинарных функций в векторы. Папка i2v содержит модель i2v.
Этот раздел содержит детали, необходимые для воспроизведения наших экспериментов; если вы являетесь пользователем safe, можете его пропустить.
Это замороженная обученная модель TensorFlow для архитектуры AMD64. Вы можете импортировать её в свой проект, используя:
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)
см. файл: neural_network/SAFEEmbedder.py
Папка i2v содержит два файла: Матрица, где каждая строка является эмбеддингом ассемблерной инструкции. JSON-файл, содержащий словарь, сопоставляющий ассемблерные инструкции с номерами строк вышеуказанной матрицы. см. файл: asm_embedding/InstructionsConverter.py
Если вы хотите обучить модель, используя наши наборы данных, сначала выполните:
python3 downloader.py -td
Это загрузит наборы данных в папку data. Обратите внимание, что наборы данных сжаты, поэтому вам придётся распаковать их самостоятельно. Эти данные представляют собой базы данных SQLite. Для начала обучения используйте neural_network/train.sh. Базу данных можно выбрать, изменив параметры в train.sh. Если вы хотите получить информацию о наборе данных, см. нашу статью.
Если вы хотите создать свой собственный набор данных, вы можете использовать скрипт ExperimentUtil из папки dataset creation.
Если вы хотите использовать поисковую систему бинарного кода SAFE, вы можете использовать скрипт ExperimentUtil для создания базы знаний. Затем вы можете выполнять поиск по ней с помощью скрипта из папки function_search
В нашем коде мы используем godown для загрузки данных с Google Drive. Мы благодарим circulosmeos, создателя godown.
Мы благодарим Davide Italiano за полезные обсуждения.