
SindriKit v2.0.0
مكتبة C أساسية لبناء قدرات هجومية موثوقة تشغيليًا
SindriKit
التطوير الهجومي يستحق معمارية أفضل.
مكتبة بلغة C لبناء القدرات الهجومية.
المفهوم الأساسي
معظم الأدوات الهجومية تُضمّن آليات تنفيذها بشكل ثابت داخل منطق التقنية نفسها. فمُحمِّل الانعكاس (reflective loader) لا يقوم فقط بتخطيط صورة في الذاكرة؛ بل يخططها باستخدام سلسلة محددة ومُضمّنة مسبقًا من استدعاءات VirtualAlloc أو NTAPI الأصلية. وعندما يبدأ نظام EDR في مراقبة تلك السلسلة تحديدًا، تُجبر على إعادة كتابة الأداة بالكامل.
يحل SindriKit هذه المشكلة بفرض فصل الاهتمامات عبر جداول تجريد الواجهات:
- منطق التقنية: (مثل المُحمِّلات، والحقن، والمرقّعات) يتعامل مع تتبع الحالة وتنسيق البيانات. ولا يملك أي معرفة بكيفية تخصيص الذاكرة أو كيفية إنشاء الخيوط.
- آليات التنفيذ: (مثل Win32 API، وNative NTAPI، وDirect Syscalls) توجد داخل جداول API مستقلة وتُحقن في التقنية أثناء التشغيل.
من خلال نقل آليات التنفيذ إلى مؤشرات دوال وقت التشغيل، يمكنك تبديل استراتيجيتك بالكامل من استدعاءات Win32 إلى استدعاءات النظام المباشرة (direct syscalls) بسطر واحد من الكود — دون تغيير منطق تنفيذ الحمولة.
معمارية التصميم
- ملفات تنفيذ منفصلة (Decoupled Execution Profiles): بدّل آليات الذاكرة، والوحدات، والتخطيط، والعمليات، والخيوط، والملفات عبر جداول مؤشرات دوال مستقلة (
snd_memory_api_t،snd_module_api_t،snd_process_api_t،snd_thread_api_t،snd_mapping_api_t،snd_file_api_t) دون المساس بمنطق التقنية. - تغطية التقنيات: تحميل PE الانعكاسي (EXE/DLL) وCOFF/BOF، وحقن classic وearly-bird APC فوق shellcode/PE/COFF، بالإضافة إلى FFI الواعي بالمعمارية وHeaven's Gate — كل ذلك فوق نفس ملفات التنفيذ القابلة للتركيب.
- خط أنابيب استدعاءات النظام المتتالي (Cascading Syscall Pipeline): محلّلات SSN قابلة للتوصيل (
snd_syscall_resolve_ssn_scan،snd_syscall_resolve_ssn_sort) مع سلسلة أولويات، منفصلة عن المستدعيات: مباشر، أو غير مباشر (NTDLL gadget)، أو مُنتحل (تزوير ديناميكي لمكدس الاستدعاء Fat-Frame). - حالة مُرمّزة بالمنشأة (Facility-Encoded Status): كل استدعاء قابل للفشل يُرجع
snd_status_t— وهو رمز منشأة/محلي مُحزَّم بالإضافة إلى خطأ نظام التشغيل المُلتقط، مع سلاسل سياقية تُستبعد عند الترجمة في الطبقة الصامتة. - تشويش وقت الترجمة (Compile-Time Obfuscation): يمكن تبديل خوارزميات تجزئة السلاسل وAPI (DJB2، FNV1A) عالميًا عبر CMake. وتقوم عملية الترجمة تلقائيًا بتعشية البذرة العالمية لتغيير التوقيعات الساكنة.
- محرك التحوّل (Mutation Engine): يتيح تعددًا شكليًا عميقًا عبر
SND_MORPH. يولّد توقيعات ثنائية فريدة في كل بناء عبر حقن مسندات مبهمة متغيرة (volatile opaque predicates) في كود C، وعمليات رياضية/NOPs مكافئة وظيفيًا في كتل Assembly، وخلط تخطيط الذاكرة للبنى الأساسية. - بناءات الإصدار (Release Builds): طبقة صامتة تُزيل جميع السلاسل التشخيصية وواصفات الملفات وإطارات التتبع؛ وبناءات
SND_CRTLESSتذهب أبعد من ذلك عبر/NODEFAULTLIB، وبدون ترويسة SDK، وواجهة أمامية PEB، وخلفيات أصلية فقط.
البدء السريع
يوفّر المستودع واجهة سطر أوامر unified واحدة تمارس كل ملف تنفيذ:
build.bat pocs
build64\pocs\Release\unified.exe load pe -f payload.dll -e Run --sys
يدعم unified الأوامر load pe|coff، وinject classic|apc|hijack (shell، PE، COFF)، وhg، وكل منها فوق --win/--nt/--sys. راجع الأمثلة و PoCs والبدء.
دمج SindriKit
cmake_minimum_required(VERSION 3.16)
project(MyTool C ASM_MASM)
set(SND_BUILD_PAYLOADS OFF CACHE BOOL "")
set(SND_ENABLE_DEBUG OFF CACHE BOOL "")
set(SND_HASH_ALGO "DJB2" CACHE STRING "")
set(SND_RANDOMIZE_SEED ON CACHE BOOL "")
set(SND_MORPH ON CACHE BOOL "")
add_subdirectory(libs/SindriKit)
add_executable(my_tool src/main.c)
target_link_libraries(my_tool PRIVATE sindri::engine)
cmake -B build && cmake --build build --config Release
سطران فقط لترث أداتك كل قدرات SindriKit: تحليل PE وCOFF، والتحميل الانعكاسي، واستدعاءات النظام المتتالية، وملفات الحقن.
المحرك
طبقة تجريد API
┌────────────────────────────────────────────────────────────────────────────┐
│ ANY OFFENSIVE INTENT │
│ Loader · Injector · Spoofer · Patcher · Bypasser · Harvester · ... │
├────────────────────────────────────────────────────────────────────────────┤
│ SINDRIKIT API ABSTRACTION LAYER │
│ snd_memory_api_t -> alloc · free · protect │
│ snd_module_api_t -> load_library · get_proc_address · ... │
│ snd_process_api_t -> open · alloc_remote · write · protect · thread │
│ snd_mapping_api_t -> open · view · close (KnownDlls bootstrap) │
│ snd_thread_api_t -> queue_apc · resume · suspend │
│ snd_file_api_t -> load │
├──────────────────┬──────────────────────┬──────────────────────────────────┤
│ Win32 Profile │ Native Profile │ Bring Your Own Mechanic │
│ VirtualAlloc │ NtAllocateVirtual │ Driver · ROP · Exotic │
│ LoadLibraryA │ PEB Walk + EAT │ Operator-defined functions │
└──────────────────┴──────────────────────┴──────────────────────────────────┘
عمليًا، هذا يعني أن كل نطاق يتبع نفس العقد:
// Reflective loader
snd_ldr_pe_ctx_t ctx = {0};
ctx.raw_source = &payload;
ctx.mem_api = &snd_mem_win; // or snd_mem_nt / snd_mem_sys
ctx.mod_api = &snd_mod_win; // or snd_mod_nt
snd_ldr_pe_prepare_image(&ctx);
snd_ldr_pe_execute_image(&ctx);
// Classic injection
snd_inj_ctx_t inj = {0};
inj.target_pid = 1337;
inj.payload = &shellcode;
inj.proc_api = &snd_proc_sys; // or snd_proc_win / snd_proc_nt
snd_inj_classic_shell(&inj);
snd_inj_cleanup(&inj);
خط أنابيب استدعاءات النظام المتتالي
يتعامل SindriKit مع تحليل استدعاءات النظام كآلية قابلة للحقن، حيث يكدّس الاستراتيجيات بترتيب الأولوية. ويتابع المحرك حتى تنجح إحداها:
snd_ntdll_set_clean(clean_ntdll);
snd_syscall_set_resolver(snd_syscall_resolve_ssn_scan);
snd_syscall_add_resolver(snd_syscall_resolve_ssn_sort);
snd_syscall_set_invoker(snd_syscall_direct_invoke_asm);
// or for indirect syscalls:
// snd_syscall_set_invoker(snd_syscall_indirect_invoke_asm);
// snd_syscall_set_gadget_finder(snd_syscall_find_gadget_scan);
// or for spoofed syscalls:
// snd_syscall_set_invoker(snd_syscall_spoofed_invoke_asm);
// snd_syscall_set_spoof_finder(snd_syscall_find_spoof_scan);
المستدعي منفصل عن تحليل SSN — بدّل بين استدعاءات النظام المباشرة وغير المباشرة والمنتحلة دون تعديل كود النطاق. يقفز الاستدعاء غير المباشر إلى gadget شرعي في NTDLL بحيث يبقى عنوان الإرجاع داخل ntdll.dll؛ أما الاستدعاء المنتحل فيزرع إضافةً إلى ذلك عنوان إرجاع حقيقي للمستدعي داخل "Fat Frame" يُكتشف ديناميكيًا، بحيث تبقى عمليات فك مكدس الاستدعاء متماسكة.
مرونة الخوارزميات وقت الترجمة
يُزال كل اسم API وسلسلة وحدة من الملف الثنائي النهائي وقت الترجمة عبر متغير CMake واحد:
set(SND_HASH_ALGO "FNV1A") # or DJB2 recomputes everything automatically
set(SND_RANDOMIZE_SEED ON) # generates a fresh 32-bit seed on next configure
تُحسب كل تجزئة ببذرة مُولّدة عشوائيًا (إذا كان SND_RANDOMIZE_SEED=ON). ويتغير البصمة الساكنة بالكامل بين عمليات الترجمة دون المساس بسطر واحد من C.
FFI الديناميكي الواعي بالمعمارية
جسر Assembly مخصص بـ MASM لاستدعاء دوال وقت التشغيل بشكل عشوائي. تتبع بناءات x64 اصطلاح الاستدعاء Microsoft x64 بدقة (مساحة الظل، وموضع الوسائط في السجلات، ومحاذاة المكدس). أما بناءات x86 فتدفع الوسائط بترتيب عكسي مع دعم أهداف cdecl وstdcall معًا.