zahanzo/NativaStub-Gen

GitHub: zahanzo/NativaStub-Gen

一款C++20自动化工具,通过静态解析本地ntdll.dll动态提取SSN并生成Direct Syscall存根,用于绕过EDR用户态钩子。

Stars: 2 | Forks: 0

# NativaStub-Gen 🥷 **NativaStub-Gen** 是一款使用 **C++20** 开发的自动化工具,能够静态解析 Windows `ntdll.dll` 二进制文件,动态提取系统服务编号(SSN),并生成可直接使用的 Direct Syscall 存根。 ### 🎓 动机 本项目旨在展示对 Windows 内部机制、PE(可移植可执行文件)解析以及红队中用于绕过端点检测与响应(EDR)用户态钩子的规避技术的深入理解。 ## 🧠 工作原理(逐步说明) 该工具的核心目标是避免调用可能被安全解决方案监控或挂钩的标准 Windows API。它通过直接读取磁盘上干净的、未挂钩的 `ntdll.dll`,提取执行系统调用所需的数据来实现这一目标。 1. **读取原始文件:** 程序定位并直接从硬盘读取原始的 `C:\Windows\System32\ntdll.dll`,绕过已加载到进程内存中的版本(该版本通常是 EDR 放置其 `jmp` 钩子的地方)。 2. **解析 PE 结构:** 解析原始字节数组,映射 **DOS 头** 并遍历 **NT 头** 以定位 **数据目录**。 3. **枚举导出目录:** 解析器导航到 **导出目录**,映射所有导出的函数,特别查找以 `Nt` 或 `Zw` 开头的函数(即本机 API)。 4. **提取 SSN:** 找到目标本机 API 后,工具分析该函数在 `.text` 节中的操作码,动态提取 **系统服务编号(SSN)**(例如,识别 `mov eax, [SSN]` 指令模式)。 5. **生成存根:** 最后,生成一个包含提取出的 SSN 的干净 C++ 头文件和汇编存根。这些存根直接使用 `syscall` 指令,使测试应用程序能够与 Windows 内核(Ring 0)通信,同时完全规避用户态 API 钩子。 ## 🚀 功能 * **使用现代 C++20 编写:** 采用现代内存管理和语法。 * **零依赖解析:** 自定义 PE 解析器实现,不依赖外部库或可疑的 Windows API。 * **动态提取:** 由于直接从当前主机的 `ntdll.dll` 中提取编号,因此不受不同 Windows 构建版本间 SSN 变化的影响。 * **即用型输出:** 自动将提取的数据格式化为可用的代码结构。 ## 📂 项目结构 ``` . ├── NativaStub-Gen.sln # Visual Studio Solution ├── NativaStub-Gen/ # Core Generator │ ├── src/ │ │ ├── main.cpp │ │ ├── PEParser.cpp # PE structure parsing logic │ │ ├── PEParser.h │ │ ├── StubGenerator.cpp # Logic to format and output the stubs │ │ └── StubGenerator.h ├── PoC/ # Proof of Concept Example │ └── main.cpp # Example of using the generated Direct Syscalls ``` ## 🛠️ 构建与使用 ### 阶段一:构建生成器 1. 克隆仓库,在 **Visual Studio** 中打开 `NativaStub-Gen.sln`。 2. 确保生成目标设置为 **Release / x64**。 3. 生成解决方案并运行生成的可执行文件。 4. 工具将解析系统中的 `ntdll.dll`,并生成必要的 syscall 文件(通常是一个 `.hpp` 头文件和一个 `.asm` 汇编文件)。 ### 阶段二:编译 PoC(重要:MASM 配置) 由于 PoC 以源代码示例形式提供,你需要手动集成生成的存根以测试规避效果: 1. 在 Visual Studio 中为 PoC 创建一个新的 C++ 控制台项目,并添加提供的 `PoC/main.cpp` 文件。 2. 将阶段一中生成的 `.hpp` 和 `.asm` 文件复制到 PoC 项目目录中,并将其添加到 Visual Studio 解决方案中(**项目右键 → 添加 → 现有项**)。 3. **启用 MASM:** 在解决方案资源管理器中右键单击 PoC 项目,选择 **生成依赖项 → 生成自定义...**,然后勾选 **masm** 复选框。 4. **配置 ASM 文件:** 右键单击解决方案资源管理器中生成的 `.asm` 文件,选择 **属性**。在 **配置属性 → 常规 → 项目类型** 中,将其更改为 **Microsoft Macro Assembler**。 5. 在 `main.cpp` 中包含 `.hpp` 头文件,确保 PoC 设置为 **x64**,然后编译。 6. 运行 PoC,验证 Direct Syscall 成功绕过用户态钩子! ## ⚠️ 免责声明 本项目仅用于 **教育目的和安全研究**。旨在帮助安全专业人员和学生理解 Windows 内部机制和用户态挂钩原理。作者不对任何直接或间接损害,以及使用本仓库中信息或工具的非法行为负责。 **开发者:0xRobert de Souza Lages。** *探索 x64 架构、二进制分析和裸机执行的深度。*
标签:C++20, Hpfeeds, Ntdll解析, PE解析, SSN提取, Windows内核, 云安全监控, 云资产清单, 数据展示, 汇编存根, 白帽子, 私有化部署, 系统调用, 红队, 逆向工程, 防御规避, 静态分析