الهندسة العكسية: فك ترجمة الكود الثنائي باستخدام نماذج اللغة الكبيرة
التحديثات
[2025-10-04]: إصدار SK²Decompile: فك ترجمة ثنائي على مرحلتين قائم على نماذج اللغة، من الهيكل إلى السطح. المرحلة 1 — استعادة البنية (الهيكل): تحويل الكود الثنائي/شبه الكود إلى تمثيلات وسيطة مبهمة 🤗 رابط HF. المرحلة 2 — تسمية المعرّفات (السطح): توليد كود مصدري قابل للقراءة البشرية مع معرّفات ذات معنى 🤗 رابط HF.
[2025-05-20]: إصدار decompile-bench، يحتوي على مليوني زوج من الدوال (الثنائية-المصدرية) للتدريب، و70 ألف زوج من الدوال للتقييم. يُرجى الرجوع إلى مجلد decompile-bench للتفاصيل.
[2024-10-17]: إصدار decompile-ghidra-100k، وهو مجموعة فرعية تضم 100 ألف عينة تدريب (25 ألفًا لكل مستوى تحسين). نوفّر نصًا برمجيًا للتدريب يستغرق ~3.5 ساعات على وحدة معالجة رسومية واحدة A100 بسعة 40 جيجابايت. يحقق معدل قابلية إعادة تنفيذ يبلغ 0.26، بتكلفة إجمالية أقل من 20 دولارًا لإعادة إنتاج LLM4Decompile بسرعة.
[2024-09-26]: تحديث دفتر Colab لعرض استخدام نموذج LLM4Decompile، بما في ذلك أمثلة لنموذجي LLM4Decompile-End وLLM4Decompile-Ref.
[2024-09-23]: إصدار LLM4Decompile-9B-v2، المضبوط بدقة استنادًا إلى Yi-Coder-9B، وقد حقق معدل قابلية إعادة تنفيذ قدره 0.6494 على معيار Decompile.
[2024-06-19]: إصدار سلسلة V2 (LLM4Decompile-Ref). سلسلة V2 (1.3B-22B)، المبنية على Ghidra، مُدرَّبة على ملياري رمز (token) لـتحسين شبه الكود المُفكَّك من Ghidra. يتفوق إصدار 22B-V2 على 6.7B-V1.5 بنسبة إضافية تبلغ 40.1%. يُرجى مراجعة مجلد ghidra للتفاصيل.
[2024-05-13]: إصدار سلسلة V1.5 (LLM4Decompile-End، أي فك ترجمة الكود الثنائي مباشرة باستخدام نماذج اللغة). تم تدريب V1.5 على مجموعة بيانات أكبر (15 مليار رمز (token)) وبحد أقصى لطول الرموز يبلغ 4,096، مع أداء ملحوظ (تحسن بأكثر من 100%) مقارنة بالنموذج السابق.
[2024-03-16]: إضافة نموذج llm4decompile-6.7b-uo الذي يُدرَّب دون معرفة مسبقة بمستويات التحسين (O0~O3)، ويبلغ متوسط قابلية إعادة التنفيذ لديه حوالي 0.219، وهو الأفضل أداءً بين نماذجنا.
حول
LLM4Decompile هو نموذج اللغة الكبير مفتوح المصدر الرائد المخصص لفك الترجمة. يدعم إصداره الحالي فك ترجمة الملفات الثنائية Linux x86_64، بدءًا من مستويات التحسين O0 إلى O3 الخاصة بـ GCC، إلى كود C مصدري قابل للقراءة البشرية. يلتزم فريقنا بتوسيع قدرات هذه الأداة، مع جهود مستمرة لإدراج نطاق أوسع من البُنى والتكوينات.
يركز LLM4Decompile-End على فك ترجمة الكود الثنائي مباشرة. بينما يحسّن LLM4Decompile-Ref شبه الكود المُفكَّك بواسطة Ghidra.
التقييم
الإطار
أثناء الترجمة، يعالج المعالج الأولي (Preprocessor) الكود المصدري (SRC) لإزالة التعليقات وتوسيع وحدات الماكرو (macros) أو التضمينات (includes). ثم يُمرَّر الكود المنظف إلى المترجم (Compiler)، الذي يحوّله إلى كود تجميع (ASM). يحوّل المجمّع (Assembler) كود التجميع هذا إلى كود ثنائي (0 و1). يُنهي الرابط (Linker) العملية بربط استدعاءات الدوال لإنشاء ملف قابل للتنفيذ. أما فك الترجمة فيتضمن تحويل الكود الثنائي مرة أخرى إلى ملف مصدري. وبما أن نماذج اللغة الكبيرة مُدرَّبة على النصوص، فإنها تفتقر إلى القدرة على معالجة البيانات الثنائية مباشرة. لذلك، يجب أولًا تفكيك الملفات الثنائية بواسطة Objdump إلى لغة تجميع (ASM). تجدر الإشارة إلى أن الكود الثنائي ولغة التجميع المُفكَّكة متكافئان ويمكن التحويل بينهما، ولهذا نشير إليهما بالتبادل. وأخيرًا، يُحسب الفقد (loss) بين الكود المُفكَّك والكود المصدري لتوجيه التدريب. ولتقييم جودة الكود المُفكَّك (SRC')، يُختبر أداؤه الوظيفي من خلال تأكيدات الاختبار (قابلية إعادة التنفيذ).
المقاييس
تقيّم قابلية إعادة التنفيذ (Re-executability) ما إذا كان الكود المُفكَّك قادرًا على التنفيذ بشكل صحيح واجتياز جميع حالات الاختبار المحددة مسبقًا.
المعايير
HumanEval-Decompile: مجموعة من 164 دالة بلغة C تعتمد حصريًا على مكتبات C القياسية.
ExeBench: مجموعة من 2,621 دالة مأخوذة من مشاريع حقيقية، تستخدم كل منها دوالًا وهياكل ووحدات ماكرو معرّفة من قبل المستخدم.
النتائج
النماذج
تشمل LLM4Decompile نماذج بأحجام تتراوح بين 1.3 مليار و33 مليار معامل، وقد أتاحنا هذه النماذج على Hugging Face.
ملاحظة 3: تم تدريب سلسلة V1.5 على مجموعة بيانات أكبر (15 مليار رمز) وبحد أقصى لحجم الرموز يبلغ 4,096، مع أداء ملحوظ (تحسن بأكثر من 100%) مقارنة بالنموذج السابق.
ملاحظة 4: سلسلة V2 مبنية على Ghidra ومُدرَّبة على ملياري رمز لـتحسين شبه الكود المُفكَّك من Ghidra. راجع مجلد ghidra للتفاصيل.