libgoblin


文档
https://docs.rs/goblin/
变更日志
使用
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 各 100 万次。”—— @sanxiyn
- 测试
libgoblin 旨在成为你进行二进制解析、加载和分析的一站式解决方案。
使用场景
Goblin 主要支持以下重要使用场景:
-
核心、无 std 的 #[repr(C)] 结构体,编译时间极短,可自由选择 32/64 位(或两者)。
-
类型双关。在类型上定义一次函数,但使其同时适用于 32 位和 64 位变体——几乎无需修改,且无需宏!请参见 examples/automagic.rs 的基本示例。
-
std 模式。通过 Pread 和 Pwrite 提供读取和写入实现,支持从文件读取、便捷分配、额外方法等。适用于能够分配内存并希望从磁盘读取二进制的用户。
-
Endian_fd。一个糟糕的名字 😆 适用于像 panopticon 或 falcon 这样的二进制分析工具,它需要读取外部端序的二进制文件,或作为构建跨平台外部架构二进制工具的基础,例如 cargo-sym 和 bingrep 是简单的例子,但潜力无限。
以下是一些你可以使用此 crate 实现的功能(或帮助实现以便达成的):
- 编写编译器并使用它生成二进制文件(所有原始 C 结构体都派生自
Pwrite)。
- 编写一个加载、解析和分析各种二进制格式的二进制分析工具,例如 panopticon 或 falcon。
- 编写一个半功能动态链接器。
- 编写一个内核并使用
no_std 配置加载二进制文件。即,它基本上只是结构体和常量定义(如同 C 头文件)——无文件描述符、无输出、无 std。
- 编写一个 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 - 简洁可执行文件(TE)
repr(C) 结构体定义
- archive - Unix 存档解析器
- endian_fd - 根据二进制文件中的端序进行解析
- std - 允许
no_std 环境
维护者
- PE: @kkent030315
- Elf: @m4b,欢迎申请
- Mach-o: @m4b,欢迎申请
维护者是特定后端的首要联系人审阅者。根据先前的贡献、活跃度、基础知识以及友善和蔼的性格选定 :D
目前,我(@m4b)对所有 PR 拥有合并权限。未来,给定后端的维护者很可能也将拥有合并权限。
最后,我仍可能对所有 PR 进行粗略审阅,但将主要/完全依赖该后端的维护者。
始终铭记比尔和泰德的智慧:“对彼此友善!”
贡献者
感谢大家 ❤️ !
按字典序排列:
贡献
除非另有明确说明,否则您同意您的贡献按照附带 LICENSE 文件(MIT)中描述的方式许可。
- 请为提交添加前缀,标明受影响的二进制组件;越具体越好,例如,如果您仅修改 elf 模块中的重定位,则使用“elf.reloc: 为 Z80 添加新常量”
- 提交信息必须解释其更改,不要使用泛泛的“changed”或“fix”;如果您在 PR 中推送此类提交,请注意 @m4b 或其他人很可能会将其压缩合并。
- 如果要对模块进行重大更改,请先提出 issue 并进行讨论;我不希望因为技术方向不合适等原因浪费您的时间。
- 如果您的 PR 未得到关注,请回复 PR 上提出的所有相关评论,若仍未回复,请在 GitHub 上 @ @m4b 或发送邮件至 @m4b。
- 如果您添加新功能,请添加测试。即使不是,也请随意添加测试,测试很棒且在 Rust 中很容易实现。