
مؤرّخ برمجيّات ثابتة يعمل فقط على الثنائيات، يتعلّم تحديد مواقع الدوال في الثنائيات الخام عبر استخراج الدوال المعروفة من ثنائيات مشابهة، مما يتيح مطابقة سريعة للدوال دون الحاجة إلى التفكيك لتحليل البرمجيّات الثابتة المضمّنة.
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
يبحث استيراد PDOM عن أسماء الدوال في قاعدة بيانات IDA، ويبحث عنها في PDOM للبحث عن معلومات النوع، ثم يطبق معلومات النوع تلك في قاعدة بيانات IDA. وبالتالي، يجب أن تحتوي قاعدة بيانات IDA على أسماء دوال صحيحة مسبقًا. من حيث المبدأ، يمكن إنشاؤها باستخدام نصوص import_export من Polypyus. ومع ذلك، يمكن للبرامج النصية الأكثر تقدمًا التي تدعم استيراد PDOM أيضًا التعامل مع أقسام patch.elf. قم بتشغيل المستورد على النحو التالي:
T=0x1 (Alt-g).patch.elf (Select file).20739mapb0.h لتسمية سجلات الأجهزة (Import map.h).تم اختبار هذا البرنامج النصي على IDA Pro 7.4 و 7.5.
بعد بعض الاختبارات الداخلية، يمكننا التوصية بسير العمل التالي عند العمل مع IDA Pro و Polypyus:
Alt-g, T=0x1).0x0 مع rx، RAM عند 0x200000 مع rwx (على الأقل للبرامج الثابتة Bluetooth).0x4 (o).
على البرنامج الثابت CYW20735 يشير إلى 0x3bc+1. ارجع بايتًا واحدًا وأنشئ دالة (p)....الآن قد تكون قاعدة بيانات IDA الخاصة بك مفيدة إلى حد ما :) لا يزال هناك الكثير من الأشياء التي يفشل فيها مفكك التجميع ضمن ARM Thumb2 ولكنها أفضل بكثير من أي شيء يفعله IDA بمفرده.
يحتوي مجلد firmware على العديد من البرامج الثابتة مع وبدون رموز.
كل شيء في history يحتوي على رموز، وكل شيء في targets بدون رموز.
بالنسبة لسلسلة Samsung، تشمل S8 أيضًا Note 8 و S8+ وما إلى ذلك، و S10/S20 تشمل أيضًا كل شيء من S10e حتى Note 20 5G.
قد تختلف جودة التفريغ، بعضها مع RAM والبعض الآخر مجرد ROM. لدينا إمكانية الوصول إلى معظم الأجهزة في هذه القائمة. إذا كنت بحاجة إلى تفريغ بأحدث مستويات التصحيح بما في ذلك RAM، فلا تتردد في الاتصال بنا.
بعض الأجهزة المذكورة في الورقة غير متضمنة هنا، لأنها قد لا تكون أجهزة بحثية فقط إلخ. بعض أجهزة iPhone و MacBooks مفقودة أيضًا، نظرًا لأننا نمتلكها كأجهزة بحثية فقط ولكن التفريغ الأصلي لم يكن كذلك. هذه الأجهزة ستتم إضافتها قريبًا :)
يوجد ملف .editorconfig في هذا المستودع. يقوم بتكوين نمط المسافة البادئة ومجموعة الأحرف وفواصل الأسطر. اتبع هذا التكوين عند المساهمة، والذي يمكن تسهيله باستخدام إضافة IDE لـ .editorconfig.
لتثبيت تبعيات الاختبار، قم بتنفيذ
pip install '.[test]'
سيؤدي هذا إلى تثبيت الحزم المطلوبة فقط لتنفيذ حالات الاختبار.
توفر تبعيات التطوير، على سبيل المثال، نماذج لأنواع الحزم. لتثبيتها، قم بتشغيل
pip install '.[development]'
pytest سيقوم بتشغيل جميع الاختبارات.
يستخدم المشروع tox لتشغيل الاختبارات محليًا ضد إصدارات مختلفة من Python. تم إعداد Tox للاختبار ضد الإصدارات 3.6 و 3.7 و 3.8 و 3.9. لتشغيل tox، قم بتثبيت تبعيات الاختبار وقم بتثبيت هذه الإصدارات الأربعة المذكورة من Python. طريقتنا الموصى بها لتثبيت وإدارة عدة إصدارات من Python هي pyenv.
الخطوات:
pyenv install 3.9.1
pyenv install 3.8.6
pyenv install 3.7.9
pyenv install 3.6.12
pyenv virtualenv 3.9.1 polypyus
penv local polypyus 3.8.6 3.7.9 3.6.12
pip install '.[test]'
pip install '.[development]'
toxيستخدم Polypyus GitHub Actions لتشغيل الاختبارات الآلية وبعض تمحيص الكود. إذا كنت ترغب في ذلك، يمكنك تشغيل خطوات تمحيص الكود محليًا باستخدام خطافات git قبل الالتزام.
في كل مرة قبل إنشاء التزام جديد، سيؤدي ذلك إلى تشغيل تمحيص الكود وإظهار المشكلات التي ستمنع هذا الكود من النجاح في خطوة تمحيص الكود في GitHub Actions. سيقوم أيضًا بتنسيق الملفات التي تم تغييرها باستخدام black .
pip install '.[development]'
pre-commit install
نشكر Anna Stichling على إنشاء شعار Polypyus. نشكر أيضًا Christian Blichmann و Joxean Koret على ملاحظاتهم.
Polypyus هو برنامج مفتوح المصدر ومرخص بموجب GPLv3.
| الشريحة | الجهاز | تاريخ البناء | الرموز |
|---|
| BCM20703A2 | MacBook/iMac 2016-2017 | Oct 22 2015 | ✔ |
| CYW20719B1 | Evaluation board | Jan 17 2017 | ✔ |
| CYW20735B1 | Evaluation board | Jan 18 2018 | ✔ |
| CYW20819A1 | Evaluation board | May 22 2018 | ✔ |
| الشريحة | الجهاز | تاريخ البناء | الرموز |
|---|
| BCM2046A2 | iMac Late 2009 | 2007? | - |
| BCM2070B0 | MacBook 2011, Thinkpad T420 | Jul 9 2008 | - |
| BCM20702A1 | Asus USB Dongle | Feb (?) 2010 | - |
| BCM4345B0 | iPhone 6 | Jul 15 2013 | - |
| BCM4335C0 | Google Nexus 5 | Dec 11 2012 | - |
| BCM4345B0 | Google Nexus 6P / Galaxy S6 | Oct 23 2014 | - |
| BCM43430A1 | Raspberry Pi 3 and Zero W | Jun 2 2014 | - |
| BCM4345C0 | Raspberry Pi 3+ and 4 | Aug 19 2014 | - |
| BCM4347B0 | Samsung Galaxy S8 series | Jun 3 2016 | - |
| BCM4375B1 | Samsung Galaxy S10/20 series | Apr 13 2018 | - |
| BCM4378B1 | iPhone 11/SE2 | Oct 25 2018 | Strings |