#binary #pe #binary-parser #elf #archive #mach

无需 std goblin

一个顽皮的、跨平台的、支持 ELF、Mach-o 和 PE 二进制解析和加载的库

52 个版本

0.8.2 2024 年 4 月 29 日
0.8.0 2024 年 1 月 1 日
0.7.1 2023 年 6 月 12 日
0.6.1 2023 年 2 月 26 日
0.0.1 2016 年 6 月 15 日

#20解析器实现

Download history 150142/week @ 2024-05-02 144532/week @ 2024-05-09 153428/week @ 2024-05-16 146282/week @ 2024-05-23 168789/week @ 2024-05-30 144663/week @ 2024-06-06 151867/week @ 2024-06-13 146435/week @ 2024-06-20 141934/week @ 2024-06-27 128371/week @ 2024-07-04 134489/week @ 2024-07-11 142450/week @ 2024-07-18 144748/week @ 2024-07-25 153067/week @ 2024-08-01 153234/week @ 2024-08-08 139274/week @ 2024-08-15

619,487 每月下载量
用于 897 个 crate(176 个直接使用)

MIT 许可证

1MB
15K SLoC

libgoblin

Actions crates.io version

say the right words

文档

https://docs.rs/goblin/

变更日志

使用方法

Goblin 需要 rustc 1.63.0 (Rust 2021 版本)。

添加到你的 Cargo.toml

[dependencies]
goblin = "0.8"

特性

  • 令人惊叹的 crate 名称
  • 零拷贝、跨平台、端序感知、ELF64/32 实现 - 太棒了!
  • 零拷贝、跨平台、端序感知、32/64 位 Mach-o 解析器 - 哇哦!
  • PE 32/64 位解析器 - 哇哈哈!
  • Unix 和 BSD 风格的存档解析器(后者由 @willglynn 提供) - 哇塞!
  • 许多 cfg 选项 - 它会让你的头嗡嗡作响,当你阅读源代码时会让你生气!
  • 模糊测试 - "我很高兴地报告,goblin 经受了 1 亿次的模糊测试,每个种子 1 万次。" - @sanxiyn
  • 测试

libgoblin 力求成为你的二进制解析、加载和分析的一站式解决方案。

用例

Goblin 主要支持以下重要用例

  1. 核心、无 std 的 #[repr)] 结构体,编译时间短,32/64(或两者)任选。

  2. 类型欺骗。在类型上定义一个函数一次,但使其能够在 32 或 64 位变体上运行 - 而不真正更改任何内容,也不需要宏!请参阅 examples/automagic.rs 中的基本示例。

  3. std 模式。这通过 PreadPwrite 提供了读取和写入 impl,从文件中读取,便利的分配,额外的方法等。这是针对可以分配并希望从磁盘读取二进制文件的客户端。

  4. Endian_fd. 这个名字真的很糟糕 😆 这用于二进制分析,例如在 panopticonfalcon 中,需要读取具有不同端序的二进制文件,或者 作为构建跨平台的外部架构 binutils 的基础,例如 cargo-symbingrep 是这类应用的简单例子,但潜力无限。

以下是你可以使用此 crate 做的一些事情(或帮助实现,以便可以完成它们)

  1. 编写一个编译器,并使用它来 生成二进制文件(所有原始 C 结构体都派生了 Pwrite)。
  2. 编写一个二进制分析工具,它可以加载、解析和分析各种二进制格式,例如 panopticonfalcon
  3. 编写一个 半功能的动态链接器
  4. 编写一个 内核,并使用 no_std cfg 加载二进制文件。也就是说,它基本上只是一个结构和常量定义(就像 C 头文件一样)- 没有文件描述符、没有输出、没有标准库。
  5. 编写一个 bin2json 工具,因为为什么二进制格式不能是 JSON 呢?

Cfgs

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) 结构体定义
  • archive - Unix 归档解析器
  • endian_fd - 根据二进制文件中的端序进行解析
  • std - 允许 no_std 环境

贡献者

感谢大家 ❤️ !

按字典顺序排列

贡献

除非另有明确说明,否则您同意您的贡献按照随附的LICENSE文件(MIT)进行许可。

  1. 请在提交中包含受影响的二进制组件名称;越具体越好,例如,如果您只修改了elf模块中的重定位,那么请这样做:"elf.reloc: 为Z80添加了新的常量"。
  2. 提交信息必须解释其变更,不要使用通用的“已更改”或“修复”等;如果您将此类提交推送到PR,请注意@m4b或其他人很可能会压缩它们。
  3. 如果您要对模块进行重大更改,请先提出一个问题,让我们讨论;我不想浪费时间在不正确的技术方向上,等等。
  4. 如果您的PR没有得到关注,请回复PR上提出的所有相关评论,如果仍然没有回应,请在github上ping @m4b@philipc@willglynn,并且也请随时给@m4b发邮件。
  5. 如果您添加了新功能,请添加测试。即使您没有添加新功能,也可以添加测试,测试在rust中很棒且容易。
  6. 一旦cargo format正式发布,请使用默认设置格式化您的补丁

依赖项