91dnss/caver
GitHub: 91dnss/caver
一个用于在 ELF64 二进制文件中创建 code cave 的 Rust 库,通过追加可加载段并导出符号,为后续的逆向工程和二进制修补工作提供结构化的注入点。
Stars: 0 | Forks: 0
# caver
[](https://crates.io/crates/caver)
[](https://docs.rs/caver)
[](LICENSE)
用于 Rust 的 ELF64 code cave 注入库。
`caver` 通过追加一个新的可加载段 (loadable segment) 在 ELF64 二进制文件中创建 code cave。
它仅处理 **结构性 ELF 修改** —— 即创建和标记空间。
汇编、trampolines 和 hooking 则留给你的反汇编器处理。
支持 x86_64、AArch64 和 RISC-V 64(仅限小端序 ELF64)。
## 安装
```
[dependencies]
caver = "0.3"
```
## Cave 类型
每个 cave 都有一个 **填充模式 (fill pattern)**,用于控制其内容以及反汇编器如何解释它:
| Fill | Contents | ELF symbol type | Disassembler sees |
|------|----------|-----------------|-------------------|
| `FillByte::ArchNop` | arch NOP sled | `STT_FUNC` | function entry point |
| `FillByte::Zero` | null bytes | `STT_OBJECT` | data variable |
当你计划在 cave 中写入代码时使用 `ArchNop`。当你需要一个可写的数据区域时使用 `Zero`。
## 命名
每个 cave 有两个名称,用于不同的目的:
- **`name`** — ELF 节名称(例如 `.mycode`)。必须以 `.` 开头。
这是 `readelf`、`objdump` 和 `elf.sections()` 所看到的内容。
- **`symbol`** — 导出的符号名称(例如 `caverfn_mycode`)。这是 Binary Ninja、Ghidra 和 IDA 在自动分析二进制文件时看到的内容。
如果你不调用 `.symbol()`,caver 会根据节名称派生一个:
对于 NOP cave 是 `caverfn_`,对于 zero cave 是 `caverobj_`。
```
.mycode → caverfn_mycode (ArchNop, auto)
.mydata → caverobj_mydata (Zero, auto)
.hook → my_hook (ArchNop, overridden)
```
## 用法
### 注入单个 cave
```
use caver::cave::{CaveOptions, FillByte, inject};
use caver::elf::ElfFile;
fn main() -> caver::error::Result<()> {
let elf = ElfFile::open("./binary")?;
let patched = inject(
&elf,
&CaveOptions::builder()
.size(512)
.name(".mycode")
// .symbol("my_name") // optional override
// .fill(FillByte::Zero) // default is ArchNop
.build()?,
)?;
// info() returns vma, offset, size, section name, and resolved symbol
println!("{}", patched.info());
patched.write("./binary_patched")?;
Ok(())
}
```
### 注入多个 cave
```
use caver::cave::{CaveOptions, FillByte, inject_many};
use caver::elf::ElfFile;
fn main() -> caver::error::Result<()> {
let elf = ElfFile::open("./binary")?;
let patched = inject_many(&elf, &[
// NOP sled — auto symbol: caverfn_mycode
CaveOptions::builder()
.size(512)
.name(".mycode")
.build()?,
// Data region — auto symbol: caverobj_mydata
CaveOptions::builder()
.size(256)
.name(".mydata")
.fill(FillByte::Zero)
.build()?,
// NOP sled — custom symbol overrides auto-generation
CaveOptions::builder()
.size(128)
.name(".hook")
.symbol("my_hook")
.build()?,
])?;
for info in patched.infos() {
println!("{info}");
}
patched.write("./binary_patched")?;
Ok(())
}
```
### 检查二进制文件
```
use caver::elf::ElfFile;
fn main() -> caver::error::Result<()> {
let elf = ElfFile::open("./binary")?;
// Scan for existing slack space before deciding to inject
for cave in elf.find_caves(64)? {
if cave.is_executable() {
println!("existing executable cave: {cave}");
}
}
Ok(())
}
```
## 许可证
MIT
标签:AArch64, Code Cave, DNS 反向解析, ELF64, Hakrawler, PE/ELF操作, RISC-V, Rust, TLS配置检查, x86_64, 中高交互蜜罐, 二进制修改, 二进制安全, 云资产清单, 可视化界面, 后门开发, 恶意软件开发, 网络安全, 网络流量审计, 逆向工程, 通知系统, 隐私保护