Spedi เป็นตัวแยกชิ้นส่วนแบบเก็งกำไรสำหรับ Thumb ISA ขนาดแปรผัน เมื่อรับไฟล์ ELF เป็นอินพุต Spedi สามารถ:
Spedi ทำงานโดยตรงกับไบนารีโดยไม่ต้องใช้ข้อมูลสัญลักษณ์ เราพบว่า Spedi มีประสิทธิภาพเหนือกว่า IDA Pro ในการทดลองของเรา
Spedi กู้คืน Basic Blocks (BBs) ที่เป็นไปได้ทั้งหมดที่มีอยู่ในไบนารี BBs ที่ใช้คำสั่ง Jump เดียวกันจะถูกจัดกลุ่มไว้ใน Maximal Block (MB) เดียว จากนั้น MB จะได้รับการปรับปรุงโดยใช้การทับซ้อนและการวิเคราะห์ข้อขัดแย้ง CFG รายละเอียดสามารถพบได้ในเอกสาร CASES'16 ของเรา " การแยกส่วนเก็งกำไรของรหัสไบนารี่ " กระดาษมีอยู่ที่นี่
Spedi (เกือบ) กู้คืนคำสั่งการประกอบจากไบนารีการวัดประสิทธิภาพของเราได้อย่างสมบูรณ์แบบด้วยค่าเฉลี่ย 99.96% ในการเปรียบเทียบ IDA Pro มีค่าเฉลี่ย 95.83% ที่เบี่ยงเบนจากประสิทธิภาพที่ค่อนข้างต่ำในเกณฑ์มาตรฐาน sha
Spedi กู้คืนฟังก์ชันต่างๆ ได้อย่างแม่นยำถึง 97.46% โดยเฉลี่ย นั่นคือระบุที่อยู่เริ่มต้นและที่อยู่สิ้นสุดที่ถูกต้อง เปรียบเทียบกับค่าเฉลี่ย 40.53% ที่ได้รับจาก IDA Pro
คุณสมบัติที่ดีของเทคนิคของเราก็คือ รวดเร็วและปรับขนาดได้ดีด้วยขนาดเกณฑ์มาตรฐานที่เพิ่มขึ้น ตัวอย่างเช่น spedi แยกชิ้นส่วน du (คำสั่ง 50K) ในเวลาประมาณ 150 มิลลิวินาที โปรดทราบว่ายังมีพื้นที่ที่ดีสำหรับการเพิ่มประสิทธิภาพเพิ่มเติม
หากต้องการอ้างอิง Spedi ในงานวิชาการ โปรดใช้:
@inproceedings{BenKhadraSK2016,
author = {Ben Khadra, M. Ammar and Stoffel, Dominik and Kunz, Wolfgang},
title = {Speculative Disassembly of Binary Code},
booktitle = {Proceedings of the International Conference on Compilers, Architectures and Synthesis for Embedded Systems},
year = {2016},
location = {Pittsburgh, Pennsylvania},
articleno = {16},
doi = {10.1145/2968455.2968505},
acmid = {2968505},
publisher = {ACM},
}
สร้างโปรเจ็กต์และลองใช้หนึ่งในไบนารีในชุดเบนช์มาร์กของเราที่มีอยู่ในที่เก็บนี้
คำสั่งต่อไปนี้จะสั่งให้ spedi
แยกส่วน .text
อย่างคาดเดา
$ ./spedi -t -s -f $FILE > speculative.inst
ใช้คำสั่งต่อไปนี้เพื่อแยกส่วน .text
ตามสัญลักษณ์การแมปโค้ด ARM ซึ่งให้ข้อมูลพื้นฐานเกี่ยวกับคำแนะนำที่ถูกต้อง
$ ./spedi -t -f $FILE > correct.inst
วิธีที่ง่ายที่สุดในการเปรียบเทียบทั้งสองเอาต์พุตคือการใช้
$ diff -y correct.inst speculative.inst | less
ในปัจจุบัน คุณต้องแก้ไข main.cpp
ด้วยตนเองเพื่อแสดงผลลัพธ์ที่เกี่ยวข้องกับการสลับตารางและการกู้คืนกราฟการโทร
เครื่องมือนี้เป็นข้อพิสูจน์แนวคิดทางวิชาการ ขณะนี้ยังไม่อยู่ในรายการลำดับความสำคัญของเรา อย่างไรก็ตาม มีคุณสมบัติบางอย่างที่เราคำนึงถึงในอนาคต ได้แก่:
bx
และ blx
) บทความนี้จะให้รายละเอียดที่เกี่ยวข้องบางประการ เมื่อเร็วๆ นี้ Andriesse และ อัล ได้ทำงานกับ Nucleus
ซึ่งเป็นเครื่องมือสำหรับระบุฟังก์ชันในไบนารี x64 บทความ " Compiler-Agnostic Function Detection in Binaries " ของพวกเขาได้รับการยอมรับที่ IEEE Euro S&P 2017 พวกเขาใช้เทคนิคการระบุฟังก์ชันแบบเดียวกับที่ใช้ใน Spedi ไม่มากก็น้อย หากคุณสนใจการสนับสนุน x64 คุณสามารถดูเครื่องมือของพวกเขาได้
อย่างไรก็ตาม โปรดทราบว่าเครื่องมือของพวกเขาตั้งอยู่บนสมมติฐานที่ว่าคอมไพเลอร์ x64 ล่าสุดจัดสรรข้อมูลตารางข้ามในส่วน . .rodata
ทำให้การกู้คืนคำสั่งง่ายขึ้นอย่างมาก เนื่องจากสามารถทำได้อย่างน่าเชื่อถือด้วยการกวาดเชิงเส้น ในการเปรียบเทียบ Spedi จะจัดการกรณีทั่วไปของโค้ด/ข้อมูลแบบผสมโดยใช้การแยกชิ้นส่วนแบบเก็งกำไร
โปรเจ็กต์นี้ขึ้นอยู่กับไลบรารีการแยกส่วน Capstone (v3.0.4)