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, 可视化界面, 安全工具开发, 技术调研, 端点可见性, 网络流量审计, 通知系统