تقوم هذه الأداة بمسح ملف قابل للتنفيذ لبيانات Delphi ، بما في ذلك RTTI وجداول الوظائف الظاهرية. إنه يخرج ملف JSON بمعلومات حول الفئات والوظائف المحددة ، والتي يمكن استخدامها لتحليل إضافي ، على سبيل المثال:
يتم توفير البرنامج النصي Idapython الذي يمكنه تحميل الإخراج في IDA.
تمت كتابة البرنامج النصي لتكملة الأدوات الأخرى للهندسة العكسية Delphi.
تم إصدارها كمصدر مفتوح بواسطة NCC Group PLC - http://www.nccgroup.com/
تم تطويره بواسطة David Cannings (eedeca) [email protected]
http://www.github.com/nccgroup/pythia
يتم إصدار هذا المشروع بموجب ترخيص AGPL. يرجى الاطلاع على الترخيص لمزيد من المعلومات.
التدفق العالي المستوى هو:
تم توثيق delphi vftables بشكل جيد. تتوفر معلومات عن أحدث إصدار من Embarcadero. الوثائق غير الرسمية متاحة لـ Delphi 2005 (انظر هنا).
رمز المصدر لـ Free Pascal مفيد أيضًا (Github Mirror).
العنصر الأول في VFTable هو vmtSelfPtr ، والذي يشير إلى بداية جدول الوظائف الافتراضية. يقوم البرنامج النصي بمسح كل قطاع رمز في ملف PE لأي موقع يشير إلى الأمام +0x4C بايت. لاحظ أن برنامج التحويل البرمجي Delphi يحاذي Vftables مع حدود 4 بايت (للتحسين).
على سبيل المثال ، يحتوي VA 0x0046E1C8 التالي على الإزاحة 0x0046E214 ، وهو 0x4C قبل الموقع الحالي. كما هو موضح في IDA:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
يمكن أن يولد هذا النهج إيجابيات كاذبة ، وبالتالي يتم فحص الحقول الأخرى في VFFABLE لقيم معقولة. على سبيل المثال ، يتم التحقق من vmtInstanceSize للتأكد من أنها ليست مفرطة ويتم التحقق من المؤشرات الوظيفية لتتمكن من الاستلقاء في قسم قابل للتنفيذ. أثناء اختبار ، كان معدل الإيجابية الخاطئة منخفضًا للغاية ، على الرغم من طريقة البحث عن القوة الغاشمة.
يتم التحقق من كل وظيفة موجودة في VFTABLE لمعرفة ما إذا كانت ورثتها من الوالد أو تم تحميلها. لا تدعم Delphi الميراث المتعدد ، لذا يمكن تحقيق ذلك عن طريق التحقق من المؤشر في الوالد VFTABLE مع نفس الإزاحة.
إذا كانت كلا المؤشرين تشير إلى نفس الوظيفة ، فهي موروثة. إذا كان لدى الطفل مؤشر مختلف ، فقد تم تحميله بشكل زائد.
الإخراج الأساسي من الأداة هو ملف JSON يمكن تغذيةه في المعالجة / الأدوات اللاحقة. ومع ذلك ، يتم تضمين بعض تنسيقات الإخراج الأخرى.
استخدم خيار --save-tree لإنشاء ملف مثل:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. etc ..
PACKAGEINFO أو DVCLAL Resource) وضبط المسح للتخطيطات المختلفة القابلة للتطبيقات.call [ecx+3Fh] إلى طريقة مثيل)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> التي لا يمكن تحريفها إلى حد ما في IDA.من فضلك أرسل لي أمثلة على الثنائيات التي لا تعمل فيها هذه الأداة ، بحيث يمكن تحسينها.