freelyflyyy/NtExt

GitHub: freelyflyyy/NtExt

一个融合 Heaven's Gate、Hell's Gate 与 Halo's Gate 三大技术的 C++ 框架,通过独创的 Limbo's Gate 实现 WoW64 进程间接 syscall 执行与 EDR 用户态钩子绕过。

Stars: 35 | Forks: 2

NtExt

[英语](README.md) | [简体中文](README_CN.md) [![语言](https://img.shields.io/badge/Language-C++17-blue.svg)](https://en.wikipedia.org/wiki/C%2B%2B17) [![平台](https://img.shields.io/badge/Platform-Windows%20x64%20%7C%20WoW64-lightgrey.svg)]() [![构建](https://img.shields.io/badge/Build-CMake-orange.svg)]() [![架构](https://img.shields.io/badge/Arch-Zero%20Inline%20Assembly-critical.svg)]() [![许可证](https://img.shields.io/badge/License-MIT-green.svg)]()
NtExt 是一个高级的 C++ 框架,用于实现 **WoW64 Heaven’s Gate + Indirect Syscall**、Heaven's Gate 和 EDR 规避,并能加载 64 位 kernel32 以及绕过用户态 (user-land) 的钩子 (hook)。 如果您对传统 Heaven's Gate 实现的不稳定性感到沮丧,需要从 32 位进程中直接访问 64 位 API,或者需要绕过深层的用户态钩子,NtExt 是终极解决方案。 ### 核心亮点 * **Limbo's Gate (WoW64 Heaven’s Gate + Indirect Syscall)**\ 我将这种特定技术称为 **"Limbo's Gate"**。它允许 32 位进程动态解析系统服务号 (SSN) 并间接执行原生的 64 位 `syscall` 指令,从而完全绕过 32 位和 64 位地址空间中的 `ntdll.dll` Ring 3 钩子。 * **WoW64 64 位 Kernel32 加载**\ 在 WoW64 进程中加载 64 位 `kernel32.dll` 通常会因为 `LdrLoadDll` 中的 PEB 子系统验证而失败。NtExt 利用精确的 PEB 伪造技术(将 `IMAGE_SUBSYSTEM_WINDOWS_CUI` 热交换为 `GUI`)来欺骗 OS 加载器,从而实现完美无瑕的 64 位模块初始化。 * **三位一体的门技术 (The Holy Trinity of Gates)** * **Heaven's Gate**:无缝的段切换(`0x23` <-> `0x33`),用于跨架构执行。 * **Hell's Gate**:直接从内存中的 64 位导出表动态提取 SSN,消除了硬编码的特定于操作系统的编号。 * **Halo's Gate**:通过实现邻域搜索算法 (`_seachImpl`) 从相邻的未挂钩函数推导出正确的 SSN,从而击败内联钩子。 * **零内联汇编架构 (Zero-Inline-Assembly Architecture)**\ 由类似 JIT 的动态字节码注入机制驱动,而不是依赖于特定编译器的汇编语法。它实现了极致的跨编译器兼容性(MSVC / GCC / Clang),同时在内存中保持零开销执行。 * **无缝的跨架构编译**\ 基于高度封装的底层架构构建,NtExt 完全抽象化了 32 位和 64 位环境之间的复杂差异。开发者可以在编译期间切换目标架构(x86 / x64),而无需修改代码或仅需极少的修改。 ### 主要功能 API 参考 NtExt 无缝支持 WoW64 (32 位) 和原生 x64 (64 位) 环境。该框架为每种上下文暴露了经过优化的不同 API。 #### 1. WoW64 上下文(32 位到 64 位执行) *这些函数专为将 32 位进程与 64 位子系统桥接而设计。* | 函数 | 属性 | 描述 | |:------------------------------|:---------:|:--------------------------------------------------------------------------------------------------------------------------| | `GetTeb64` / `GetPeb64` | **[Ex]** | 跨边界获取 64 位 TEB/PEB 基地址 | | `GetNtdll64` / `GetKernel64` | **[Ex]** | 获取 64 位 ntdll/kernel32 基地址 | | `LoadLibrary64` | **[Ex]** | 在 64 位空间中原生加载指定模块 | | `GetModuleBase64` | **[Ex]** | 在 64 位中获取指定模块的基地址 | | `GetModuleLdrEntry64` | **[Ex]** | 获取指定模块的 `LDR_DATA_TABLE_ENTRY` 结构 | | `GetProcAddress64` | **[Ex]** | 在 64 位中获取指定函数的地址 **(带缓存)** | | `GetSyscallNumber64` | **[Ex]** | 在 64 位中获取指定函数的 SSN | | `GetLdrGetProcedureAddress64` | **[Ex]** | 在 64 位中获取 `LdrGetProcedureAddress` 函数的地址 | | `Call` | **[Ex]** | 对指定 64 位函数进行跨架构调用 | | `Syscall` | **[Ex]** | 对 64 位函数进行跨架构直接 Syscall | | `Anycall` | **[Ex]** | 支持动态执行 x64 汇编代码,具有自动堆栈对齐和非易失性寄存器恢复功能 | | `memcpy64` | **[Ex]** | 桥接 32 位和 64 位地址空间的安全内存复制 | ### 用法 ``` #include #include using namespace NtExt; int main() { // 1. Normal cross-architecture call DWORD64 ntdll64 = Resolver.GetNtdll64(); DWORD64 pRtlGetVersion = Resolver.GetProcAddress64(ntdll64, "RtlGetVersion"); alignas(8) BYTE osvi[300] = { 0 }; *(DWORD*)osvi = 284; NTSTATUS status = Call(pRtlGetVersion)((DWORD64)&osvi); if (status == 0) { DWORD major = *(DWORD*)(osvi + 4); DWORD minor = *(DWORD*)(osvi + 8); DWORD build = *(DWORD*)(osvi + 12); std::cout << "[+] OS Version: " << major << "." << minor << "." << build << std::endl; } // 2. Direct Syscall (Limbo's Gate / Hell's Gate) DWORD64 ssn = Resolver.GetSyscallNumber64(ntdll64, "NtReadVirtualMemory"); WORD dosMagic = 0; NTSTATUS status2 = Syscall((WORD) ssn)( (DWORD64) -1, (DWORD64) ntdll64, (DWORD64) &dosMagic, (DWORD64) sizeof(dosMagic), (DWORD64) 0 ); if (status2 == 0) { std::cout << "[+] NTDLL DOS Magic: 0x" << std::hex << dosMagic << std::endl; } return 0; } ```
标签:Bash脚本, C++17, CMake, DNS 反向解析, EDR绕过, Halo's Gate, Heaven's Gate, Hell's Gate, Hpfeeds, HTTP头分析, PEB欺骗, SSN解析, WoW64, 中高交互蜜罐, 云资产清单, 内核交互, 内联钩子绕过, 动态解析, 安全防御规避, 恶意软件开发, 段切换, 用户态钩子绕过, 系统底层开发, 系统调用, 网络安全, 逆向工程, 间接系统调用, 隐私保护, 高交互蜜罐