Skip to content

Latest commit

 

History

History
93 lines (73 loc) · 5.22 KB

File metadata and controls

93 lines (73 loc) · 5.22 KB

NtExt 是一个用于WoW64间接X64系统调用、X64地狱之门(Hell's Gate)和EDR规避的高级C++框架。可无缝加载64位kernel32并绕过用户空间挂钩。

如果你厌倦了传统的 Heaven's Gate 、如果你的 32 位程序急需直接调用 64 位的底层 API、或者你在寻找一个能对抗顶级用户态 Hook 的解决方案,NtExt 将是你的最终选择。

核心特性

  • Limbo's Gate (WoW64 Heaven’s Gate + Direct Syscall)
    我将这项技术命名为 Limbo's Gate 。它允许你在 32 位程序中动态解析系统调用号 (SSN) 并直接触发原生 64 位 syscall 指令,彻底绕过 32 位与 64 位 ntdll.dll 层面所有的 Ring 3 监控。
  • WoW64 加载 64位 Kernel32.dll 难题
    在 WoW64 进程中强行加载 64 位 kernel32.dll 通常会因 LdrLoadDll 的 PEB 子系统验证而失败。NtExt 采用精确的 PEB 伪装技术(热切换 IMAGE_SUBSYSTEM_WINDOWS_CUIGUI),完美欺骗系统加载器,实现 64 位模块的无损加载。
  • 集齐三大底层免杀技术
    • Heaven's Gate: 极简的段寄存器切换 (0x23 <-> 0x33),实现平滑的跨架构代码执行。
    • Hell's Gate: 直接从内存中的 64 位导出表提取原生机器码以获取 SSN,告别脆弱的硬编码。
    • Halo's Gate: 完美对抗 Inline Hook。当目标函数被篡改时,利用相邻内存搜索算法 (_seachImpl) 精准推导出被隐藏的真实 SSN。
  • 零内联汇编架构
    由类似 JIT 的动态字节码注入机制驱动,而非依赖特定编译器的汇编语法。在保持内存中零开销执行的同时,实现了极致的跨编译器兼容性(MSVC / GCC / Clang)。
  • 架构无缝切换
    基于对底层架构的极度封装,NtExt 完美抹平了 32 位与 64 位执行环境之间的错综差异。开发者在切换编译目标架构 (x86 / x64) 时,无需修改任何核心代码(或仅需极少量微调)。

主要功能 (x86 环境)

以下仅列出 WoW64 环境下的专属功能。纯 64 位环境下的功能与此类似。

函数 属性 描述
GetTeb64 / GetPeb64 [Ex] 获取 64 位 TEB/PEB 基址
GetNtdll64 / GetKernel64 [Ex] 获取 64 位 ntdll/kernel32 模块基址
LoadLibrary64 [Ex] 在 64 位空间中加载指定模块
GetModuleBase64 [Ex] 获取指定 64 位模块的基址
GetModuleLdrEntry64 [Ex] 获取指定 64 位模块的 LDR_DATA_TABLE_ENTRY 结构
GetProcAddress64 [Ex] 获取指定 64 位函数的物理地址 (已缓存)
GetSyscallNumber64 [Ex] 获取指定 64 位函数的系统调用号 (SSN)
GetLdrGetProcedureAddress64 [Ex] 获取 64 位 LdrGetProcedureAddress 函数地址
Call [Ex] 跨架构调用指定的 64 位函数
Syscall [Ex] 跨架构执行 64 位直接系统调用
Anycall [Ex] 支持动态执行任意x64汇编代码,具备自动栈对齐与非易失性寄存器恢复特性
memcpy64 [Ex] 连接 32 位与 64 位内存空间的安全拷贝函数

使用方法

#include <iostream>
#include <NtExt.hpp>

using namespace NtExt;

int main() {
    // 1. 标准跨架构函数调用
    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 << "[+] 操作系统版本: " << major << "." << minor << "." << build << std::endl;
    }

    // 2. 直接系统调用 (Limbo'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 魔数: 0x" << std::hex << dosMagic << std::endl;
    }
    return 0;
}