
أداة IDAPython لإنشاء جداول افتراضية C++ تلقائية في IDA Pro
Virtuailor هي أداة IDAPython تعيد بناء جداول الدوال الافتراضية (vtables) لشفرة C++ المكتوبة لمعمارية إنتل، لكل من الشفرات 32 بت و64 بت و AArch64 (جديد!). تتكون الأداة من جزئين: ثابت وديناميكي.
الجزء الأول هو الجزء الثابت، ويحتوي على القدرات التالية:
الجزء الثاني هو الجزء الديناميكي، ويحتوي على القدرات التالية:
تدعم Virtuailor الآن إصدارات IDA من 7.0 إلى أحدث إصدار (7.5)، إذا كنت تستخدم إصدارات IDA أقدم من 7.4، فستحتاج إلى التبديل إلى فرع beforeIDA-7.4، أما فرع master فيدعم أحدث إصدار متاح (7.5).
if __name__ == '__main__':
start_addr_range = idc.MinEA() # يمكنك تغيير نطاق عناوين الاستدعاءات الافتراضية
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
اختياري (لكنه موصى به بشدة)، قم بإنشاء لقطة (snapshot) لقاعدة بيانات IDA الخاصة بك. فقط اضغط على ctrl+shift+t وأنشئ لقطة.
اضغط على File->Run script... ثم انتقل إلى مجلد Virtuailor واختر تشغيل Main.py. يمكنك رؤية الصورة المتحركة التالية للحصول على شرح أوضح وأكثر بصرية.

الآن ستوفر لك الواجهة الرسومية خيارًا لاختيار نطاق للاستهداف، في حال كنت ترغب في استهداف الملف الثنائي بالكامل، فقط اضغط على OK مع القيم الافتراضية في عناوين البداية والنهاية.
بعد ذلك، سيتم وضع نقاط التوقف في شفرتك، وكل ما عليك فعله هو تنفيذ شفرتك باستخدام مصحح IDA، وقم بأي إجراءات تريدها وشاهد كيف يتم بناء جداول الدوال الافتراضية! بالنسبة لـ AArch64، يمكنك إعداد خادم gdb عن بعد وتصحيح الأخطاء باستخدام مصحح IDA.
في حال لم تعد ترغب/تحتاج إلى نقاط التوقف، انتقل إلى علامة التبويب "قائمة نقاط التوقف" في IDA واحذف نقاط التوقف كما تشاء.
من المهم أيضًا أن أذكر أن هذه هي النسخة الثانية من الأداة مع دعم كل من 32 و64 بت و AArch64، ومن المحتمل في بعض الحالات أن يتم تفويت عدد قليل من نقاط التوقف، وفي هذه الحالات، يرجى فتح مشكلة (issue) والتواصل معي حتى أتمكن من تحسين الشفرة والمساعدة في إصلاحها. شكرًا لكم مقدمًا :)
الهياكل التي تنشئها Virtuailor من جدول الدوال الافتراضية المستخدم في الاستدعاء الافتراضي الذي تم تنشيطه. يتم استخراج دوال جدول الدوال الافتراضية من الذاكرة بناءً على السجل ذي الصلة المستخدم في كود العملية الخاص بنقطة التوقف.
نظرًا لأنني أردت إنشاء علاقة بين الهيكل في IDA وجداول الدوال الافتراضية في قسم البيانات، فإن نقطة التوقف تغير اسم عنوان جدول الدوال الافتراضية في قسم البيانات ليتوافق مع اسم الهيكل. كما ترى في الصورة التالية:

يتم أيضًا تغيير أسماء الدوال الافتراضية، باستثناء الحالات التي لا تكون فيها الأسماء هي الأسماء الافتراضية لـ IDA (دوال تحتوي على رموز أو دوال قام المستخدم بتغييرها)، ففي هذه الحالات ستبقى أسماء الدوال كما هي وستتم إضافتها أيضًا إلى هيكل جدول الدوال الافتراضية باسمها الحالي.
يتم إنشاء الأسماء المختارة باستخدام النمط التالي:
بعد إنشاء جدول الدوال الافتراضية، تقوم Virtuailor أيضًا بإضافة اتصال بين الهيكل الذي تم إنشاؤه والتجميع كما ترى في الصور التالية:

ملاحظة: إزاحة الهيكل المستخدمة في نقطة التوقف ذات صلة فقط بآخر استدعاء تم إجراؤه، من أجل الحصول على فهم أفضل لجميع الاستدعاءات الافتراضية التي تم إجراؤها، تمت إضافة ميزة المراجع المتبادلة (xref) كما هو موضح في القسم التالي.
عند إجراء الهندسة العكسية لـ C++ بشكل ثابت، ليس من السهل رؤية من استدعى من، وذلك لأن معظم الاستدعاءات هي استدعاءات غير مباشرة، ولكن بعد تشغيل Virtuailor، كل دالة تم استدعاؤها بشكل غير مباشر أصبح لديها مرجع متبادل (xref) لتلك المواقع.
الصورة المتحركة التالية توضح المراجع المتبادلة المضافة مع استدعاء الدالة غير المباشرة الخاص بها:

تم تقديم الأداة في مؤتمرات RECon Brussels و Troopers و Warcon. يمكن العثور على العرض التقديمي في الرابط التالي: https://www.youtube.com/watch?v=Xk75TM7NmtA
طواقم REcon Brussels و Troopers و Warcon، Nana، @tmr232، @matalaz، @oryandp، @talkain، @shiftreduce
الملحق الإضافي مرخص بموجب رخصة GNU GPL v3.