
DLLHijackHunter v2.4.0
اكتشاف اختطاف DLL الآلي، والتحقق منه، والتأكيد عليه. تحويل الأخطاء المحلية في التهيئة إلى مسارات هجوم مؤكدة ومسلحة.
DLLHijackHunter
بواسطة ProjectMerai
اكتشاف وتحقق وتأكيد آلي لاختطاف DLL على Windows
من "قد تكون هذه الـ DLL قابلة للاختطاف" إلى "يمكن لمستخدم عادي أن يجعل SYSTEM يحمّل هذه — وهذا هو الدليل."
المحتويات
- نظرة عامة
- البدء السريع
- كيف يعمل
- ما يكتشفه
- تقليل الإيجابيات الكاذبة
- التحقق: فحص التحميل والكاناري
- التقييم والتصنيفات وسلاسل الهجوم
- مرجع الاستخدام
- السلامة والأثر التشغيلي
- البناء من المصدر
- مختبر الاختبار (HijackRange)
- القيود المعروفة
- المقارنة
نظرة عامة
يكتشف DLLHijackHunter فرص اختطاف DLL على مضيف Windows ويعمل على إثباتها، لا مجرد سردها. وهو:
- يكتشف كل موضع يُطلق فيه ملف تنفيذي تلقائيًا — الخدمات، والمهام المجدولة، ومفاتيح Run، ومجلدات Startup، وخوادم COM، وDLLs الخاصة بـ AppInit/AppCert، وإدخالات IFEO، والملفات التنفيذية لـ UAC ذاتية الرفع — ويحسب أين سيُبحث عن كل DLL مستوردة.
- يستبعد المواضع التي لا يستطيع المهاجم استخدامها فعليًا: مجموعات API، وKnownDLLs، والمجلدات التي لا يستطيع المستخدم العادي الكتابة فيها، والعمليات المحمية، وغير ذلك.
- يتحقق (اختياريًا) باستخدام محمّل Windows الحقيقي، عبر وضع DLL فحص غير ضار والتحقق من أي نسخة تفوز في البحث.
- يؤكد (اختياريًا) عبر نشر DLL كاناري غير ضار، وتشغيل الخدمة/المهمة/كائن COM، وتسجيل الهوية التي عمل بها فعليًا.
- يقيّم ويبلّغ عن كل نتيجة حسب الثقة والأثر، ويربط النتائج في سلاسل هجوم (على سبيل المثال مستخدم عادي → SYSTEM).
يُتخذ كل حكم من وجهة نظر المهاجم — مستخدم عادي غير مميز — بغض النظر عما إذا كان الماسح نفسه يعمل بصلاحيات مرتفعة. فالتشغيل كمسؤول يمنح الأداة رؤية أكبر (ETW، والكاناري، ومحفزات الخدمات)؛ لكنه لا يجعل المجلدات المحمية تبدو قابلة للكتابة ولا يضخّم الامتياز المكتسب.
البدء السريع
نزّل أو ابنِ DLLHijackHunter.exe (مكتفٍ ذاتيًا؛ لا حاجة لتثبيت .NET)، ثم من موجه مرتفع الصلاحيات:
# Passive, read-only triage: no file drops, no service/task starts
.\DLLHijackHunter.exe --profile safe
# Full static analysis without touching the system, JSON report
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw -o report.json
# Static analysis + real-loader verification (writes probe DLLs transiently)
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw --verify-load -o report.html
# Everything, including ETW and canary confirmation — lab / authorised targets only
.\DLLHijackHunter.exe --profile aggressive -o report.html
# Focus on one application
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe" --no-canary
مكافح الفيروسات: ملفات DLL الخاصة بالـ canary والـ probe غير موقّعة وتتصرف مثل حِمولات الاختطاف، لذا قد يضعها Microsoft Defender في الحجر الصحي. تكتشف الأداة ذلك وتُبلّغ عن تلك النتائج على أنها غير حاسمة بدلاً من "غير قابلة للاختطاف". على جهاز اختبار، استبعد الدلائل المستهدفة و
%ProgramData%\DLLHijackHunterللحصول على نتائج قاطعة.
كيف يعمل
flowchart TB
subgraph S1["1 · Discovery"]
direction LR
EN["Launch points<br/>services · tasks · Run keys<br/>startup · COM · AutoElevate"] --> PE["PE analysis<br/>imports · delay loads<br/>manifest"] --> SO["Search order<br/>identity-aware PATH"]
ETW["ETW runtime trace<br/>optional, elevated"]
end
subgraph S2["2 · Filter pipeline"]
direction LR
HG["Hard gates<br/>API sets · KnownDLLs<br/>writability"] --> SG["Soft gates<br/>manifest · privilege<br/>PPL · LoadLibraryEx"] --> DD["Dedup and<br/>profile filters"]
end
subgraph S3["3 · Verification (optional)"]
direction LR
LP["Load probe<br/>real Windows loader"] --> CN["Canary<br/>deploy, trigger, confirm"]
end
subgraph S4["4 · Output"]
direction LR
SC["Scoring and tiers"] --> AC["Attack chains"] --> RP["Console · JSON · HTML"]
end
S1 --> S2 --> S3 --> S4
| المرحلة | تتطلب صلاحيات المسؤول | تعدّل النظام |
|---|---|---|
| الاكتشاف الساكن + المرشّحات | لا (المسؤول يرى المزيد) | لا |
| اكتشاف وقت التشغيل عبر ETW | نعم | يبدأ خدمات التشغيل التلقائي (حتى 100) ويشغّل المهام المجدولة (حتى 30) لإحداث تحميل DLL |
فحص التحميل (--verify-load) | لا | يكتب مؤقتًا ملف DLL فحصًا حميدًا في كل موضع مرشّح، ثم يحذفه ويستعيد أي ملف أصلي |
| تأكيد الكناري | نعم | يكتب ملف DLL كناري، ويوقف/يشغّل الخدمات، ويشغّل المهام، وينشّط كائنات COM، ثم ينظّف |
ما الذي يكتشفه
أنواع الاختطاف
| النوع | ما يعنيه | ملاحظات |
|---|---|---|
| الشبح (Phantom) | ملف DLL غير موجود في أي مكان ضمن مسار البحث | ازرعه في أي مكان يبحث فيه الملف التنفيذي |
| ترتيب البحث | يُبحث في مجلد قابل للكتابة قبل النسخة الشرعية | يشمل الكتابة فوق ملف DLL في مجلد قابل للكتابة |
| ENV PATH | يُبحث في مجلد قابل للكتابة ضمن PATH عن ملف DLL مفقود | تُقيَّم الخدمات مقابل PATH الخاص بالجهاز فقط — لا تُبحث أبدًا إدخالات PATH الخاصة بالمستخدم من قِبل خدمة |
| إعادة توجيه .local | إعادة توجيه <app>.exe.local\<dll> | يُبلَّغ عنه فقط للملفات التنفيذية بدون بيان (manifest) (أو عندما يكون IFEO DevOverrideEnable=1)؛ يتجاهل المُحمِّل .local بخلاف ذلك، ولا يعيد توجيه KnownDLLs أبدًا |
| التحميل الجانبي (UAC) | نسخ ملف EXE يرفع صلاحياته تلقائيًا بجوار ملف DLL مزروع | فقط لملفات EXE التي تحتوي على <autoElevate>true</autoElevate> في بيانها. يتطلب الرفع التلقائي للصلاحيات موقعًا موثوقًا، لذا يجب أن تجتاز النسخة هذا الفحص (مثل مجلد وهمي C:\Windows \System32\) |
| AppInit DLLs | يشير AppInit_DLLs إلى ملف DLL قابل للكتابة | يُحمَّل في كل عملية تحمّل user32.dll |
| AppCert DLLs | يشير AppCertDLLs إلى ملف DLL قابل للكتابة | يُحمَّل في كل مستدعٍ لـ CreateProcess/WinExec |
تُعدَّد ملفات IFEO Debugger وSilentProcessExit\MonitorProcess التنفيذية وتُحلَّل مثل أي نقطة تشغيل أخرى. لا تُنتَج حاليًا عمليات الاختطاف القائمة على CWD.
هوية تشغيل الهدف
الهوية الصحيحة تحدد كلاً من حكم تصعيد الصلاحيات ودرجة التأثير:
- الخدمات —
ObjectName(LocalSystem أو Local Service أو Network Service أو حساب)؛ كما تحلّل خدمات svchost ملفServiceDllالخاص بها. - المهام المجدولة — هوية المهمة الرئيسية. تُعيَّن صيغ SID مثل
S-1-5-18إلىNT AUTHORITY\SYSTEM؛ وتعمل الهويات الجماعية بصفة العضو المسجّل الدخول (تُحتسب فقط Administrators + أعلى الصلاحيات كصلاحيات مرتفعة). تُحلَّل أيضًا الحمولات المغلفة فيrundll32أوcmd /cأوpowershell -File. - مفاتيح Run / مجلدات Startup — تُعدَّد لـ كل ملف تعريف مستخدم محمّل (
HKEY_USERS) ولكل مجلد Startup في كل ملف تعريف، وتُنسب إلى ذلك المستخدم — وليس فقط الحساب الذي يشغّل الفاحص. - COM — تتبع الخوادم خارج العملية
AppID→RunAs/LocalService؛ وتعمل الخوادم داخل العملية بصفة العميل الذي يحمّلها.