substrant/hydra
GitHub: substrant/hydra
Hydra 是一个用于 Windows 进程操作的现代 C++23 库。
Stars: 1 | Forks: 0
# 水蛇
一个用于逆向工程、调试和仪表化的 C++23 Windows 进程操作库。完全基于 NTAPI 构建,并为特定的 Windows API 提供了额外的抽象。
内部库在 [Carbon 平台](https://carbonlabs.dev/) 和 Substrant 的几个内部逆向工程和仪表化工具中积极使用。
## 它能做什么
Hydra 为您提供了对 Windows 进程的直接、现代和简化的控制。它适用于需要位于传统抽象之下的工具:调试器、仪表化框架、反反调试助手以及任何需要原始访问目标进程的其它工具。
注意:Hydra 并非作为隐蔽工具包开发的,而是一个外部进程操作工具。利用高级 C++ 功能使得 Hydra 不论其底层程度如何,都使用高级 Windows 抽象。*随着 Hydra 的成熟,这将在未来发生变化*。
Hydra 在外部宿主进程中积极使用,这些进程需要在外部分析正在运行的 Windows 进程。其中一些涉及进程转储工具、可执行文件修补程序和外部游戏模组(Carbon 平台)。
## 快速浏览
```
#include
#include
// Open a process to receive a "process" object
std::expected proc = hy::process::open("notepad.exe");
if (!proc.has_value()) return proc.error(); // Returns NTSTATUS if failed
// Allocate local virtual memory and read from the process
hy::region buf = hy::region::alloc_local(0x1000);
proc->mm_read(0x123456ABCDEF, buf, buf.size());
// Scan for a byte pattern in a buffer
for (auto found : buf.scan_aob("\x48\x8B\x05\x00\x00\x00\x00", "xxx????")) {
// Variable "found" is a hy::addr'
}
// Find the main module and sections in a process
auto* my_module = proc->module();
auto code_section = my_module->section(".text");
// Walk the PEB to find modules
for (auto& mod : proc->linked_modules()) {
// Variable "mod" is a remote PE object
}
// Disassemble code in remote processes
hy::code_disasm disasm{ code_section->base() };
auto found = disasm.find(
code_section->size(),
code_query::opcode(0xE8),
code_query::reg(0, ZYDIS_REG_RAX))
);
```
## 计划功能
总体实现:
- [ ] 更隐蔽的使用机制
- [ ] 内部内存/仪表化
- [ ] 系统调用索引探测
- [ ] 更高的 API 粒度
- [ ] 启发式反汇编工具
附加功能:
- [ ] 自给自足的运行时注入
- [ ] 手动 DLL 映射支持
- [ ] 环形缓冲区通信
## 核心类型
| 类型 | 头文件 | 目的 |
|-------------------|-------------------|-----------------------------------------------------------------------------------------|
| `process` | `process.hpp` | 打开/操作目标进程。内存 I/O、模块/线程枚举、挂起/恢复/终止。 |
| `thread` | `thread.hpp` | 线程控制:挂起、恢复、获取/设置上下文、查询入口点。 |
| `addr` | `memory.hpp` | 统一指针类型。隐式转换为/从 `void*`、`uintptr_t`、`uint8_t*`。 |
| `region` | `memory.hpp` | 内存缓冲区。拥有(RAII)或包装外部内存。内置 AOB 扫描。 |
| `handle` | `handle.hpp` | RAII 处理。`nt_handle = handle`。在销毁时关闭。 |
| `pe_image` | `module.hpp` | PE 解析器。从磁盘、内存或流中读取。部分、导入、导出、RVA 解析。 |
| `remote_module` | `module.hpp` | 由远程进程内存支持的 `pe_image`。遍历部分、解析符号。 |
| `code_disasm` | `code_disasm.hpp` | 在 `region` 上的 Zydis 反汇编器。单步执行、跳过、根据谓词搜索。 |
| `window` | `window.hpp` | 稀薄的 HWND 包装器。查找、显示、隐藏。 |
| `comm_peer` | `comm.hpp` | 共享内存 IPC 环形缓冲区。在进程之间发送区域。未完成的实现。 |
## 核心理念
Hydra 并非旨在取代 Windows API,而是简化并抽象 Windows API 中一些笨拙的机制,以减少样板代码、消除常见的代码模式,并提高整体开发者体验。
**预期,而非异常。** `process::open` 返回 `std::expected`。生成器在失败时静默 `co_return`。没有 try/catch 杂乱。
**到处都是生成器。** 线程列表、模块遍历、内存区域枚举、AOB 扫描都返回懒 `std::generator` 协程。拉取你需要的内容,当你完成时停止。
**`addr` 到处都是。** 一个指针类型可以隐式转换为任何东西。无需在 `void*`、`uintptr_t` 和 `uint8_t*` 之间进行转换。算术操作正常工作,显式转换的工作量显著减少。
**默认隐式。** 处理包装类转换为 `HANDLE` 以简化与 Windows API 的集成。`addr` 尝试在可能的情况下隐式转换为有效的指针/整数类型。
**`region` 拥有或借用。** `alloc_local` 给你拥有的 RAII 内存。包装构造函数给你一个非拥有的视图。移动转移所有权,复制给出一个视图。扫描、填充、重定位、调整大小。它都有。
**`pe_source` 区分视图。** 一个 PE 可以从磁盘(`file`)、从映射内存(`mapped`)、从仅头文件(`header`)或从流中继承(`inherited`)读取。每个部分/缓冲区方法都接受一个 `pe_source`,这样你总是知道你在读取什么。
## 构建
```
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
```
需要 CMake 4.0+、MSVC 2022 和 phnt/Zydis 子模块(`git submodule update --init`)。输出 `libhydra.lib`,它将静态链接到你的项目。
## 状态
实验性,并在 Substrant 内部作为库使用。API 将会更改。不完整的功能以 `// TODO` 标记的形式存在于树中。
## 许可证
本项目采用 Apache License 2.0 许可。通过使用此源代码或其衍生作品,您同意在 [LICENSE](./LICENSE) 文件中概述的条款和条件。
标签:C++23, Carbon Platform, Findomain, NTAPI, PEB 分析, Substrant, Windows API, 云资产清单, 内存扫描, 内存管理, 开发库, 性能分析, 模块分析, 游戏模组, 漏洞分析, 端点可见性, 系统工具, 路径探测, 进程操作, 逆向工程