XDA เป็นเครื่องมือในการแยกส่วนคำสั่งและกู้คืนขอบเขตฟังก์ชันของไบนารีที่ถูกแยกออก ขึ้นอยู่กับการถ่ายโอนการเรียนรู้โดยใช้ตัวเข้ารหัส Transformer โดยมีวัตถุประสงค์การสร้างแบบจำลองภาษาที่ปกปิด [1, 2, 3] มันมีประสิทธิภาพเหนือกว่าเครื่องมือล้ำสมัย (เช่น IDA Pro, Ghidra และ RNN แบบสองทิศทาง [4]) โปรดดูรายละเอียดในรายงานของเรา: XDA: การแยกชิ้นส่วนที่แม่นยำและแข็งแกร่งด้วย 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)}
}
เราขอแนะนำให้ใช้ conda
เพื่อตั้งค่าสภาพแวดล้อมและติดตั้งแพ็คเกจที่จำเป็น
ขั้นแรก สร้างสภาพแวดล้อม conda
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
และเปิดใช้งานสภาพแวดล้อม conda:
conda activate xda
จากนั้นติดตั้ง Pytorch ล่าสุด (สมมติว่าคุณมี GPU):
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
สุดท้าย ป้อนไดเรกทอรีรากของ xda: เช่น path/to/xda
และติดตั้ง XDA:
pip install --editable .
สร้าง checkpoints
และ checkpoints/pretrain_all
ใน path/to/xda
mkdir -p checkpoints/pretrain_all
ดาวน์โหลดพารามิเตอร์น้ำหนักที่ฝึกไว้แล้วของเรา และใส่ไว้ใน checkpoints/pretrain_all
นอกจากนี้เรายังมีโมเดลที่ได้รับการปรับแต่งเพื่อให้คุณเล่นการกู้คืนขอบเขตของฟังก์ชันได้โดยตรง โมเดลที่ได้รับการปรับแต่งได้รับการฝึกฝนเกี่ยวกับไบนารีที่รวบรวมโดย MSVC x64 สร้างไดเรกทอรีย่อย checkpoints/finetune_msvs_funcbound_64
ใน path/to/xda
mkdir -p checkpoints/finetune_msvs_funcbound_64
ดาวน์โหลดพารามิเตอร์น้ำหนักที่ปรับแต่งแล้วของเราและใส่ใน checkpoints/finetune_msvs_funcbound_64
เราได้ใส่ข้อมูลตัวอย่างบางส่วนจากคลังข้อมูล BAP ที่รวบรวมโดย MSVC x64 ใน data-raw/msvs_funcbound_64_bap_test
มีสองคอลัมน์ในไฟล์ข้อมูล คอลัมน์แรกคือไบต์ดิบทั้งหมดของไบนารี่ และคอลัมน์ที่สองคือป้ายกำกับที่ระบุว่าเป็นฟังก์ชันเริ่มต้น (F) สิ้นสุดฟังก์ชัน (R) หรือไม่มีเลย
หากต้องการทำนายขอบเขตฟังก์ชันในไฟล์เหล่านี้ ให้รัน:
python scripts/play/play_func_bound.py
สคริปต์นี้จะโหลดน้ำหนักที่ปรับแต่งแล้วที่คุณใส่ไว้ใน checkpoints/finetune_msvs_funcbound_64
และทำนายขอบเขตของฟังก์ชัน นอกจากนี้ยังจะเปรียบเทียบกับความจริงภาคพื้นดินและผลลัพธ์จาก IDA
เราจัดเตรียมไฟล์การฝึกอบรม/การทดสอบตัวอย่างของการฝึกฝนล่วงหน้าและการปรับแต่งอย่างละเอียดใน data-src/
data-src/pretrain_all
มีตัวอย่างไบต์ดิบจากไบนารีที่ถูกแยกออกสำหรับการฝึกล่วงหน้าdata-src/funcbound
มีตัวอย่างไบต์ดิบพร้อมขอบเขตของฟังก์ชัน เราได้จัดเตรียมแบบจำลองที่ได้รับการฝึกล่วงหน้าไว้สำหรับไบนารีจำนวนมากแล้ว แต่หากคุณต้องการฝึกข้อมูลที่รวบรวมไว้ล่วงหน้า คุณสามารถเตรียมไฟล์ตัวอย่างที่คล้ายกับรูปแบบใน data-src/pretrain_all
(เชื่อมไบต์ทั้งหมดจากไบนารีทั้งหมด และคั่นด้วยการขึ้นบรรทัดใหม่ n
เพื่อให้แน่ใจว่าแต่ละบรรทัดจะไม่ เกินความยาวสูงสุดที่รุ่นยอมรับ) ในทำนองเดียวกัน หากคุณต้องการเตรียมข้อมูลการปรับแต่งอย่างละเอียดด้วยตัวเอง ตรวจสอบให้แน่ใจว่าคุณทำตามรูปแบบที่แสดงใน data-src/funcbound
เราต้องแบ่งข้อมูลออกเป็นสองส่วนเพื่อเตรียมพร้อมสำหรับการฝึกอบรม หากต้องการไบนาไรซ์ข้อมูลการฝึกสำหรับการฝึกล่วงหน้า ให้รัน:
./scripts/pretrain/preprocess-pretrain-all.sh
ข้อมูลการฝึกแบบไบนาไรซ์ที่พร้อมสำหรับการฝึกล่วงหน้าจะถูกเก็บไว้ที่ data-bin/pretrain_all
หากต้องการไบนาไรซ์ข้อมูลการฝึกเพื่อการปรับแต่ง ให้รัน:
./scripts/finetune/preprocess.sh
ข้อมูลการฝึกอบรมแบบไบนารีที่พร้อมสำหรับการปรับแต่ง (สำหรับขอบเขตฟังก์ชัน) จะถูกเก็บไว้ที่ data-bin/funcbound
หากคุณใช้ไบนารีที่แยกวิเคราะห์ของคุณเองสำหรับการฝึกล่วงหน้า และคุณได้ไบนารี่แล้วใน data-bin/pretrain_all
ให้รัน:
./scripts/pretrain/pretrain-all.sh
หากต้องการปรับแต่งโมเดล ให้รัน:
./scripts/finetune/finetune.sh
สคริปต์จะโหลดพารามิเตอร์น้ำหนักที่ฝึกไว้ล่วงหน้าจาก checkpoints/pretrain_all/
และปรับแต่งโมเดล
birnn/
สำหรับการประเมินความเร็ว ฉันได้ใส่สคริปต์ไว้ที่ https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
[1] วาสวานี, อาชิช และคณะ "ความสนใจคือสิ่งที่คุณต้องการ" ความก้าวหน้าในระบบประมวลผลข้อมูลประสาท 2017.
[2] เดฟลิน เจค็อบ และคณะ "เบิร์ต: การฝึกอบรมล่วงหน้าเกี่ยวกับหม้อแปลงสองทิศทางเชิงลึกเพื่อการทำความเข้าใจภาษา" arXiv พิมพ์ล่วงหน้า arXiv:1810.04805 (2018)
[3] หลิว หยินฮั่น และคณะ "โรเบอร์ตา: วิธีการฝึกหัดเบิร์ตที่ได้รับการปรับปรุงอย่างมีประสิทธิภาพ" arXiv พิมพ์ล่วงหน้า arXiv:1907.11692 (2019)
[4] ชิน, อึยชุล ริชาร์ด, Dawn Song และ Reza Moazzezi "การจดจำฟังก์ชันในไบนารีด้วยโครงข่ายประสาทเทียม" การประชุมวิชาการด้านความปลอดภัย USENIX ครั้งที่ 24 2558.