
IKEv2, ikeext.dll, CVE-2026-33824, Doppel-Freigabe, Heap-Grooming, ROP, SKF-Fragmentierung, Windows-Exploit, Anti-Debug, Verschleierung, API-Hooking, Shellcode, Reverse-Shell
⚠️ Projekt befindet sich in der Abschlussphase. Im aktuellen Zustand NICHT voll funktionsfähig.
EpSiLoNPoInTIkEv2.cpp ist ein C/C++-Exploit-Prototyp für Windows, der auf einer Ausnutzung
vom Typ double-free in ikeext.dll (IKEv2-Treiber von Windows) basiert, die
in der laufenden Forschung als CVE-2026-33824 referenziert wird.
Das Projekt umfasst:
EpSi_OBF_ENDL / inspiriert von obfusheader)Der Code verwendet eine schwere Obfuskationsschicht, die zur Kompilierzeit über #define EpSi_OBF_ENDL aktiviert wird.
Basiert auf obfusheader.h, angepasst und erweitert.
FAKE_SIGNS == 1)Benutzerdefinierte PE-Abschnitte werden in die Binärdatei injiziert, um Scanner bekannter Schützer zu täuschen:
.vmp0, .vmp1, .vmp2 → VMProtectUPX0 → UPX.enigma1, .enigma2 → Enigma Protector.winlice → Themida.petite, .aspack, .adata, .rlp, .vlizer, .arch, .alien, .pwdprot,
.dsstext, , , , , , (Nuitka), (Screen2Exe), etc.VIRT == 1)Alle arithmetischen und logischen Operationen können in eine interne VM umgeleitet werden
(Obfh_VirtualMachine):
OP__ADD, OP__SUB, ..., OP__NOP) werden zur Kompilierzeit zufällig über
__COUNTER__ und RND() generiert._VM_ENCRYPT_INT(value) = (value - _VM_MUTATOR_KEY) * ~SALT_CMD.* -1) und mit Junk-Werten übergeben.goto, falschen negativen cases, BREAK_STACK_* (Inline-ASM
xor; jz; .byte 0xE8; cpuid), falschen JMPs (.byte 0xFF, 0x25) und Blöcken von falschem
x86_64-Code, um Dekompilierer zu täuschen.VM_ADD, , , , , , ,
, , , , , , , etc.NO_CFLOW != 1)#define if(cond): jedes if injiziert einen __s_rdtsc()-Aufruf und einen toten BAD_CALL.#define else: injiziert ein totes else if (0) { BAD_CALL; } vor dem echten else.#define while(...): konditioniert durch __s_rdtsc() != 0.1 und eine absurde Zeigerprüfung.#define for(...): konditioniert durch OBFUS_CONDITION_BLOCK.#define switch(...): konditioniert durch OBFUS_CONDITION_BLOCK.#define break: injiziert vor jedem .HIDE_STRING)STACK_STRING(str): legt den String über ein Compound-Literal auf den Stack.HIDE_STRING(str): kombiniert obfh_process_hidden_string() + __s_rdtsc() mit einem toten
BAD_JMP, um den String in der Binärdatei zu verstecken.Alle CRT- und Win32-Funktionen werden umgeleitet:
GetProcAddress(LoadLibraryA("msvcrt"), ...): printf, scanf,
sprintf, strlen, strcmp, strcpy, strtok, memset, memcpy, strchr, strrchr,
rand, realloc, calloc, , , , , , ,
, , , , , , , , .ANTI_DEBUG_V2 == 1)ThreadCompareDRs): SuspendThread auf dem Hauptthread, GetThreadContext
mit CONTEXT_DEBUG_REGISTERS, Überprüfung von Dr0–Dr3, Dr7, Zeroing via ad_ZeroDRs.IsDebuggerPresent_proxy lädt kernel32.dll dynamisch, rekonstruiert den Funktionsnamen
IsDebuggerPresent Zeichen für Zeichen über die volatilen Variablen (_I, _s, _D, _e, _b, _u, _g, _g, _e, _r, _P, _r, _e, _s, _e, _n, _t), Aufruf über GetProcAddress.ANTI_DEBUG: doppelte Prüfung ,
löst (Endlosschleife) aus, (privilegiertes IN), , -ASM,
dann ( + ).9 Varianten von Inline-ASM-Sequenzen, die in sensible Funktionen eingefügt werden:
xor; jz; .byte 0xE8; cpuid (Variationen auf eax, ebx, edx), falsche Opcodes 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),
Relocation (0x18C000), LoadConfig (0x12AE70), Debug (0x155CD0).g_Offset_MMSA_SecurityRealmBlob = 0x208,
g_Offset_PacketContext_Blob = 0xC8.500 (UDP), Shell-Callback: 4444.IKE_HEADER, IKE_SA_PAYLOAD, IKE_PROPOSAL_PAYLOAD, IKE_TRANSFORM_PAYLOAD,
IKE_NONCE_PAYLOAD (32 Byte Nonce), IKE_KEY_EXCHANGE_PAYLOAD (DH 256 Byte),
IKE_NOTIFY_PAYLOAD, IKE_VENDOR_ID_PAYLOAD, IKE_SKF_FRAGMENT_PAYLOAD.
Konfigurierte Transforms: AES-CBC-128 (12), PRF HMAC-SHA2-256 (5),
INTEG HMAC-SHA2-256-128 (12), DH MODP-2048 (14).
IKE_DDOS_AMPLIFIER_PAYLOAD: Verstärkungsfaktor + 64 Byte Trigger.IKE_DDOS_LOOP_PAYLOAD: Schleifenzähler + 32 Byte Loop-Code.IKE_DDOS_MEMORY_PAYLOAD: Größe/Anzahl Allokation + 64 Byte Heap-Spray-Daten.HEAP_GROOM_CONTEXT: Heap-Handle, Zieladresse, Threads, Stop-Flag, allozierte Chunks.HEAP_GROOM_THREAD_PARAMS: Chunk-Größe, Iterationen, Thread-ID, SRWLOCK, use_nt_allocate.GROOM_CONFIG: Thread-Anzahl, Iterationen, Verzögerung, Chunk-Größe, min./max. Freigabe %.0x1000, 1000 Iterationen, Fragmentierung zwischen 30–70%.Vollständige ROP_CHAIN-Struktur mit allen benötigten 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, , .
Array von 512 Gadgets ().
Tabelle g_rop_patterns[] mit ~50+ Byte-Signaturmustern zum Auffinden der Gadgets in den Modulen:
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, etc.
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() → exit bei Sandbox/VM-Erkennung.disable_amsi(), disable_defender(), disable_etw(), patch_etw().start_shell_listener() → Reverse-Shell-Listener auf Port 4444.argv[1] (Ziel-IP) + argv[2] (Port, Standard 500).init_udp_socket() + inet_pton + test_target_reachability().Das Projekt befindet sich in der Abschlussphase und ist nicht voll funktionsfähig.
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) sind deklariert, können aber
je nach Build-Status unvollständig oder abwesend sein.runassys/-Abhängigkeiten
und der verlinkten Bibliotheken nicht kompilieren.Dieses Repository enthält einen Proof-of-Concept aus der offensiven Sicherheitsforschung, der auf einen niedrigschwelligen Netzwerk-Exploit-Vektor (IKEv2/ikeext.dll, Windows) abzielt.
Die Verwendung dieses Codes ist streng auf Test-, Forschungs- oder Laborumgebungen beschränkt, für die Sie eine ausdrückliche Genehmigung haben.
Der Autor übernimmt keine Haftung für jegliche illegale, unbefugte oder schädigende Nutzung dieses Codes. Der Code wird wie besehen bereitgestellt, ohne Garantie für Funktion, Stabilität oder das Ausbleiben unerwünschter Nebenwirkungen.
Das Projekt befindet sich noch in der Abschlussphase und ist im aktuellen Zustand nicht voll funktionsfähig.
logicoma__wibu00__wibu01PETETRIS.tw.rdata.text0x45,0x6e,0x69,...), Denuvo (0x64,0x65,0x6E,...).FAKE_DONGLE[], das Hardware-Dongles imitiert: skeydrv.dll, HASPDOSDRV,
MARXDEV1.SYS, WIBUKEY, SNTNLUSB, RNBOspro, etc.VM_SUBVM_MULVM_DIVVM_MODVM_EQUVM_NEQVM_LSSVM_GTRVM_LEQVM_GEQVM_OBF_INTVM_ADD_DBLVM_MUL_DBLif (OBFUS_CONDITION_BLOCK) BREAK_STACK_1breakfopenfclosefreadfwriteexitsnprintfvsprintfvsnprintfgetenvsystemabortatexitgetcwdtolowertoupperobfh_int_proxy() auf allen Parametern: 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 ersetzt durch GetProcAddress_custom: manuelle Durchlaufen des IMAGE_EXPORT_DIRECTORY
(Parse PE: e_lfanew, IMAGE_NT_HEADERS, IMAGE_DIRECTORY_ENTRY_EXPORT, AddressOfFunctions,
AddressOfNames, AddressOfNameOrdinals).LoadLibraryA obfuskiert in einer Kette von 6 verschachtelten Wrappern (LoadLibraryA_0 bis LoadLibraryA_proxy),
mit Rekonstruktion des DLL-Namens Zeichen für Zeichen über die volatilen Variablen
_k, _e, _r, _n, _e, _l und sprintf.IsDebuggerPresent() || IsDebuggerPresent_proxy()loop().byte 0xEDBREAK_STACK_1retcrash()int $3.byte 0xED, 0x00sub_rspstack_pivotrop_chain[MAX_ROP_CHAIN_SIZE]SKF_FRAGMENTS + 1