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://en.wikipedia.org/wiki/C%2B%2B17)
[]()
[]()
[]()
[]()
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, 中高交互蜜罐, 云资产清单, 内核交互, 内联钩子绕过, 动态解析, 安全防御规避, 恶意软件开发, 段切换, 用户态钩子绕过, 系统底层开发, 系统调用, 网络安全, 逆向工程, 间接系统调用, 隐私保护, 高交互蜜罐