
بعض السكربتات الخاصة بـ IDA Pro للمساعدة في الهندسة العكسية لملفات EFI الثنائية
بعض نصوص IDA البرمجية للمساعدة في الهندسة العكسية لملفات EFI القابلة للتنفيذ.
تحتوي هذه الحزمة على الملفات التالية:
efiutils.py - وحدة IDAPython تحتوي على بعض الدوال المساعدة
efiguids.py - مجموعة من المعرفات الفريدة المعروفة (GUIDs) لبروتوكولات EFI
efiguids_ami.py - مجموعة من المعرفات الفريدة المعروفة (GUIDs) للبروتوكولات المستخدمة في BIOS من نوع AMI
behemoth.h - ملف رأس ضخم يحتوي على مجموعة من تعريفات الأنواع والهياكل لـ EFI
structs.idc - نص IDC يحتوي على بعض تعريفات الهياكل (تم استبداله بـ behemoth.h)
te_image.bt - قالب محرر 010 لصور TE الثنائية
te_loader.py - نص محمّل IDA Pro لصور TE الثنائية
هذه أول محاولة لي في كتابة نصوص IDA، لذا أرجو المعذرة وأخبروني إذا كنت قد أعدت اختراع العجلة/فعلت أي شيء غير منطقي.
الدوال الرئيسية المفيدة موصوفة أدناه. راجع الكود وسلاسل التوثيق (docstrings) لمزيد من المعلومات حول الدوال الأخرى.
rename_tables()تبحث عن نقطة الدخول الأولى للملف الثنائي، وتحاول تتبع المعاملات التي تم تمريرها إلى دالة نقطة الدخول وإعادة تسمية المتغيرات العامة التي يتم تخزين جداول EFI الرئيسية فيها. يتم تنفيذ عمليات إعادة التسمية التالية:
المتغير العام الذي ينتهي فيه ImageHandle يُعاد تسميته إلى gImageHandle.
المتغير العام الذي ينتهي فيه SystemTable يُعاد تسميته إلى gSystemTable.
المتغير العام الذي ينتهي فيه SystemTable->BootServices يُعاد تسميته إلى gBootServices.
المتغير العام الذي ينتهي فيه SystemTable->RuntimeServices يُعاد تسميته إلى gRuntimeServices.
سيتم تتبع تعليمات الاستدعاء (Call) حتى عمق مستوى واحد فقط، حيث أن معظم الملفات القابلة للتنفيذ تنسخ مراجع الجداول في نقطة الدخول أو في دالة يتم استدعاؤها من نقطة الدخول. غيّر MAX_STACK_DEPTH إذا لزم الأمر.
update_structs()تبحث عن المراجع المتقاطعة (cross-references) للجداول التي تمت إعادة تسميتها أعلاه، وتحدّث أسمائها لتكون إزاحات هياكل (struct offsets) من الهياكل المناسبة. إذا فشلت rename_tables() فستحتاج إلى إعادة تسمية الأشياء يدويًا كما هو موضح أعلاه لكي يعمل هذا بشكل صحيح.
على سبيل المثال:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
يصبح:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()تبحث عن المعرفات الفريدة (GUIDs) في مقاطع البيانات وتعيد تسميتها. تم استخراج 470 معرفًا فريدًا لبروتوكولات من مصدر TianoCore، وسيتم إضافة المعرفات الفريدة الخاصة (Apple وغيرها من البائعين) عند مواجهتها.
go()طريقة ملائمة تقوم بكل ما سبق.
قم بتحميل ملف EFI الثنائي في IDA Pro
استورد behemoth.h لتعريف هياكل البيانات اللازمة
أضف الهياكل من الأنواع المحلية إلى قاعدة بيانات IDB الخاصة بك
شغّل efiutils.py لإضافته إلى مسار بايثون (أو افعل ذلك بطريقة أخرى)
ألقِ نظرة على الكود/سلاسل التوثيق، ولكن على الأرجح:
import efiutils; efiutils.go()
لاستخدام محمّل صور TE te_loader.py، قم بتثبيته كما تفعل مع أي محمّل آخر. على نظام OS X يتم ذلك عن طريق نسخه أو إنشاء رابط رمزي (symlink) له داخل مجلد المحمّلات في idaq.app/Contents/MacOS/loaders/.