91dnss/caver

GitHub: 91dnss/caver

一个用于在 ELF64 二进制文件中创建 code cave 的 Rust 库,通过追加可加载段并导出符号,为后续的逆向工程和二进制修补工作提供结构化的注入点。

Stars: 0 | Forks: 0

# caver [![Crates.io](https://img.shields.io/crates/v/caver)](https://crates.io/crates/caver) [![docs.rs](https://img.shields.io/docsrs/caver)](https://docs.rs/caver) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](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, 中高交互蜜罐, 二进制修改, 二进制安全, 云资产清单, 可视化界面, 后门开发, 恶意软件开发, 网络安全, 网络流量审计, 逆向工程, 通知系统, 隐私保护