العودة إلى التحديثات
New releaseSep 16, 2026

SindriKit v2.0.0

مكتبة C أساسية لبناء قدرات هجومية موثوقة تشغيليًا

مشاركة

SindriKit

التطوير الهجومي يستحق معمارية أفضل.
مكتبة بلغة C لبناء القدرات الهجومية.


المفهوم الأساسي

معظم الأدوات الهجومية تُضمّن آليات تنفيذها بشكل ثابت داخل منطق التقنية نفسها. فمُحمِّل الانعكاس (reflective loader) لا يقوم فقط بتخطيط صورة في الذاكرة؛ بل يخططها باستخدام سلسلة محددة ومُضمّنة مسبقًا من استدعاءات VirtualAlloc أو استدعاءات NTAPI الأصلية. وعندما يبدأ نظام EDR في مراقبة تلك السلسلة تحديدًا، تُجبر على إعادة كتابة الأداة بالكامل.

يحل SindriKit هذه المشكلة عبر فرض فصل الاهتمامات (separation of concerns) من خلال جداول تجريد الواجهات:

  1. منطق التقنية: (مثل المُحمِّلات، والحقن، والمرقّعات) يتعامل مع تتبع الحالة وتنسيق البيانات. ولا يملك أي معرفة بكيفية تخصيص الذاكرة أو كيفية إنشاء الخيوط (threads).
  2. آليات التنفيذ: (مثل Win32 API، وNative NTAPI، وDirect Syscalls) توجد داخل جداول API مستقلة وتُحقن في التقنية أثناء التشغيل.

من خلال نقل آليات التنفيذ إلى مؤشرات دوال وقت التشغيل، يمكنك تبديل استراتيجيتك بالكامل من استدعاءات Win32 إلى استدعاءات النظام المباشرة (direct syscalls) بسطر واحد من الكود — دون تغيير منطق تنفيذ الحمولة (payload).


معمارية التصميم

  • ملفات تنفيذ منفصلة (Decoupled Execution Profiles): بدّل سلوكيات التعامل مع الذاكرة والوحدات والخيوط الأساسية عبر جداول مؤشرات الدوال دون كسر التقنية المستدعية.
  • تراجع متتالي لاستدعاءات النظام (Cascading Syscall Fallbacks): محلّلات SSN قابلة للتوصيل (snd_syscall_resolve_ssn_scan، snd_syscall_resolve_ssn_sort) مع سلسلة أولويات — بدّل أو وسّع الاستراتيجيات دون المساس بكود النطاق.
  • تشويش وقت الترجمة (Compile-Time Obfuscation): يمكن تبديل خوارزميات تجزئة النصوص وواجهات API (DJB2، FNV1A) عالميًا عبر CMake. وتقوم عملية الترجمة تلقائيًا بعشوائية البذرة العالمية لتغيير التوقيعات الساكنة.
  • محرك التحوّل (Mutation Engine): يتيح تعددية أشكال عميقة عبر SND_MORPH. يولّد توقيعات ثنائية فريدة في كل عملية بناء عبر حقن مسندات غامضة متقلبة (volatile opaque predicates) في كود C، وعمليات رياضية/NOPs مكافئة وظيفيًا في كتل Assembly، وخلط تخطيط الذاكرة للبنى الأساسية.
  • إصدارات الإطلاق (Release Builds): طبقة صامتة تُزيل جميع نصوص التشخيص وواصفات الملفات وإطارات التتبع من الملف الثنائي النهائي، مما يقلل بصمتك الساكنة إلى العناصر الأولية فقط.

دمج 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_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);

المُستدعي (invoker) منفصل عن حل SSN — بدّل بين استدعاءات النظام المباشرة وغير المباشرة دون تعديل كود النطاق. يقفز الاستدعاء غير المباشر إلى gadget شرعي في 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 ديناميكي واعٍ بالمعمارية

جسر Assembly مخصص بـ MASM لاستدعاء دوال وقت التشغيل بشكل عشوائي. تتبع إصدارات x64 اصطلاح الاستدعاء Microsoft x64 بدقة (المساحة الظلية، وموضع الوسائط في السجلات، ومحاذاة المكدس). وتدفع إصدارات x86 الوسائط بترتيب عكسي مع دعم كل من أهداف cdecl وstdcall.

محلّل PE مع فحص الحدود

محلّل PE32/PE32+ موحّد مع علم is_mapped يتعامل بشكل صحيح مع كل من الصور الخام على القرص وطرق العرض المخططة في الذاكرة. يُتحقق من كل وصول إلى دليل بيانات مقابل حدود المخزن المؤقت المتتبعة قبل إلغاء الإشارة. يدعم حل التصدير سلاسل إعادة التوجيه (forwarder chains) حتى عمق 4 مع بحث قائم على التجزئة.

تم اختباره مقابل:

  • أكثر من 40 تركيبة اختبار أساسية تستهدف ملفات EXE وDLL ذات حالات حدية، والوسائط الخاطئة، والتصديرات المفقودة، واستدعاءات TLS عبر x86 وx64.
  • أكثر من 100 تحوّل PE ديناميكي مولّد بواسطة وحدة pe_mutator: أسماء أقسام مصفّرة، وفائض أعداد صحيحة، وحدود e_lfanew غير صالحة، واستيرادات مشوّهة.
  • مجموعة Corkami الكاملة: تُحمّل العينات الصالحة بنظافة، وترفض العينات المشوّهة بنظافة دون انهيار عبر 99% من العينات.

سياقات النطاق المتتبعة للحالة

تُدار كل عملية هجومية عبر بنية سياق منفصلة مع تعداد للمراحل. يمكن إيقاف العمليات مؤقتًا بين المراحل لتشويش النوم (sleep obfuscation) أو النشر المرحلي، واستئنافها بنظافة، وفحص نقطة الفشل الدقيقة وصولًا إلى النظام الفرعي والسبب.


فلسفة تصميم API

هيّئ خط أنابيب استدعاءات النظام مرة واحدة (النمط المعتاد):

PVOID clean_ntdll = NULL;
snd_om_knowndll_map(&snd_map_nt, L"ntdll.dll", &clean_ntdll);
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);

المُستدعي (invoker) منفصل عن حل SSN — بدّل بين استدعاءات النظام المباشرة وغير المباشرة دون تعديل كود النطاق. يقفز الاستدعاء غير المباشر إلى gadget شرعي في 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 ومخزن نصي context بحجم 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/:

مخطط له: نطاق التفادي.


إخلاء المسؤولية

SindriKit مبني لأغراض تعليمية وبحثية وللفرق الحمراء المصرّح لها فقط. للحصول على إخلاء المسؤولية القانوني الكامل والمعلومات المتعلقة باعتبارات OpSec، راجع سياسة الأمان.


الترخيص

MIT


الفئات