⚠️ 项目正在收尾阶段。目前状态尚未完全可用。
EpSiLoNPoInTIkEv2.cpp 是一个针对 Windows 的 C/C++ 漏洞利用原型,基于 ikeext.dll(Windows 的 IKEv2 驱动程序)中的 double-free 漏洞开发,研究过程中暂定为 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), etc.0x45,0x6e,0x69,...), Denuvo (0x64,0x65,0x6E,...)。FAKE_DONGLE[] 模仿硬件加密狗:skeydrv.dll, HASPDOSDRV, MARXDEV1.SYS, WIBUKEY, SNTNLUSB, RNBOspro 等。VIRT == 1)所有算术和逻辑操作都可以路由到内部 VM (Obfh_VirtualMachine) 中:
OP__ADD, OP__SUB, ..., OP__NOP) 通过 __COUNTER__ 和 RND() 在编译时随机生成。_VM_ENCRYPT_INT(value) = (value - _VM_MUTATOR_KEY) * ~SALT_CMD。* -1),并附带垃圾值传递。goto、假的负 case、BREAK_STACK_*(内联汇编 xor; jz; .byte 0xE8; cpuid)、假的 JMP(.byte 0xFF, 0x25)以及伪造的 x86_64 代码块,以欺骗反编译器。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 之前注入一个死 else if (0) { BAD_CALL; }。#define while(...) : 条件为 __s_rdtsc() != 0.1 和一个荒谬的指针检查。#define for(...) : 条件为 OBFUS_CONDITION_BLOCK。#define switch(...) : 条件为 OBFUS_CONDITION_BLOCK。#define break : 在每个 break 之前注入 if (OBFUS_CONDITION_BLOCK) BREAK_STACK_1。HIDE_STRING)STACK_STRING(str) : 通过复合字面量将字符串压入栈中。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, , , , , , , , , , , , , , , 。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),通过 volatile 变量 _k, _e, _r, _n, _e, _l 和 sprintf 逐字符重建 DLL 名称。ANTI_DEBUG_V2 == 1)ThreadCompareDRs):对主线程执行 SuspendThread,使用 CONTEXT_DEBUG_REGISTERS 调用 GetThreadContext,检查 Dr0–Dr3、Dr7,通过 ad_ZeroDRs 清零。IsDebuggerPresent_proxy:动态加载 kernel32.dll,通过 volatile 变量(_I, _s, _D, _e, _b, _u, _g, _g, _e, _r, _P, _r, _e, _s, _e, _n, _t)逐字符重建函数名 IsDebuggerPresent,通过 GetProcAddress 调用。ANTI_DEBUG:双重检查 IsDebuggerPresent() || IsDebuggerPresent_proxy(),触发 loop()(无限循环),.byte 0xED(特权 IN 指令),BREAK_STACK_1,ret ASM,然后 crash()(int $3 + .byte 0xED, 0x00)。9 种内联汇编序列变体插入到敏感函数中: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)、导入 (0x179110)、异常 (0x183000)、重定位 (0x18C000)、加载配置 (0x12AE70)、调试 (0x155CD0)。g_Offset_MMSA_SecurityRealmBlob = 0x208,g_Offset_PacketContext_Blob = 0xC8。500 (UDP),Shell 回调:4444。IKE_HEADER, IKE_SA_PAYLOAD, IKE_PROPOSAL_PAYLOAD, IKE_TRANSFORM_PAYLOAD, IKE_NONCE_PAYLOAD (32 bytes nonce), IKE_KEY_EXCHANGE_PAYLOAD (DH 256 bytes), 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 字节循环代码。IKE_DDOS_MEMORY_PAYLOAD:分配大小/计数 + 64 字节堆喷数据。HEAP_GROOM_CONTEXT:堆句柄、目标地址、线程、停止标志、已分配块。HEAP_GROOM_THREAD_PARAMS:块大小、迭代次数、线程 ID、SRWLOCK、use_nt_allocate。GROOM_CONFIG:线程数、迭代次数、延迟、块大小、最小/最大空闲百分比。0x1000 大小的块,1000 次迭代,碎片率在 30–70% 之间。完整的 ROP_CHAIN 结构,包含所有必要的 gadget: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 个 gadget 的数组(rop_chain[MAX_ROP_CHAIN_SIZE])。
表 g_rop_patterns[] 包含约 50+ 个字节签名模式,用于在模块中定位 gadget: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() → 反弹 Shell 监听器,端口 4444。argv[1](目标 IP)+ argv[2](端口,默认 500)。init_udp_socket() + inet_pton + test_target_reachability()。SKF_FRAGMENTS + 1 个数据包)。该项目正在收尾阶段,目前尚未完全可用。
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)的进攻性安全研究原型。
此代码的使用严格限于您拥有明确授权的测试、研究或实验室环境。
作者对任何非法、未经授权或破坏性使用此代码的行为不承担任何责任。代码按原样提供,不附带任何关于功能、稳定性或不存在不良影响的保证。
该项目仍在收尾阶段,目前状态下尚未完全可用。
HeapFreeGlobalAllocGlobalFreeGetTempPathSetEventResetEventSleepmemmoveGetParentGetWindowRectGetClientRectSetWindowPosSetConsoleTextAttributeGetDesktopWindowGetStockObject