أول مهندس عكسي وكيل في العالم.
تنسيق النماذج اللغوية الكبيرة لهندسة الباينري العكسية
معظم المهام تتبع علاقة خطية: كلما كانت المهمة أصعب، كلما استغرقت وقتًا أطول عادةً. الهندسة العكسية (وتحليل الباينري) هي مهمة تكون الصعوبة الفعلية فيها تافهة إلى حد ما، لكن وقت التنفيذ يمكن أن يصل إلى ساعات (وأيام!)، حتى بالنسبة لباينري يحتوي على بضع مئات من الدوال.
يقوم كونغ بأتمتة الطبقة الميكانيكية، باستخدام إطار عمل للهندسة العكسية من فئة وكالة الأمن القومي. يمكن لكونغ أن يأخذ باينري مبهم بالكامل ومجرد من الرموز ويشغل خط أنابيب تحليل كامل: فرز الدوال، بناء سياق رسم بياني للاستدعاءات، استعادة الأنواع والرموز من خلال فك الترجمة الموجه بواسطة النماذج اللغوية الكبيرة، وكتابة النتائج مرة أخرى في قاعدة بيانات برنامج جيدرا. الناتج هو باينري حيث أصبح FUN_00401a30 الآن parse_http_header، مع هياكل مستعادة وأسماء معاملات واتفاقيات استدعاء.
لماذا هذا موجود
تفقد الباينري المجردة من الرموز كل السياق الذي يجعل الكود قابلًا للقراءة: أسماء الدوال، معلومات الأنواع، أسماء المتغيرات، تخطيطات الهياكل. استعادة هذا السياق تشكل الجزء الأكبر من العمل في معظم مهام الهندسة العكسية، وهي إلى حد كبير مطابقة أنماط: التعرف على دوال المكتبة القياسية، استنتاج الأنواع من الاستخدام، نشر الأسماء عبر رسوم الاستدعاءات.
النماذج اللغوية الكبيرة جيدة في هذا النوع من مطابقة الأنماط. لكن توجيه نموذج لغوي كبير إلى إخراج مفكك الترجمة الخام وسؤاله "ماذا يفعل هذا؟" يعطي نتائج متوسطة. يفتقر النموذج إلى سياق الاستدعاء، معلومات المراجع المتقاطعة، والصورة الأوسع لكيفية تنظيم الباينري. بالإضافة إلى ذلك، تقدم معظم الباينري المبهمة تقنيات متطرفة لمنع الهندسة العكسية.
يحل كونغ هذه المشكلة عن طريق بناء نوافذ سياق غنية من تحليل برنامج جيدرا (رسوم الاستدعاءات، المراجع المتقاطعة، مراجع السلاسل، تدفق البيانات) قبل لمس النموذج اللغوي الكبير، ثم تنسيق التحليل بترتيب التبعية بحيث تستفيد كل دالة من أسماء الدوال التي تستدعيها والتي تم تسميتها مسبقًا. بالإضافة إلى ذلك، يقدم كونغ خط أنابيب إزالة إبهام وكيل من نوعه الأول من نوعه.
يعمل كونغ مع معظم الباينري القابلة للفك بواسطة جيدرا (في الوقت الحالي، المزيد قادم).
| C | C++ | Go | Rust | |
|---|---|---|---|---|
| x86 | عالية | عالية | متوسطة | متوسطة |
| x86-64 | عالية | عالية | متوسطة | متوسطة |
| ARM (32-bit) | عالية | عالية | متوسطة | منخفضة |
| AArch64 | عالية | عالية | متوسطة | منخفضة |
| MIPS | متوسطة | متوسطة | منخفضة | منخفضة |
| PowerPC | متوسطة | متوسطة | منخفضة | منخفضة |
عالية: يقوم كونغ بشكل موثوق بفك الترجمة، وإزالة الإبهام، واستعادة الأسماء والأنواع والبنية.
متوسطة: فك الترجمة قابل للاستخدام لكنه أكثر ضوضاء. توقع استعادة جزئية ودرجات ثقة أقل.
منخفضة: فك الترجمة به فجوات كبيرة وستبقى النتائج غير مكتملة أو صاخبة أو غير قابلة للقراءة.
ملاحظة: حجم الباينري يتناسب طرديًا مع عدد الدوال، تكلفة النموذج اللغوي الكبير، والوقت حتى الاكتمال. ومع ذلك، حجم الباينري يتناسب عكسيًا مع الثقة، لذا ضع هذا في الاعتبار عند تحليل باينري أكبر.
يستخدم كونغ خط أنابيب من خمس مراحل بقيادة مشرف ينسق الفرز والتحليل المتوازي والمعالجة اللاحقة:
┌──────────────────────────┐
│ الفرز │
│ تعداد، تصنيف، │
│ بناء رسم الاستدعاءات، │
│ مطابقة التوقيعات │
└──────────┬───────────────┘
│
▼
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ تحليل │ │ تحليل │ │ ... │
│ (دوال طرفية)│ │ (الطبقة التالية)│ │ │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬───────┴────────────────┘
│
▼
┌──────────────────────────┐
│ التنظيف │
│ تطبيع، إزالة التكرار │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ التوليف │
│ توحيد الأسماء، بناء │
│ الهياكل، إزالة الإبهام │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ التصدير │
│ analysis.json + │
│ كتابة إلى جيدرا │
└──────────────────────────┘
الفرز يقوم بتعداد جميع الدوال في الباينري، ويصنفها حسب الحجم (تافهة / صغيرة / متوسطة / كبيرة)، ويبني رسم الاستدعاءات، ويكتشف لغة المصدر، ويشغل مطابقة التوقيعات ضد دوال المكتبة القياسية والدوال المشفرة المعروفة. يتم وضع علامة على الدوال المطابقة بالتوقيع على أنها محلولة ويتم تخطي تحليل النموذج اللغوي الكبير بالكامل.