
إطار عمل تحليل ثنائي ثابت قائم على LLVM
Dna هو إطار عمل لتحليل الثنائيات الساكنة (static binary analysis) مبني على LLVM. ومن الجدير بالذكر أنه مكتوب بالكامل تقريبًا بلغة C#، بما في ذلك روابط مُدارة لـ LLVM وRemill وSouper.
يطبّق Dna إعادة بناء متكررة لمخطط تدفق التحكم (control flow graph) مستوحاة بشكل كبير من ورقة SATURN. يطبّق بشكل متكرر النزول العودي (recursive descent)، والرفع (lifting) باستخدام remill، وحل المسارات حتى يتم استعادة مخطط تدفق التحكم الكامل. في حالة جداول القفز (jump tables)، نستخدم خوارزمية تعاودية مبنية على Souper وz3 لحل مجموعة الأهداف الممكنة لجداول القفز. يمكنك العثور على خوارزمية الاستكشاف المتكرر هنا، وخوارزمية حل جداول القفز هنا.
بمجرد استكشاف مخطط تدفق التحكم بالكامل، يمكن إعادة ترجمته إلى x86 وإعادة إدراجه في الثنائي باستخدام الخوارزميات من هنا وهنا. على الرغم من أن الكود المُترجم ليس جميلًا بأي حال من الأحوال، إلا أنه يجب أن يعمل طالما أن مخطط تدفق التحكم المستعاد صحيح. ومع ذلك، فإنه لا يزال نموذجًا أوليًا بحثيًا - فمن المتوقع وجود أخطاء وحالات حافة. قد يفشل استكشاف مخطط تدفق التحكم في حالة جداول القفز غير المحدودة أو التعليمات غير القابلة للرفع.
بعض الميزات البارزة الأخرى:
try/catch والدوال الجوهرية filter في مخطط تدفق التحكم. على الرغم من أن المُعاد الترجمة لا يدعم (حتى الآن) SEH (لا يتم إصلاح إدخالات SEH)، لذا فإن الاستثناءات ستؤدي إلى تعطل البرنامج.MemorySSA وLoopInfo وأشجار الهيمنة وإدارة خط أنابيب التمريرات وما إلى ذلك.بعض التحفظات:
لاحظ أن Dna يعتمد حاليًا على LLVM 17.
يحتوي Dna على مكوّن إضافي لإلغاء الظاهرية (devirtualization) لـ VMProtect موجود في Dna.BinaryTranslator/VMProtect. راجع هذا الطلب لمزيد من المعلومات.
يستهدف Dna حاليًا LLVM 17 ومن المتوقع بناؤه على Windows x64 مع Visual Studio 2022.
قم ببناء Dna.LLVMInterop في وضع Release؛ إن شجرة التبعيات الأصلية مبنية بوضع Release ولا تُدعم عمليات البناء البينية (interop) بوضع Debug.
شغّل الأوامر أدناه من موجه أوامر مطور VS x64، أو من موجه آخر تتوفر فيه أدوات C++ الخاصة بـ VS على PATH.
يقوم البناء الفائق للتبعيات بتثبيت LLVM 17 وRemill وZ3 وXED وgflags/glog والمكتبات الأصلية ذات الصلة في Dna.LLVMInterop/dependencies/install.
cmake -S Dna.LLVMInterop/dependencies `
-B Dna.LLVMInterop/dependencies/build `
-G Ninja `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_C_COMPILER=clang-cl `
-DCMAKE_CXX_COMPILER=clang-cl
cmake --build Dna.LLVMInterop/dependencies/build
إذا غيّرت المترجم أو نوع البناء أو إعدادات CRT، فاحذف كلاً من Dna.LLVMInterop/dependencies/build وDna.LLVMInterop/dependencies/install قبل إعادة الضبط.
تقوم مشاريع Dna.Example والمبسّطات بنسخ eq_sat.dll من مخرجات Cargo بوضع Release.
cargo build --manifest-path Simplifier/EqSat/Cargo.toml --release
& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" `
Dna.sln `
/restore `
/p:Configuration=Release `
/p:Platform=x64 `
/m