حقن DLL

في برمجة الحاسوب ، يُعدّ حقن مكتبات الارتباط الديناميكي (DLL) أسلوبًا يُستخدم لتشغيل التعليمات البرمجية ضمن نطاق عناوين عملية أخرى عن طريق إجبارها على تحميل مكتبة ارتباط ديناميكي . [ 1 ] غالبًا ما تستخدم البرامج الخارجية حقن مكتبات الارتباط الديناميكي للتأثير على سلوك برنامج آخر بطريقة لم يتوقعها أو يقصدها مطوروه . [ 1 ] [ 2 ] [ 3 ] على سبيل المثال، يمكن للتعليمات البرمجية المحقونة أن تعترض استدعاءات وظائف النظام، [ 4 ] [ 5 ] أو تقرأ محتويات مربعات نص كلمات المرور ، وهو أمر لا يمكن القيام به بالطريقة المعتادة. [ 6 ] يُطلق على البرنامج المستخدم لحقن تعليمات برمجية عشوائية في عمليات عشوائية اسم " حاقن مكتبات الارتباط الديناميكي" .

أساليب العمل على نظام التشغيل مايكروسوفت ويندوز

توجد عدة طرق في نظام التشغيل مايكروسوفت ويندوز لإجبار عملية ما على تحميل وتنفيذ التعليمات البرمجية في ملف DLL لم يقصدها المؤلفون:

  • يتم تحميل ملفات DLL المدرجة في سجل النظام في كل عملية تقوم بتحميل User32.dll أثناء الاستدعاء الأولي لهذا الملف. [ 7 ] [ 8 ] [ 9 ] بدءًا من نظام التشغيل Windows Vista ، يتم تعطيل AppInit_DLLs افتراضيًا. [ 10 ] بدءًا من نظام التشغيل Windows 7 ، تدعم بنية AppInit_DLL توقيع التعليمات البرمجية . بدءًا من نظام التشغيل Windows 8 ، يتم تعطيل جميع وظائف AppInit_DLL عند تمكين التمهيد الآمن ، بغض النظر عن توقيع التعليمات البرمجية أو إعدادات سجل النظام. [ 11 ]HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
  • يتم تحميل ملفات DLL المدرجة ضمن مفتاح التسجيل HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLsفي كل عملية تستدعي وظائف واجهة برمجة تطبيقات Win32 . هذه هي الطريقة الصحيحة لاستخدام حقن DLL بشكل قانوني على نظام التشغيل Windows 10. يجب أن يكون ملف DLL موقعًا بشهادة صالحة.CreateProcessCreateProcessAsUserCreateProcessWithLogonWCreateProcessWithTokenWWinExec
  • يمكن استخدام وظائف معالجة العمليات، مثل تقنيات حقن التعليمات البرمجيةCreateRemoteThread مثل AtomBombing، [ 12 ] لحقن مكتبة DLL في برنامج بعد بدء تشغيله. [ 5 ] [ 6 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ]
    1. افتح مؤشرًا للعملية المستهدفة. يمكن القيام بذلك عن طريق تشغيل العملية [ 17 ] [ 18 ] أو عن طريق البحث عن عنصر معروف وجوده تم إنشاؤه بواسطة تلك العملية - على سبيل المثال، نافذة بعنوان متوقع [ 19 ] أو عن طريق الحصول على قائمة بالعمليات الجارية [ 20 ] والبحث عن اسم ملف البرنامج التنفيذي المستهدف . [ 21 ]
    2. يتم تخصيص بعض الذاكرة في العملية المستهدفة، [ 22 ] ويُكتب اسم مكتبة الارتباط الديناميكي (DLL) المراد حقنها فيها. [ 13 ] [ 23 ]
      يمكن تخطي هذه الخطوة إذا كان اسم ملف DLL مناسب متوفرًا بالفعل في العملية المستهدفة. على سبيل المثال، إذا كانت العملية مرتبطة بـ User32.dll أو GDI32.dll أو Kernel32.dll أو أي مكتبة أخرى ينتهي اسمها بـ 32.dll، فسيكون من الممكن تحميل مكتبة تحمل الاسم [ 24 ] . وقد ثبت سابقًا أن هذه التقنية فعالة ضد إحدى طرق حماية العمليات من حقن ملفات DLL. [ 25 ]32.dll
    3. أنشئ سلسلة عمليات جديدة في العملية المستهدفة [ 26 ] ، مع تعيين عنوان بدء سلسلة العمليات ليكون عنوان LoadLibraryالسلسلة التي تم تحميلها للتو إلى العملية المستهدفة، وتعيين الوسيطة لتكون عنوان السلسلة. [ 13 ] [ 27 ]
      بدلاً من كتابة اسم مكتبة الارتباط الديناميكي (DLL) المراد تحميلها إلى الهدف وبدء سلسلة العمليات الجديدة عند هذا الاسم LoadLibrary، يمكن كتابة الكود المراد تنفيذه إلى الهدف وبدء سلسلة العمليات عند هذا الكود. [ 6 ]
    4. ثم يقوم نظام التشغيل باستدعاء روتين التهيئة الخاص بملف DLL المُضاف. [ 13 ] [ 28 ]
    تجدر الإشارة إلى أنه بدون اتخاذ الاحتياطات اللازمة، يمكن اكتشاف هذا النهج بواسطة العملية المستهدفة بسبب DLL_THREAD_ATTACHالإشعارات المرسلة إلى كل وحدة نمطية محملة عند بدء تشغيل مؤشر الترابط. [ 28 ]
  • استدعاءات ربط ويندوز مثل SetWindowsHookEx. [ 2 ] [ 5 ] [ 6 ] [ 29 ] [ 30 ] [ 31 ]
  • استخدم الدالة SuspendThread`or` NtSuspendThreadلتعليق جميع العمليات، ثم استخدم الدالة SetThreadContext`or` NtSetContextThreadلتعديل سياق عملية موجودة في التطبيق لتنفيذ التعليمات البرمجية المُضافة، والتي بدورها قد تُحمّل مكتبة DLL. [ 4 ] [ 32 ] [ 33 ]
  • استغلال قيود التصميم في نظام التشغيل ويندوز والتطبيقات التي تستدعي الدالة LoadLibraryأو LoadLibraryExالدالة دون تحديد مسار كامل لملف DLL الذي يتم تحميله. [ 34 ] [ 35 ] [ 36 ]
  • طبقات التوافق على مستوى نظام التشغيل .
  • استبدال ملف DLL خاص بالتطبيق بملف بديل غير أصلي يقوم بتنفيذ نفس وظائف التصدير التي يقوم بها الملف الأصلي. [ 37 ]
  • مكتبات الارتباط الديناميكية العاكسة أو مكتبات الارتباط الديناميكية القادرة على تحميل نفسها. يتم نسخ مكتبة الارتباط الديناميكية العاكسة إلى مساحة ذاكرة العملية المستهدفة، ويتم تمرير التنفيذ إلى نقطة دخول مكتبة الارتباط الديناميكية التي تقوم بدورها بتحميل نفسها من الذاكرة. [ 38 ]

أساليب التعامل مع الأنظمة الشبيهة بنظام يونكس

في أنظمة التشغيل الشبيهة بنظام يونكس والتي تستخدم رابطًا ديناميكيًا يعتمد على ld.so (في أنظمة BSD ) وld-linux.so (في أنظمة لينكس )، يمكن ربط أي مكتبات بعملية جديدة عن طريق تحديد مسار المكتبة في متغير البيئة LD_PRELOAD ، والذي يمكن ضبطه بشكل عام أو بشكل فردي لعملية واحدة. [ 39 ]

على سبيل المثال، في نظام لينكس، يقوم هذا الأمر بتشغيل الأمر "prog" مع ربط المكتبة المشتركة من الملف "test.so" به عند وقت التشغيل:

LD_PRELOAD = "./test.so" prog 

يمكن إنشاء مكتبة كهذه بنفس طريقة إنشاء الكائنات المشتركة الأخرى . باستخدام GCC ، يتضمن ذلك تجميع ملف المصدر الذي يحتوي على المتغيرات العامة الجديدة المراد ربطها، باستخدام الخيار -fpic أو -fPIC ، [ 40 ] ثم الربط باستخدام الخيار -shared . [ 41 ] تتمتع المكتبة بإمكانية الوصول إلى الرموز الخارجية المُعلنة في البرنامج، تمامًا كأي مكتبة أخرى.

في نظام macOS ، يقوم الأمر التالي بتشغيل الأمر "prog" مع ربط المكتبة المشتركة من الملف "test.dylib" به عند وقت التشغيل: [ 42 ]

DYLD_INSERT_LIBRARIES="./test.dylib"DYLD_FORCE_FLAT_NAMESPACE=1prog 

It is also possible to use debugger-based techniques on Unix-like systems.[43]

References

  1. 12James Shewmaker (2006). "Analyzing DLL Injection"(PDF). GSM Presentation. Bluenotch. Archived from the original(PDF) on December 3, 2008. Retrieved August 31, 2008.
  2. 12Iczelion (August 2002). "Tutorial 24: Windows Hooks". Iczelion's Win32 Assembly Homepage. Archived from the original on August 1, 2008. Retrieved August 31, 2008.
  3. Rocky Pulley (May 19, 2005). "Extending Task Manager with DLL Injection". CodeProject. Archived from the original on February 6, 2009. Retrieved September 1, 2008.
  4. 12Nasser R. Rowhani (October 23, 2003). "DLL Injection and function interception tutorial". CodeProject. Archived from the original on April 15, 2018. Retrieved August 31, 2008.
  5. 123Ivo Ivanov (December 2, 2002). "API hooking revealed". CodeProject. Archived from the original on October 14, 2008. Retrieved August 31, 2008.
  6. 1234Robert Kuster (August 20, 2003). "Three Ways to Inject Your Code into Another Process". CodeProject. Archived from the original on July 20, 2008. Retrieved August 31, 2008.
  7. "Working with the AppInit_DLLs registry value". Microsoft Help and Support. Microsoft. November 21, 2006. Retrieved August 31, 2008.
  8. Raymond Chen (December 13, 2007). "AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs". The Old New Thing. Microsoft. Retrieved August 31, 2008.
  9. "dllmain.c". ReactOS. ReactOS Foundation. July 8, 2008. Retrieved August 31, 2008.
  10. ملفات AppInit_DLL في نظامي التشغيل Windows 7 و Windows Server 2008 R2
  11. "ملفات AppInit DLL والتمهيد الآمن" . MSDN . تم الاطلاع عليه في 29 مارس 2016 .
  12. ""هجوم إلكتروني على نظام مايكروسوفت ويندوز عبر حقن التعليمات البرمجية" . دارك ريدينج . تاريخ الاطلاع: 20 أبريل 2017 .
  13. 1 2 3 4 ترينت وادينجتون. "InjectDLL" . مؤرشف من الأصل في 30 ديسمبر 2019. تم الاسترجاع في 31 أغسطس 2008 .
  14. "حقن ملفات DLL" . DreamInCode.net . MediaGroup1. 4 مايو 2006. مؤرشف من الأصل في 2 سبتمبر 2008. تم الاطلاع عليه في 31 أغسطس 2008 .
  15. جريج جينكينز (نوفمبر 2007). "إطار عمل حقن DLL" . سيرك رينغ 3. ووردبريس. مؤرشف من الأصل في 28 يونيو 2020. تم الاطلاع عليه في 31 أغسطس 2008 .
  16. درو بنتون (17 أغسطس 2007). "حل أكثر شمولاً لحقن مكتبة الارتباط الديناميكي باستخدام CreateRemoteThread" . CodeProject . تم الاطلاع عليه في 1 سبتمبر 2008 .
  17. "CreateProcess" . حزمة تطوير البرامج الأساسية لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه في 31 أغسطس 2008 .
  18. "معلومات العملية" . حزمة تطوير البرامج الأساسية لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه في 31 أغسطس 2008 .
  19. "دالة GetWindowThreadProcessId" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  20. "EnumProcesses" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  21. "GetModuleBaseName" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  22. "VirtualAllocEx" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  23. "WriteProcessMemory" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  24. "حقن مكتبة الارتباط الديناميكي باستخدام CreateRemoteThread" . موقع Stack Overflow . تم الاطلاع عليه في 5 يوليو 2026 .
  25. "ثغرة أمنية في برنامج Outpost تتجاوز الحماية الذاتية عبر حقن مكتبة الارتباط الديناميكي المتقدمة مع سرقة المقابض" . ماتوسيك . 1 ديسمبر 2006. مؤرشف من الأصل في 6 فبراير 2009. تم الاطلاع عليه في 31 أغسطس 2008 .
  26. "CreateRemoteThread" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  27. "LoadLibrary" . حزمة تطوير البرامج (SDK) لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 أغسطس 2008 .
  28. 1 2 "DllMain" . حزمة تطوير البرامج الأساسية لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاطلاع عليه في 31 أغسطس 2008 .
  29. "وظيفة SetWindowsHookEx" . منصة SDK لنظام التشغيل Windows XP SP2 . مايكروسوفت . تم الاسترجاع في 31 أغسطس 2008 .
  30. "قيمة سجل AppInit_DLLs ونظام التشغيل Windows 95" . مساعدة ودعم Microsoft . Microsoft. 1 مارس 2005. تم الاطلاع عليه في 31 أغسطس 2008 .
  31. "حقن ملفات DLL باستخدام دالة SetWindowsHookEx()" . Game Reversal . 3 أبريل 2008. مؤرشف من الأصل في 4 أبريل 2016. تم الاطلاع عليه في 1 سبتمبر 2008 .
  32. "حقن مكتبة الارتباط الديناميكي SetThreadContext" . 16 يناير 2007. مؤرشف من الأصل في 23 أغسطس 2011. تم الاطلاع عليه في 1 سبتمبر 2008 .
  33. بن بوتو (6 سبتمبر 2008). "حاقن ملفات DLL" . مؤرشف من الأصل في 7 فبراير 2009. تم الاطلاع عليه في 1 سبتمبر 2008 .
  34. "تحميل المكتبات غير الآمن قد يسمح بتنفيذ التعليمات البرمجية عن بُعد" . مايكروسوفت . 10 يونيو 2011. تم الاطلاع عليه في 20 أبريل 2016 .
  35. "تحميل آمن للمكتبات لمنع هجمات التحميل المسبق لملفات DLL" . مايكروسوفت . 10 يونيو 2011. تم الاطلاع عليه في 8 أغسطس 2012 .
  36. "تحذير أمني من مايكروسوفت: قد يسمح تحميل المكتبات غير الآمن بتنفيذ التعليمات البرمجية عن بُعد" . مايكروسوفت . 10 يونيو 2011. تم الاطلاع عليه في 20 أبريل 2016 .
  37. نيكولاس فاليير (26 سبتمبر 2010). "إصابة مشاريع Step 7 بفيروس ستوكسنت" . سيمانتك.
  38. فريق أبحاث أمان مايكروسوفت ديفندر (13 نوفمبر 2017). "الكشف عن تحميل ملفات DLL الانعكاسية باستخدام Windows Defender ATP" . مدونة أمان مايكروسوفت . تم الاطلاع عليه في 26 مارس 2025 .
  39. لينوس تورفالدز ؛ ديفيد إنجل؛ إريك يونغديل؛ بيتر ماكدونالد؛ هونغجيو لو؛ لارس ويرزينيوس؛ ميتش ديسوزا (14 مارس 1998). "ld.so/ld-linux.so – رابط/محمل ديناميكي" . صفحات دليل يونكس . مؤرشف من الأصل في 6 فبراير 2009. تم الاطلاع عليه في 31 أغسطس 2008 .
  40. "خيارات توليد الكود" . استخدام مجموعة مترجمات جنو (GCC) . مؤسسة البرمجيات الحرة . تم الاسترجاع في 31 أغسطس 2008. توليد كود مستقل عن الموضع (PIC) مناسب للاستخدام في مكتبة مشتركة، إذا كان مدعومًا من قبل الجهاز المستهدف. sqq.-fpic
  41. "خيارات الربط" . استخدام مجموعة مترجمات جنو (GCC) . مؤسسة البرمجيات الحرة . تم الاسترجاع في 31 أغسطس 2008. إنشاء كائن مشترك يمكن ربطه بعد ذلك بكائنات أخرى لتكوين ملف تنفيذي. sqq .-shared
  42. "حيلة LD_PRELOAD" . بيتر غولدسبورو . تم الاطلاع عليه في 17 مايو 2017 .
  43. غريغوري شبيتالنيك (12 فبراير 2009). "حقن التعليمات البرمجية في تطبيق لينكس قيد التشغيل" . مشروع الكود . مؤرشف من الأصل في 12 يونيو 2010. تم الاسترجاع في 18 نوفمبر 2010 .