Dna هو إطار تحليل ثنائي ثابت مبني على رأس LLVM. والجدير بالذكر أنه مكتوب بالكامل تقريبًا في C#، بما في ذلك الروابط المدارة لـ LLVM و Remill و Souper.
ينفذ Dna إعادة بناء الرسم البياني للتدفق التكراري بشكل كبير من ورقة زحل. إنه ينطبق بشكل تكراري على الهبوط المتكرر ، والرفع (باستخدام REMILL) ، وحل المسار حتى يتم استرداد رسم تخطيط التحكم الكامل. في حالة طاولات القفز ، نستخدم خوارزمية عودية تعتمد على Souper و Z3 لحل مجموعة أهداف جدول القفز الممكنة. يمكنك العثور على خوارزمية الاستكشاف التكرارية هنا ، وخوارزمية حل طاولة القفز هنا.
بمجرد استكشاف الرسم البياني لتدفق التحكم بالكامل ، يمكن إعادة تنسيقه إلى x86 وإعادة إدخاله في الثنائي باستخدام الخوارزميات من هنا وهنا. على الرغم من أن الكود المترجم ليس جميلًا بأي وسيلة ، إلا أنه يجب أن يعمل طالما أن رسم تخفيف التحكم المسترد صحيح. ومع ذلك ، لا يزال نموذجًا أوليًا للبحث - من المتوقع حدوث الحشرات وحالات الحافة. قد يفشل استكشاف الرسم البياني للتدفق في حالة طاولات القفز غير المحدودة أو الإرشادات غير القابلة للتطبيق.
بعض الميزات البارزة الأخرى:
try / catch filter في الرسم البياني لتدفق التحكم. على الرغم من أن Recompiler لا يدعم (بعد) SEH (إدخالات SEH غير ثابتة) ، لذلك ستؤدي الاستثناءات إلى حدوث حوادث.MemorySSA ، LoopInfo ، أشجار Dominator ، إدارة خطوط الأنابيب ، إلخ.بعض التحذيرات:
لاحظ أن Dna يعتمد حاليًا على LLVM 17.
لن يبني Dna خارج الصندوق. كانت هناك حاجة إلى تصحيحات مخصصة لتسديدها و souper لهذا البناء على النوافذ. إذا كنت ترغب في العمل على الحمض النووي ، فتح مشكلة أو مراسلتي عبر البريد الإلكتروني [email protected] . في مرحلة ما ، قد أنشر خطوات بناء مناسبة ، لكنني لا أقدم أي ضمانات.