
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, logicoma, __wibu00, __wibu01, PETETRIS, .tw, .rdata (Nuitka), .text (Screen2Exe), etc.0x45,0x6e,0x69,...), Denuvo (0x64,0x65,0x6E,...).FAKE_DONGLE[], das Hardware-Dongles imitiert: skeydrv.dll, HASPDOSDRV,
MARXDEV1.SYS, WIBUKEY, SNTNLUSB, RNBOspro, 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, 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, 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 if (OBFUS_CONDITION_BLOCK) BREAK_STACK_1 vor jedem break.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, fopen, fclose, fread, fwrite, exit, snprintf,
vsprintf, vsnprintf, getenv, system, abort, atexit, getcwd, tolower, toupper.obfh_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.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 IsDebuggerPresent() || IsDebuggerPresent_proxy(),
löst loop() (Endlosschleife) aus, .byte 0xED (privilegiertes IN), BREAK_STACK_1, ret-ASM,
dann crash() (int $3 + .byte 0xED, 0x00).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.