
IKEv2, ikeext.dll, CVE-2026-33824, двойное освобождение, подстройка кучи, ROP, фрагментация SKF, Windows exploit, антиотладка, обфускация, API hooking, shellcode, reverse shell
⚠️ Проект находится в стадии завершения. НЕ полностью функционален в текущем состоянии.
EpSiLoNPoInTIkEv2.cpp — это прототип эксплойта 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, , , , , , (Nuitka), (Screen2Exe) и т.д.VIRT == 1)Все арифметические и логические операции могут быть направлены через внутреннюю ВМ (Obfh_VirtualMachine):
OP__ADD, OP__SUB, ..., OP__NOP) генерируются случайным образом во время компиляции с помощью __COUNTER__ и RND()._VM_ENCRYPT_INT(value) = (value - _VM_MUTATOR_KEY) * ~SALT_CMD.* -1) и передаются вместе с junk-значениями.goto, ложными отрицательными case, BREAK_STACK_* (встроенный ASM xor; jz; .byte 0xE8; cpuid), ложными JMP (.byte 0xFF, 0x25) и блоками ложного кода x86_64 для обмана декомпиляторов.VM_ADD, , , , , , ,
, , , , , , и т.д.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: перед каждым вставляет .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, , , , , , ,
, , , , , , , , .ANTI_DEBUG_V2 == 1)ThreadCompareDRs): SuspendThread на главном потоке, GetThreadContext
с CONTEXT_DEBUG_REGISTERS, проверка Dr0–Dr3, Dr7, обнуление через ad_ZeroDRs.IsDebuggerPresent_proxy: загружает kernel32.dll динамически, реконструирует имя функции
IsDebuggerPresent посимвольно через volatile-переменные (_I, _s, _D, _e, _b, _u, _g, _g, _e, _r, _P, _r, _e, _s, _e, _n, _t), вызов через GetProcAddress.ANTI_DEBUG: двойная проверка ,
запускает (бесконечный цикл), (привилегированная IN), , ASM,
затем ( + ).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 (32 байта nonce), IKE_KEY_EXCHANGE_PAYLOAD (DH 256 байт),
IKE_NOTIFY_PAYLOAD, IKE_VENDOR_ID_PAYLOAD, IKE_SKF_FRAGMENT_PAYLOAD.
Настроенные преобразования: AES-CBC-128 (12), PRF HMAC-SHA2-256 (5),
INTEG HMAC-SHA2-256-128 (12), DH MODP-2048 (14).
IKE_DDOS_AMPLIFIER_PAYLOAD: коэффициент усиления + 64 байта триггера.IKE_DDOS_LOOP_PAYLOAD: счётчик цикла + 32 байта loop_code.IKE_DDOS_MEMORY_PAYLOAD: размер/количество аллокации + 64 байта данных heap spray.HEAP_GROOM_CONTEXT: дескриптор кучи, целевой адрес, потоки, stop_flag, выделенные чанки.HEAP_GROOM_THREAD_PARAMS: размер чанка, итерации, ID потока, SRWLOCK, use_nt_allocate.GROOM_CONFIG: количество потоков, итерации, задержка, размер чанка, мин/макс процент освобождения.0x1000, 1000 итераций, фрагментация между 30–70%.Полная структура ROP_CHAIN со всеми необходимыми гаджетами:
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, , .
Массив из 512 гаджетов ().
Таблица g_rop_patterns[] из ~50+ байт-сигнатур для поиска гаджетов в модулях:
pop rax; ret, pop rcx; ret, pop rdx; ret, ..., mov [rcx], rax; ret,
mov rax, [rcx]; ret, jmp rsp, VirtualProtect prologue,
mov [gs:0x60], rax; ret, jmp [rax+0x58]; ret, lea rax, [rip+0x0]; jmp rax,
add rsp, 0x28; ret, cmp rdx/r8/r9, 0x0; je/jne; ret и т.д.
uint64_t g_KernelBase, g_IkeextBase, g_SystemEprocess;
uint64_t g_IkeextDoubleFreeOffset = 0x12B960;
uint64_t g_IkeextProcessIkePayload = 0x52220;
uint64_t g_PopRax, g_PopRcx, g_PopRdx, g_PopR8, g_PopR9, g_PopRsp;
uint64_t g_MovRaxRsp, g_JmpRsp, g_VirtualProtect, g_DisableCFG, g_StackPivot;
uint64_t g_NtoskrnlBase, g_Kernel32Base, g_NtdllBase, g_HeapBase, g_ShellcodeAddr;
SOCKET g_Socket; struct sockaddr_in g_Target;
EXPLOIT_CONTEXT g_ExploitCtx; ROP_CHAIN g_RopChain;
HEAP_GROOM_CONTEXT g_GroomContext;
MODULE_DATA g_Modules; ROP_GADGET g_Gadgets;
std::vector<SUSPICIOUS_REGION> g_Regions;
main)InitializeCriticalSection, init_debug_info.is_hostile_environment() → выход, если обнаружена песочница/ВМ.disable_amsi(), disable_defender(), disable_etw(), patch_etw().start_shell_listener() → запуск обратного слушателя на порту 4444.argv[1] (IP цели) + argv[2] (порт, по умолчанию 500).init_udp_socket() + inet_pton + test_target_reachability().Проект находится в стадии завершения и не является полностью функциональным.
disable_amsi, disable_defender, disable_etw,
patch_etw, is_hostile_environment, test_target_reachability, start_shell_listener,
stop_shell_listener, print_usage, init_debug_info) объявлены, но могут быть
неполными или отсутствовать в зависимости от состояния сборки.runassys/ и связанных библиотек.Этот репозиторий содержит прототип исследования в области наступательной безопасности, нацеленный на низкоуровневый сетевой вектор эксплуатации (IKEv2/ikeext.dll, Windows).
Использование этого кода строго ограничено тестовыми, исследовательскими или лабораторными средами, где у вас есть явное разрешение.
Автор снимает с себя всякую ответственность за любое незаконное, неавторизованное или вредоносное использование этого кода. Код предоставляется «как есть», без каких-либо гарантий работоспособности, стабильности или отсутствия нежелательных эффектов.
Проект ещё находится в стадии завершения и не является полностью функциональным в текущем состоянии.
logicoma__wibu00__wibu01PETETRIS.tw.rdata.text0x45,0x6e,0x69,...), Denuvo (0x64,0x65,0x6E,...).FAKE_DONGLE[], имитирующий аппаратные ключи: skeydrv.dll, HASPDOSDRV,
MARXDEV1.SYS, WIBUKEY, SNTNLUSB, RNBOspro и т.д.VM_SUBVM_MULVM_DIVVM_MODVM_EQUVM_NEQVM_LSSVM_GTRVM_LEQVM_GEQVM_OBF_INTVM_ADD_DBLVM_MUL_DBLbreakif (OBFUS_CONDITION_BLOCK) BREAK_STACK_1fopenfclosefreadfwriteexitsnprintfvsprintfvsnprintfgetenvsystemabortatexitgetcwdtolowertoupperobfh_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 посимвольно через volatile-переменные _k, _e, _r, _n, _e, _l и sprintf.IsDebuggerPresent() || IsDebuggerPresent_proxy()loop().byte 0xEDBREAK_STACK_1retcrash()int $3.byte 0xED, 0x00sub_rspstack_pivotrop_chain[MAX_ROP_CHAIN_SIZE]SKF_FRAGMENTS + 1