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 在 解析器实现
619,487 每月下载量
用于 897 个 crate(176 个直接使用)
1MB
15K SLoC
libgoblin
文档
使用方法
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 主要支持以下重要用例
-
核心、无 std 的
#[repr)]
结构体,编译时间短,32/64(或两者)任选。 -
类型欺骗。在类型上定义一个函数一次,但使其能够在 32 或 64 位变体上运行 - 而不真正更改任何内容,也不需要宏!请参阅
examples/automagic.rs
中的基本示例。 -
std
模式。这通过Pread
和Pwrite
提供了读取和写入 impl,从文件中读取,便利的分配,额外的方法等。这是针对可以分配并希望从磁盘读取二进制文件的客户端。 -
Endian_fd
. 这个名字真的很糟糕 😆 这用于二进制分析,例如在 panopticon 或 falcon 中,需要读取具有不同端序的二进制文件,或者 作为构建跨平台的外部架构 binutils 的基础,例如 cargo-sym 和 bingrep 是这类应用的简单例子,但潜力无限。
以下是你可以使用此 crate 做的一些事情(或帮助实现,以便可以完成它们)
- 编写一个编译器,并使用它来 生成二进制文件(所有原始 C 结构体都派生了
Pwrite
)。 - 编写一个二进制分析工具,它可以加载、解析和分析各种二进制格式,例如 panopticon 或 falcon。
- 编写一个 半功能的动态链接器。
- 编写一个 内核,并使用
no_std
cfg 加载二进制文件。也就是说,它基本上只是一个结构和常量定义(就像 C 头文件一样)- 没有文件描述符、没有输出、没有标准库。 - 编写一个 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
环境
贡献者
感谢大家 ❤️ !
按字典顺序排列
- @2vg
- @5225225
- @alessandrod
- @amanieu
- @anfedotoff
- @apalm
- @baloo
- @burjui
- @connorkuehl
- @dancrossnyc
- @dureuill
- @Evian-Zhang
- @ExPixel
- @flanfly
- @glandium
- @h33p
- @ibabushkin
- @jackcmay
- @jan-auer
- @Javagedes
- @jessehui
- @jdub
- @Jhynjhiruu
- @johannst
- @JohnScience
- @jrmuizel
- @jsgf
- @keith
- @kjempelodott
- @kkent030315
- @ko1n
- @le-jzr
- @Lichtso
- @lion128
- @lissyx
- @llogiq
- @lumag
- @lzutao
- @lzybkr
- @m-hilgendorf
- @mmaekr
- @m4b
- @messense
- @mitsuhiko
- @mkroening
- @mre
- @Mrmaxmeier
- n01e0
- nathaniel-daniel
- @nick96
- @nico-abram
- @npmccallum
- @pchickey
- @philipc
- @Pzixel
- @quake
- @raindev
- @RaitoBezarius
- @rocallahan
- @sanxiyn
- @skdltmxn
- @sollyucko
- @Swatinem
- @SweetVishnya
- @SquareMan
- @tathanhdinh
- @Techno-coder
- @tiann
- @ticki
- @Timmmm
- @Tiwalun
- @track-5
- @tux3
- @wickerwacka
- @willglynn
- @woodruffw
- @wyxloading
- @xcoldhandsx
- @x64k
贡献
除非另有明确说明,否则您同意您的贡献按照随附的LICENSE文件(MIT)进行许可。
- 请在提交中包含受影响的二进制组件名称;越具体越好,例如,如果您只修改了elf模块中的重定位,那么请这样做:"elf.reloc: 为Z80添加了新的常量"。
- 提交信息必须解释其变更,不要使用通用的“已更改”或“修复”等;如果您将此类提交推送到PR,请注意@m4b或其他人很可能会压缩它们。
- 如果您要对模块进行重大更改,请先提出一个问题,让我们讨论;我不想浪费时间在不正确的技术方向上,等等。
- 如果您的PR没有得到关注,请回复PR上提出的所有相关评论,如果仍然没有回应,请在github上ping @m4b,@philipc或@willglynn,并且也请随时给@m4b发邮件。
- 如果您添加了新功能,请添加测试。即使您没有添加新功能,也可以添加测试,测试在rust中很棒且容易。
- 一旦cargo format正式发布,请使用默认设置格式化您的补丁。