m4b/goblin

GitHub: m4b/goblin

一个跨平台、零拷贝的二进制解析库,解决多格式二进制文件的统一加载与分析问题。

Stars: 1463 | Forks: 195

# libgoblin [![Actions](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/cc88fd4d8f141207.svg)][actions-url] [![crates.io version](https://img.shields.io/crates/v/goblin.svg)][crates-goblin] ### 文档 https://docs.rs/goblin/ [更新日志](CHANGELOG.md) ### 用法 Goblin 需要 `rustc` 1.85.0(Rust 2024 版本)。 添加到你的 `Cargo.toml` ``` [dependencies] goblin = "0.10" ``` ### 功能特性 * 优秀的 crate 名称 * 零拷贝、跨平台、字节序感知,ELF64/32 实现 - 哇! * 零拷贝、跨平台、字节序感知,32/64 位 Mach-o 解析器 - 天哪! * PE 32/64 位解析器 - 太棒了! * Unix _和_ BSD 风格归档解析器(后者感谢 [@willglynn])- 好极了! * 多种 cfg 选项 - 这会让你头晕,读源码时也会让你生气! * 经过模糊测试 - “我很高兴地报告,goblin 成功通过了 1 亿次模糊测试,每个种子 1\~100 运行” - [@sanxiyn] * 测试 `libgoblin` 旨在成为你的二进制解析、加载和分析的一站式商店。 ### 使用场景 Goblin 主要支持以下重要的使用场景: 1. 核心、无 std 的 `#[repr(C)]` 结构体,编译时体积小,32/64(两者皆可)随你便。 2. 类型伪装。在一种类型上定义一次函数,但它能在 32 或 64 位变体上工作 - 无需真正更改任何内容,也无需宏!请查看 `examples/automagic.rs` 获取基础示例。 3. `std` 模式。这通过 `Pread` 和 `Pwrite` 提供了读写实现,从文件读取, 提供方便的分配,额外的方法等。这是针对那些可以分配并希望从磁盘读取二进制文件的客户端。 4. `Endian_fd`。一个真正糟糕的名字 😄,这是用于二进制分析的,比如在 [panopticon] 或 [falcon] 中需要读取不同字节序的二进制文件,_或者_ 作为 构建跨平台外部架构 binutils 的基础,例如 [cargo-sym] 和 [bingrep] 就是简单的示例,但可能性无限。 以下是你可以用这个 crate 做的一些事情(或帮助实现以便完成这些功能): 1. 编写一个编译器并用它来 [生成二进制文件][faerie](所有原始 C 结构体都已派生 [`Pwrite`][scroll])。 2. 编写一个二进制分析工具,用于加载、解析和分析各种二进制格式,例如 [panopticon] 或 [falcon]。 3. 编写一个 [半功能性的动态链接器][dryad]。 4. 编写一个 [内核][redox-os] 并在 `no_std` 配置下加载二进制文件。也就是说,它基本上只是 结构体和常量定义(就像 C 头文件一样)——没有 fd,没有输出,没有 std。 5. 编写一个 [bin2json] 工具,因为为什么不让二进制格式以 JSON 格式存在呢? ### 配置项 `libgoblin` 设计为高度可配置。当前的标志有: * elf64 - 64 位 elf 二进制文件,`repr(C)` 结构体定义 * elf32 - 32 位 elf 二进制文件,`repr(C)` 结构体定义 * mach64 - 64 位 mach-o `repr(C)` 结构体定义 * mach32 - 32 位 mach-o `repr(C)` 结构体定义 * pe32 - 32 位 PE `repr(C)` 结构体定义 * pe64 - 64 位 PE `repr(C)` 结构体定义 + te - Terse Executable (TE) `repr(C)` 结构体定义 * archive - Unix 归档解析器 * endian_fd - 根据二进制文件中的字节序进行解析 * std - 允许在 `no_std` 环境中使用 # 维护者 1. PE: [@kkent030315] 2. Elf: [@m4b],欢迎申请 3. Mach-o: [@m4b],欢迎申请 维护者是该特定后端的首接触审核者。他们根据之前的贡献、活跃度、基础知识和友好随和的行为(😊)来选择。 目前,我 ([@m4b]) 只有所有 PR 的合并权限。未来,该特定后端的维护者也可能拥有合并权限。 最后,我仍然会对所有 PR 进行简要审核,但大多数/完全会默认交给该后端维护者。 并且永远记住比尔和特德的智慧:“彼此友好!” ## 贡献 除非另有明确说明,否则你同意你的贡献将按照附带 LICENSE 文件(MIT 许可证)中的描述进行授权。 1. 请在提交信息前缀上受影响的二进制组件;越具体越好,例如: 如果你只修改了 elf 模块中的重定位信息,那么请写 “elf.reloc: added new constants for Z80” 2. 提交信息必须解释其变更,不要使用通用的 “changed” 或 “fix”;如果你推送这样的提交 像这样在 PR 中,[@m4b] 或其他人很可能会将其压缩。 3. 如果你正在对某个模块进行重大更改,请先提出问题并让我们讨论; 我不想浪费你的时间,如果这不是一个好的技术方向,或者等等。 4. 如果你的 PR 没有得到关注,请回复 PR 上提出的所有相关评论, 如果没有回应,请在 GitHub 上 ping [@m4b],也可以随时 通过电子邮件联系 [@m4b]。 5. 如果你要添加新功能,请添加测试。即使你没有添加测试, 测试也很棒且在 Rust 中很容易实现。
标签:bingrep, binutils, cargo-sym, Cargo生态, ELF解析, Falcon, Mach-O解析, Panopticon, PE解析, Rust, 二进制加载, 二进制解析, 云资产清单, 内存映射, 可视化界面, 开源库, 归档解析, 性能优化, 搜索引擎爬虫, 文件分析, 无标准库, 检测绕过, 端序感知, 类型双关, 编译器前端, 网络流量审计, 逆向工程, 通知系统, 零拷贝