Dna เป็นกรอบการวิเคราะห์ไบนารีแบบคงที่ที่สร้างขึ้นบน LLVM โดยเฉพาะอย่างยิ่งมันเขียนเกือบทั้งหมดใน C#รวมถึงการเชื่อมโยงที่มีการจัดการสำหรับ LLVM, Remill และ Souper
Dna ใช้กราฟการควบคุมการไหลแบบวนซ้ำได้รับแรงบันดาลใจจากกระดาษดาวเสาร์อย่างหนัก มันใช้ซ้ำการโคตรแบบเรียกซ้ำการยก (โดยใช้ remill) และการแก้เส้นทางจนกว่ากราฟการควบคุมการควบคุมที่สมบูรณ์จะถูกกู้คืน ในกรณีของตารางกระโดดเราใช้อัลกอริทึมแบบเรียกซ้ำตาม Souper และ Z3 เพื่อแก้ไขชุดเป้าหมายตารางกระโดดที่เป็นไปได้ คุณสามารถค้นหาอัลกอริทึมการสำรวจซ้ำได้ที่นี่และอัลกอริทึมการแก้โต๊ะกระโดดที่นี่
เมื่อมีการสำรวจกราฟการควบคุมอย่างสมบูรณ์แล้วจะสามารถคอมไพล์ใหม่เป็น x86 และใส่เข้าไปในไบนารีอีกครั้งโดยใช้อัลกอริทึมจากที่นี่และที่นี่ แม้ว่ารหัสที่รวบรวมจะไม่สวยไม่ว่าด้วยวิธี ใดก็ตาม แต่ก็ควรทำงานตราบใดที่กราฟโฟลว์การควบคุมที่กู้คืนนั้นถูกต้อง ที่ถูกกล่าวว่ามันยังคงเป็นต้นแบบการวิจัย - ข้อบกพร่องและกรณีขอบคาดว่า การสำรวจกราฟการไหลของการควบคุมอาจล้มเหลวในกรณีของตารางกระโดดที่ไม่มีขอบเขตหรือคำแนะนำที่ไม่สามารถแก้ไขได้
คุณสมบัติที่โดดเด่นอื่น ๆ :
try คำสั่ง / catch และ filter intrinsics จะถูกแทรกลงในกราฟการไหลของการควบคุม แม้ว่า recompiler จะไม่สนับสนุน SEH (รายการ SEH ไม่ได้รับการแก้ไข) ดังนั้นข้อยกเว้นจะทำให้เกิดการล่มMemorySSA , LoopInfo , ต้นไม้ Dominator, การจัดการท่อส่งผ่าน ฯลฯข้อแม้บางอย่าง:
โปรดทราบว่าปัจจุบัน Dna ขึ้นอยู่กับ LLVM 17
Dna จะไม่สร้างออกจากกล่อง จำเป็นต้องใช้แพทช์ที่กำหนดเองเพื่อ Remill และ Souper เพื่อสร้างสิ่งนี้บน Windows หากคุณต้องการทำงานกับ DNA ให้เปิดปัญหาหรือส่งอีเมลถึงฉัน [email protected] ในบางจุดฉันอาจเผยแพร่ขั้นตอนการสร้างที่เหมาะสม แต่ฉันไม่รับประกัน