daschr/rust_win_x64_shellcode

GitHub: daschr/rust_win_x64_shellcode

一个使用 Rust 在「no_std」环境下编写 Windows x64 shellcode 的模板项目,通过 PEB 遍历动态解析 API 并生成位置无关的可注入机器码。

Stars: 1 | Forks: 0

# Rusty x64 Windows Shellcode 模板 一个用于使用 Rust 编写 Windows x64 shellcode 的极简且功能丰富的起点。 此模板演示了如何引导 `no_std` Rust 代码,直接从 Process Environment Block (PEB) 中解析 Win32 API 函数,并将结果打包为可注入到其他进程或 loader 中的原始 shellcode。 ## 为什么使用此模板? * **便捷的 Win32 解析** – 包含 `fetch_fn_from_peb!` 宏,用于 在不依赖导入表的情况下动态发现 API 函数。 * **实用的示例 payload** – 默认入口点加载 `user32.dll` 并 显示一个 `MessageBoxA`,展示了如何在 shellcode 上下文中调用 Windows API。 * **注重体积的构建 pipeline** – Release profile 设置、链接脚本和 辅助任务经过专门调优,可生成体积小巧的、位置无关的输出。 * **可扩展的基础** – 项目结构刻意保持简单,以便 您可以替换为自己的 payload 逻辑、添加重定位处理,或与 自定义 loader 集成。 ## 前置条件 在构建模板之前,您需要: * 近期的 Rust 工具链(兼容 edition 2024)。从 Linux 交叉编译需要 安装 Windows GNU target:`rustup target add x86_64-pc-windows-gnu`。 * LLVM `objcopy`(可通过 `binutils` 或 LLVM 工具组件获取),用于 将编译后的 `.text` section 提取为原始 shellcode。 * (可选)[`cargo-make`](https://github.com/sagiegurari/cargo-make),如果您 想使用提供的自动化任务。 ## 构建 shellcode 1. 为 Windows target 构建项目: cargo build --release --target x86_64-pc-windows-gnu 2. 从生成的 PE 文件中提取 `.text` section: objcopy -O binary --only-section=.text \ target/x86_64-pc-windows-gnu/release/shellcode.exe sh64.bin 生成的 `sh64.bin` 包含位置无关的机器码,可由 loader 进行注入或嵌入。 ### 使用 `cargo-make` 如果已安装 `cargo-make`,您可以运行内置的工作流,而无需执行上述 手动步骤: ``` cargo make ``` 此命令会构建 release 产物,并将 `sh64.bin` 写入项目 根目录。要清理生成的文件,请运行 `cargo make cleanup`。 ## 项目布局 ``` . ├── shellcode.ld # Linker script for fine-grained section control ├── src/ │ ├── common.rs # PE/TEB/PEB structures and helper traits │ ├── getprocaddr.rs # PEB traversal and export resolution logic │ └── main.rs # Shellcode entry point and sample payload ├── docs/ │ └── CODE_DOCUMENTATION.md # In-depth walkthrough of the Rust modules ├── Cargo.toml # Package metadata and optimized release profile └── Makefile.toml # cargo-make tasks for building and extraction ``` ## 自定义 payload * 修改 `src/main.rs` 以更改 shellcode 行为。示例展示了如何 解析并调用 Win32 API;您可以将此模式调整用于您自己的逻辑。 * 在 `no_std` 代码中的任何位置使用 `fetch_fn_from_peb!` 以获取类型化的 函数指针,而无需静态导入。如果找不到 DLL 或函数,该宏会自动 panic(并 调用 `ExitProcess`)。 * 如果您需要解析 PE 头、遍历 loader 列表或执行手动重定位,请在 `src/common.rs` 或 `src/getprocaddr.rs` 中添加额外的辅助例程。 ## 学习资源 该仓库包含手写文档,说明了辅助 trait、结构和宏是如何协同工作以引导 Windows shellcode 运行时的。您可以在 [`docs/CODE_DOCUMENTATION.md`](docs/CODE_DOCUMENTATION.md) 中找到它。 对于刚接触 Windows 内部机制的新手,以下主题值得探索: * [Process Environment Block (PEB)](https://learn.microsoft.com/windows/win32/api/winternl/ns-winternl-peb) 的结构 以及 loader 数据列表如何公开已加载的模块。 * PE 文件导出表、重定位和 sections。 * Rust `no_std` 编程模式,包括自定义 panic 处理程序和 FFI。 ## 负责任的使用 本项目仅用于教育目的、红队工具开发以及合法的安全研究。在使用或修改代码时,请确保遵守与您所在司法管辖区和组织相关的法律、政策和道德准则。
标签:PEB, Rust, Shellcode, 可视化界面, 安全工具开发, 技术调研, 端点可见性, 网络流量审计, 通知系统