
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 के उपयोगकर्ता हैं तो आप इसे छोड़ सकते हैं।
यह AMD64 आर्किटेक्चर के लिए फ़्रीज़ किया गया TensorFlow प्रशिक्षित मॉडल है। आप इसे अपने प्रोजेक्ट में इस प्रकार आयात कर सकते हैं:
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 फ़ोल्डर में दो फ़ाइलें हैं। एक मैट्रिक्स जहाँ प्रत्येक पंक्ति एक asm निर्देश का एम्बेडिंग है। एक json फ़ाइल जिसमें asm निर्देशों को उपरोक्त मैट्रिक्स की पंक्ति संख्याओं से मैप करने वाला एक शब्दकोश है। फ़ाइल देखें: asm_embedding/InstructionsConverter.py
यदि आप हमारे डेटासेट का उपयोग करके मॉडल को प्रशिक्षित करना चाहते हैं, तो आपको पहले इसका उपयोग करना होगा:
python3 downloader.py -td
यह डेटासेट को data फ़ोल्डर में डाउनलोड करेगा। ध्यान दें कि डेटासेट संपीड़ित हैं, इसलिए आपको उन्हें स्वयं डीकंप्रेस करना होगा। यह डेटा sqlite डेटाबेस होगा। प्रशिक्षण शुरू करने के लिए neural_network/train.sh का उपयोग करें। db को train.sh में पैरामीटर बदलकर चुना जा सकता है। यदि आप डेटासेट के बारे में अधिक जानकारी चाहते हैं, तो हमारा पेपर देखें।
यदि आप अपना स्वयं का डेटासेट बनाना चाहते हैं, तो आप dataset creation फ़ोल्डर में ExperimentUtil स्क्रिप्ट का उपयोग कर सकते हैं।
यदि आप SAFE बाइनरी कोड खोज इंजन का उपयोग करना चाहते हैं, तो आप ज्ञान आधार बनाने के लिए ExperimentUtil स्क्रिप्ट का उपयोग कर सकते हैं। फिर आप function_search में स्क्रिप्ट का उपयोग करके इसमें खोज सकते हैं।
हमारे कोड में हम Google ड्राइव से डेटा डाउनलोड करने के लिए godown का उपयोग करते हैं। हम godown के निर्माता circulosmeos को धन्यवाद देते हैं।
हम उपयोगी चर्चाओं के लिए Davide Italiano को धन्यवाद देते हैं।