
IKEv2، ikeext.dll، CVE-2026-33824، تحرير مزدوج، تهيئة الكومة، ROP، تجزئة SKF، استغلال ثغرات Windows، مكافحة التنقيح، التعتيم، خطاف API، شيل كود، قشرة عكسية
⚠️ المشروع قيد الإكمال. غير كامل الوظائف في حالته الحالية.
EpSiLoNPoInTIkEv2.cpp هو نموذج أولي لاستغلال (exploit) بلغة C/C++ يستهدف نظام Windows، طُوّر حول استغلال
من نوع double-free في ikeext.dll (برنامج تشغيل IKEv2 في Windows)، وهو مُدرج
قيد البحث تحت CVE-2026-33824.
يجمع المشروع ما يلي:
EpSi_OBF_ENDL / obfusheader المستوحى)يستخدم الكود طبقة تشويش ثقيلة تُفعَّل عند الترجمة عبر #define EpSi_OBF_ENDL.
استنادًا إلى obfusheader.h، مع تعديله وتوسيعه.
FAKE_SIGNS == 1)يتم حقن أقسام PE مخصصة في الملف الثنائي لخداع ماسحات أدوات الحماية المعروفة:
.vmp0, .vmp1, .vmp2 → VMProtectUPX0 → UPX.enigma1, .enigma2 → Enigma Protector.winlice → Themida.petite, .aspack, .adata, .rlp, .vlizer, .arch, .alien, .pwdprot,
.dsstext, logicoma, __wibu00, __wibu01, PETETRIS, .tw, .rdata (Nuitka)، .text (Screen2Exe)، إلخ.0x45,0x6e,0x69,...)، وDenuvo (0x64,0x65,0x6E,...).FAKE_DONGLE[] تحاكي وحدات حماية مادية (dongles): skeydrv.dll, HASPDOSDRV,
MARXDEV1.SYS, WIBUKEY, SNTNLUSB, RNBOspro، إلخ.VIRT == 1)يمكن توجيه جميع العمليات الحسابية والمنطقية إلى آلة افتراضية داخلية
(Obfh_VirtualMachine):
OP__ADD, OP__SUB, ..., OP__NOP) عشوائيًا وقت
الترجمة عبر __COUNTER__ وRND()._VM_ENCRYPT_INT(value) = (value - _VM_MUTATOR_KEY) * ~SALT_CMD.* -1)، وتُمرَّر مع قيم غير ذات معنى (junk values).goto، وحالات case سالبة مزيفة، وBREAK_STACK_* (تعليمات ASM مضمّنة
xor; jz; .byte 0xE8; cpuid)، وقفزات JMP مزيفة (.byte 0xFF, 0x25) وكتل من كود x86_64
مزيف لخداع مفككات الكود (decompilers).VM_ADD, VM_SUB, VM_MUL, VM_DIV, VM_MOD, VM_EQU, VM_NEQ,
VM_LSS, VM_GTR, VM_LEQ, VM_GEQ, VM_OBF_INT, VM_ADD_DBL, VM_MUL_DBL، إلخ.NO_CFLOW != 1)#define if(cond): كل if يحقن استدعاءً لـ__s_rdtsc() وBAD_CALL ميتًا.#define else: يحقن else if (0) { BAD_CALL; } ميتًا قبل else الحقيقي.#define while(...): مقيَّد بـ__s_rdtsc() != 0.1 وفحص مؤشر عبثي.#define for(...): مقيَّد بـOBFUS_CONDITION_BLOCK.#define switch(...): مقيَّد بـOBFUS_CONDITION_BLOCK.#define break: يحقن if (OBFUS_CONDITION_BLOCK) BREAK_STACK_1 قبل كل break.HIDE_STRING)STACK_STRING(str): يدفع السلسلة إلى المكدس عبر compound literal.HIDE_STRING(str): يجمع بين obfh_process_hidden_string() و__s_rdtsc() مع BAD_JMP
ميت لإخفاء السلسلة داخل الملف الثنائي.جميع دوال CRT وWin32 معاد توجيهها:
GetProcAddress(LoadLibraryA("msvcrt"), ...) ديناميكي: printf, scanf,
sprintf, strlen, strcmp, strcpy, strtok, memset, memcpy, strchr, strrchr,
rand, realloc, calloc, fopen, fclose, fread, fwrite, exit, snprintf,
vsprintf, vsnprintf, getenv, system, abort, atexit, getcwd, tolower, toupper.obfh_int_proxy() على جميع المعاملات: CreateFile,
ReadFile, WriteFile, CloseHandle, VirtualAlloc, VirtualFree, CreateThread,
WaitForSingleObject, WaitForMultipleObjects, ExitProcess, GetModuleHandle,
GetModuleFileName, HeapCreate, HeapAlloc, HeapFree, GlobalAlloc, GlobalFree,
GetTempPath, SetEvent, ResetEvent, Sleep, memmove, GetParent, GetWindowRect,
GetClientRect, SetWindowPos, SetConsoleTextAttribute, GetDesktopWindow, GetStockObject.GetProcAddress مستبدل بـGetProcAddress_custom: اجتياز يدوي لـIMAGE_EXPORT_DIRECTORY
(تحليل PE: e_lfanew, IMAGE_NT_HEADERS, IMAGE_DIRECTORY_ENTRY_EXPORT, AddressOfFunctions,
AddressOfNames, AddressOfNameOrdinals).LoadLibraryA مشوَّش في سلسلة من 6 أغلفة متداخلة (LoadLibraryA_0 إلى LoadLibraryA_proxy)،
مع إعادة بناء اسم DLL حرفًا بحرف عبر المتغيرات المتطايرة
_k, _e, _r, _n, _e, _l وsprintf.ANTI_DEBUG_V2 == 1)ThreadCompareDRs): SuspendThread على الخيط الرئيسي، وGetThreadContext
مع CONTEXT_DEBUG_REGISTERS، والتحقق من Dr0–Dr3 وDr7، وتصفيرها عبر ad_ZeroDRs.IsDebuggerPresent_proxy: يُحمِّل kernel32.dll ديناميكيًا، ويعيد بناء اسم
الدالة IsDebuggerPresent حرفًا بحرف عبر المتغيرات المتطايرة (_I, _s, _D, _e, _b, _u, _g, _g, _e, _r, _P, _r, _e, _s, _e, _n, _t)، ويستدعيها عبر GetProcAddress.ANTI_DEBUG: فحص مزدوج IsDebuggerPresent() || IsDebuggerPresent_proxy()،
يطلق loop() (حلقة لا نهائية)، و.byte 0xED (تعليمة IN ذات الامتياز)، وBREAK_STACK_1، وret بلغة ASM،
ثم crash() (int $3 + .byte 0xED, 0x00).9 متغيرات من تسلسلات ASM المضمّنة تُدرج في الدوال الحساسة:
xor; jz; .byte 0xE8; cpuid (تنويعات على eax, ebx, edx)، وأكواد عمليات مزيفة 0x50, 0x20,
0x00, 0xEB, 0xE1 (x86)، و0xFF, 0x25, 0xF1, 0xF2, 0xF3, 0xF4 (x86_64).
#include "runassys/ntnative.h"
#include "runassys/runassys.h"
#include "runassys/ntdll-stubs/ntdll-stubs.c"
#include "runassys/ntdll-stubs/ntdll.def.c"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "bcrypt.lib")
#pragma comment(lib, "Version.lib")
IKEEXT_BASE_ADDRESS = 0x180000000g_IkeextDoubleFreeOffset = 0x12B960g_IkeextProcessIkePayload = 0x522200x1790A0)، Import (0x179110)، Exception (0x183000),
Reloc (0x18C000)، LoadConfig (0x12AE70)، Debug (0x155CD0).g_Offset_MMSA_SecurityRealmBlob = 0x208,
g_Offset_PacketContext_Blob = 0xC8.500 (UDP)، استدعاء الشل: 4444.IKE_HEADER, IKE_SA_PAYLOAD, IKE_PROPOSAL_PAYLOAD, IKE_TRANSFORM_PAYLOAD,
IKE_NONCE_PAYLOAD (nonce من 32 بايت)، IKE_KEY_EXCHANGE_PAYLOAD (DH من 256 بايت)،
IKE_NOTIFY_PAYLOAD, IKE_VENDOR_ID_PAYLOAD, IKE_SKF_FRAGMENT_PAYLOAD.
التحويلات المكوَّنة (Transforms): AES-CBC-128 (12)، PRF HMAC-SHA2-256 (5)،
INTEG HMAC-SHA2-256-128 (12)، DH MODP-2048 (14).
IKE_DDOS_AMPLIFIER_PAYLOAD: عامل تضخيم + 64 بايت trigger.IKE_DDOS_LOOP_PAYLOAD: عدّاد حلقات + 32 بايت loop_code.IKE_DDOS_MEMORY_PAYLOAD: حجم/عدد عمليات التخصيص + 64 بايت من بيانات heap spray.HEAP_GROOM_CONTEXT: مقبض الكومة، العنوان المستهدف، الخيوط، stop_flag، allocated_chunks.HEAP_GROOM_THREAD_PARAMS: حجم الكتلة، عدد التكرارات، thread_id، SRWLOCK، use_nt_allocate.GROOM_CONFIG: thread_count، التكرارات، delay، chunk_size، الحد الأدنى/الأقصى للنسبة المئوية الحرة.0x1000، 1000 تكرار، تجزئة بين 30–70%.بنية ROP_CHAIN كاملة مع جميع الأدوات (gadgets) اللازمة:
pop_rax/rcx/rdx/r8/r9/rsp, mov_rax_rsp, mov_rcx_rsp, mov_rcx_rax, mov_rax_rcx,
mov_rcx_rdx, xor_rax/rcx/rdx, jmp_rsp, call_rax, ret, virtual_protect,
disable_cfg, disable_cet, add_rsp, sub_rsp, stack_pivot.
مصفوفة من 512 أداة (rop_chain[MAX_ROP_CHAIN_SIZE]).