
C++ DLL تقوم بتنفيذ اعتراض جدول عناوين الاستيراد (Import Address Table hooking) عبر تحليل ترويسات PE وإعادة توجيه عناوين الدوال المستوردة إلى خطاف مخصص داخل عملية مستهدفة.
الاعتراض (Hooking) هو تقنية تتيح للمستخدم إعادة توجيه مسار تنفيذ البرنامج. في معظم الأحيان نستخدم اعتراض الدوال (function hooking). إما أن نستبدل دالة أو نعيد توجيهها إلى دالتنا الخاصة، وهذا مفيد جدًا وله حالات استخدام متعددة. هناك طرق متعددة للاعتراض، وهنا ننظر إلى IAT Hooking، وهو اختصار لـ Import Address Table. يتمثل في استبدال عنوان دالة بعنوان دالتنا الخاصة في جدول كبير يُملأ في وقت التشغيل. كما ذكرت سابقًا في مستودع آخر، أوصيك بقراءة المزيد عن PE Format لفهم جزء تحليل IAT في هذا الكود.
إليك مخططًا أساسيًا لكيفية عمل IAT Hooking. في هذا المثال، يتم استدعاء الدالة الأصلية بعد تنفيذ الكود الخبيث. في هذا المثال سنقوم ببساطة باستدعاء دالة أخرى بدلاً من الدالة الأصلية. ميزة هذه التقنية أنها لا تتطلب تعديل جسم الدالة على عكس اعتراض تصحيح .text التقليدي (detours) الذي يجب أن يغيّر التعليمات في بداية الدالة لوضع jmp على سبيل المثال.
الأمر في الواقع أبسط بكثير مما يبدو، سنمضي داخليًا لجعل الأمور أسهل، مما يعني أن هذا المستودع سيُترجم إلى DLL يمكن حقنها في العملية الهدف باستخدام أدوات الحقن LoadLibraryA أو Manual Mapping الخاصة بي للحقن في العملية الهدف.
أولاً نقوم بتحليل PE Headers للعملية الهدف لتحديد موقع Import Descriptor هكذا:
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
يمكننا بعد ذلك المرور عبر كل وحدة مستوردة، والمرور عبر كل دالة في هذه الوحدة (سبب الحلقات المتداخلة) وإيجاد عنوان تلك الدالة الذي تم ملؤه في وقت التشغيل. في هذا المثال سنعترض TranslateMessage التي تستخدمها Windows لمعالجة الأحداث في واجهات المستخدم الرسومية. لذا بمجرد أن نجد عنوان تلك الدالة، نستبدله بعنوان دالتنا الخاصة التي عرفناها سابقًا والتي توجد في سياق العملية البعيدة بما أننا داخليون. لا تنسَ استخدام VirtualProtect لضمان حصولك على الإذن بالكتابة إلى ذلك الموقع.
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
كما ترى، عندما يستدعي notepad الدالة TranslateMessage (في معظم الأوقات) سيشغّل دالة الاعتراض الخاصة بنا والتي تنتهي بعرض صندوق رسالة!
image