
مؤرّخ برمجيّات ثابتة يعمل فقط على الثنائيات، يتعلّم تحديد مواقع الدوال في الثنائيات الخام عبر استخراج الدوال المعروفة من ثنائيات مشابهة، مما يتيح مطابقة سريعة للدوال دون الحاجة إلى التفكيك لتحليل البرمجيّات الثابتة المضمّنة.
Polypyus يتعلم تحديد مواقع الدوال في الملفات الثنائية الخام عن طريق استخراج الدوال المعروفة من ملفات ثنائية مماثلة. وبالتالي، فهو مؤرخ للبرامج الثابتة. يعمل Polypyus دون فك تجميع هذه الملفات الثنائية، وهي ميزة للملفات الثنائية المعقدة في فك التجميع والتي تفتقد فيها الأدوات الشائعة إلى الدوال. بالإضافة إلى ذلك، فإن النهج القائم على الملفات الثنائية فقط يجعله سريعًا جدًا ويعمل في غضون ثوانٍ قليلة. ومع ذلك، يتطلب هذا النهج أن تكون الملفات الثنائية لنفس البنية ولها خيارات مترجم مماثلة.
Polypyus يتكامل مع سير عمل الأدوات الحالية مثل Ghidra و IDA و BinDiff و Diaphora. على سبيل المثال، يمكنه استيراد الدوال المشروحة سابقًا والتعلم منها، وكذلك تصدير الدوال التي تم العثور عليها لاستيرادها إلى IDA. نظرًا لأن Polypyus يستخدم حدودًا صارمة إلى حد ما، فقد وجد فقط التطابقات الصحيحة في تجاربنا. بينما يؤدي هذا إلى نتائج أقل من الأدوات الحالية، إلا أنه نقطة انطلاق جيدة لتحميل هذه التطابقات إلى IDA لتحسين نتائج التحليل التلقائي ثم تشغيل BinDiff فوقها.
عند العمل على ملفات البرامج الثابتة الثنائية الخام، وتحديدًا إصدارات برامج Bluetooth الثابتة من Broadcom و Cypress، وجدنا أن التحليل التلقائي لـ IDA غالبًا ما يحدد بدايات الدوال بشكل غير صحيح. في IDA Pro 6.8، كان التحليل التلقائي أكثر عدوانية، مما أدى إلى نتائج أكثر ولكن أيضًا إلى نتائج إيجابية خاطئة أكثر. بشكل عام، كان IDA Pro 7.2 أكثر تشاؤمًا، لكنه أغفل الكثير من الدوال. أدى هذا إلى عدد قليل فقط من تطابقات BinDiff بين برامجنا الثابتة في IDA Pro 6.8 وعدم وجود تطابقات مفيدة على الإطلاق في IDA Pro 7.2.
من المثير للاهتمام أن BinDiff فشل غالبًا في تحديد الدوال التي كانت متطابقة بايتيًا باستثناء الفروع. لاحظ أن Polypyus يبحث تحديدًا عن هذه الدوال المتطابقة بايتيًا. نفترض أن BinDiff يفشل في هذه الدوال بسبب رسم بياني للاستدعاءات مختلف ينتج عن الدوال المفقودة والنتائج الإيجابية الخاطئة. أحيانًا، كانت هذه الدوال معروفة بالفعل بواسطة IDA، لكن في كثير من الأحيان، لم يتعرف IDA عليها ككود أو لم يضع علامة عليها كدوال. لاحظ أن Diaphora لديه مشاكل مماثلة، حيث يصدر الدوال التي حددها IDA قبل معالجتها بشكل أكبر. يوضح التالي معيارًا على الملف الثنائي للبرامج الثابتة Bluetooth CYW20735B1 يقارن بين مختلف أدوات فك التجميع وكيف تؤدي إخفاقات أداة فك التجميع إلى مشاكل في المقارنة اللاحقة.
علاوة على ذلك، بينما وجدنا أن Amnesia يجد العديد من الدوال، فإنه يجد أيضًا العديد من النتائج الإيجابية الخاطئة. ومع ذلك، فإن العديد من الدوال تحتوي على إعداد إطار مكدس مماثل في البداية. وبالتالي، فإن Polypyus لديه خيار لتعلم بدايات الدوال الشائعة من ملفات الإدخال الثنائية المشروحة وتطبيق ذلك على ملفات ثنائية أخرى لتحديد الدوال دون مطابقة اسمها. يتم تطبيق هذه الخطوة الاختيارية فقط على المناطق التي لم يتم تحديد موقع الدوال فيها مسبقًا، وبهذه الطريقة لا تتعارض طريقة بدايات الدوال الشائعة مع العثور على الدوال الرئيسية.
نظرًا لأن هذه المطابقات تعمل على الملف الثنائي الخام، فهي لا تعتمد على أداة فك التجميع. هذا أيضًا له عيب مهم واحد: إذا كانت هناك خيارات مترجم مختلفة أو بنية هدف مختلفة، فلن يكتشف Polypyus الدوال المتشابهة. علاوة على ذلك، بينما تكون التطابقات المحددة موثوقة للغاية، فإن تحديد بداية الدالة أقل موثوقية قليلاً، لذا استخدم الأخير بحذر. في التالي، يمكنك أن ترى أن مجموعات تقييم Cypress متشابهة جدًا مع بعضها البعض، لكن برنامج MacBook الثابت مختلف جدًا.
Polypyus ينشئ مطابقات ثنائية ضبابية من خلال مقارنة الدوال الشائعة في مجموعة من الملفات الثنائية للبرامج الثابتة المشروحة.
حاليًا، يتم دعم التعليقات التوضيحية التالية:
patch.elf من WICED Studio، وهو ملف ELF خاص يحتوي على تعريفات رموز فقط..symdefs كما يتم إنتاجه بواسطة معظم مترجمات ARM..csv بتنسيق موثق في مجلد firmware.تحتوي هذه التعليقات التوضيحية على العنوان والحجم واسم الدوال المعروفة. كلما زادت القواسم المشتركة بين ملفات الإدخال الثنائية في مجموعة التاريخ، كان ذلك أفضل لأداء ونتائج Polypyus. مع وجود عدة دوال مختلفة قليلاً، يقوم Polypyus بإنشاء مطابقات جيدة جدًا.
Polypyus يتطلب Python 3 >= 3.6. ننصح باستخدام virtualenv للتثبيت التالي. استنسخ هذا المستودع وفي هذا المجلد قم بتشغيل:
pip install .
بعد التثبيت، تتوفر الأوامر التالية:
polypyus-guipolypyus-cliPolypyus متاح من خلال واجهة رسومية وواجهة سطر أوامر. كليهما، الواجهة الرسومية polypyus-gui وواجهة سطر الأوامر polypyus-cli، يأخذان هذه الوسائط أثناء الاستدعاء:
--verbose is the verbosity level. By default, it shows warnings -v shows info -vv show debug information.
--project sets the location of the project file. This is either a file path or ":memory:".
--help Show help message.
خيار المشروع يسهل عليك تخزين عملك لسياقات مختلفة في ملفات مختلفة وإعادة فتحها مرة أخرى.
سير العمل العام للواجهة الرسومية ينتقل من الجانب الأيسر للنافذة إلى اليمين. أولاً، تتم إضافة الملفات الثنائية إلى التاريخ. ثم تتبع تعليقات الرموز التوضيحية للإدخالات في التاريخ. بعد ذلك، يمكن إضافة الملفات الثنائية الهدف. للمطابقة، اضغط على Create matchers from history. بمجرد إنشاء المطابقات، يمكن تحديد أهداف فردية، أو مطابقة جميع الأهداف عن طريق اختيار batch match. أخيرًا، يمكن تصدير النتائج إلى ملف .csv.
في التالي يمكنك مشاهدة فيديو توضيحي حيث يستغرق Polypyus بضع ثوانٍ فقط للتعلم من ملفين ثنائيين للإدخال، والتعليق عليهما، وإنشاء مطابقات، وتطبيق التطابقات على ملف ثنائي جديد.
ميزة استخدام واجهة سطر الأوامر هي قدرتها على الأتمتة. حتى الآن، يخضع تنسيق إخراج واجهة سطر الأوامر للتغيير. ومع ذلك، إليك مثال على استدعائها:
polypyus-cli --history firmware/history/20819-A1.bin --annotation firmware/history/20819-A1_patch.elf --history firmware/history/20735B1.bin --annotation firmware/history/20735B1_patch.elf --project test.sqlite
polypyus-cli --target firmware/history/20739B1.bin --project test.sqlite
الأمر الأول ينشئ test.sqlite كملف مشروع جديد ويستورد 20819-A1.bin و 20735B1.bin مع ملفات patch.elf الخاصة بكل منهما. الاستدعاء الثاني يعيد استخدام نفس ملف المشروع ويطابق الملف الثنائي 20739B1.bin. لكل أمر، يجب أن يتطابق عدد --history و --annotation. يمكن أيضًا دمج هذين الأمرين في أمر واحد عن طريق إضافة الوسيطة --target إلى الأمر الأول.
تم نشر ورقة تشرح التفاصيل الداخلية في Workshop on Binary Analysis Research (BAR) 2021 بعنوان Polypyus - The Firmware Historian. بعض التفاصيل الإضافية موجودة أيضًا في عرض تقديمي نهائي لرسالة ماجستير جان، والذي يغطي المشكلات التي تمت مواجهتها عند العمل بالطرق التقليدية لمقارنة الملفات الثنائية في وضع ARM Thumb2، وكيف يعمل النهج البديل القائم على الملفات الثنائية فقط.
تحتوي الرموز المسربة في تنسيق patch.elf أو .symdefs فقط على أسماء الدوال والمتغيرات العامة. ومع ذلك، هناك أيضًا عدد من ملفات مشروع Eclipse .pdom في WICED Studio 6.2 و 6.4. تحتوي هذه على معلومات نوع إضافية. يستخدمها Eclipse داخليًا للإكمال التلقائي والبحث عن الدوال وما إلى ذلك، ويمكننا الاستفادة منها بشكل عكسي لإضافة معلومات النوع. نظرًا لأن ملفات .pdom تحتوي فقط على معلومات جزئية ومخزنة مؤقتًا، فقد يكون من المفيد دمج عدة ملفات منها.
في الخطوة الأولى، نقوم بتصدير معلومات نوع .pdom إلى قاعدة بيانات SQLite. يستغرق التصدير بعض الوقت، ولكن يمكن حتى إحباطه ومتابعته لاحقًا. يعمل التصدير على النحو التالي:
java -jar pdom/export/export.jar -P BCM20739-B0.1462220149391.pdom