1个不稳定版本
0.1.2 | 2023年9月4日 |
---|
#2338 在 解析器实现
5.5MB
4.5K SLoC
包含 (ELF库, 4MB) libqscintilla2_qt5.so.15.0.0, (ELF可执行/库, 1MB) assets/libjpeg/libjpeg.so.9, (ELF库, 290KB) assets/libvpf/libvpf.so.4.1
简介
这是一个用于解析和修改ELF格式二进制文件的库。有其他库如 elf、elfy 和 elfkit 用于解析格式,但它们要么无法修改ELF二进制文件(elf和elfy),要么有限/未维护(elfkit)。DEAF的目标是允许用户修改他们可以在二进制文件中看到的一切——你应该能够轻松地向符号表添加符号、删除函数体或更改节名称。你做出的某些更改可能会破坏二进制文件。例如,如果你删除了函数体,那么在间隙之后的相对分支指令将不再指向正确的地址。
随着库的开发,你的更改破坏ELF二进制文件的方式应该越来越少,最终目标是即使在代码从可执行部分删除时也能处理更新分支指令。
(返回顶部)
入门
此项目仍处于非常初期的阶段,因此请预期在版本之间会有许多破坏性更改、重构和组织,因为我们正在确定事物归属的地方。如果您仍然想尝试它,请使用 cargo add 将 deaf 包含到您的项目中
cargo add deaf
或通过手动更新您的 cargo toml
deaf = "0.1.0"
然后在项目中使用它,如下所示
use deaf::{Binary,Section,common::SectionType};
let binary = Binary::load("assets/libjpeg/libjpeg.so.9").unwrap();
for section in binary.sections(SectionType::Strings).iter() {
let name_offset = section.name();
let name_value = binary.section_name(name_offset).unwrap();
println!("{}",name_value);
}
有关更多详细信息,请参阅文档。
(返回顶部)
路线图
0.1.0
本版本主要针对提供基本功能。
- 无缝、字节序感知的字段,可以读写
- 更新字段以无缝支持32位或64位字节范围
- 为枚举风格的头部字段创建常量
- 创建FileHeader结构体,可以读取和写入二进制数据
- 创建ProgramHeader结构体,可以读取和写入二进制数据
- 创建SectionHeader结构体,可以读取和写入二进制数据
0.2.0
此次发布主要是为了传播更改,以保持二进制文件可使用。
- 添加机制以在本地更改时全局更新部分
- 为部分创建包装Table
结构体 - 为部分创建包装Array
结构体 - 将Segment结构体转换为包装结构体
- 创建一个超级更新列表及其应用时间
- 当表中的项目添加/删除时更新部分偏移量
- 当部分名称字符串表更改时更新部分名称索引
- 为Binary添加getter/setter方法
0.3.0
此次发布将着重于收集有关可执行代码的上下文,如果不是直接反汇编它。
- 添加计算页面地址页面大小的查找方法
- 为包含二进制数据的符号创建Function包装结构体
- 研究集成(或编写)用于聋人的反汇编crate
- 添加用于查询二进制目标平台的方 法
- 在文件头中使用
EI_OSABI
和e_machine
值 - 为lib用户提供指定二进制平台的方法
- 在文件头中使用
- 创建依赖于目标平台的平台解析上下文
- 为函数体添加基本的分块和迭代方法
未来
这是一些应该添加到库中,但目前尚未列入路线图的杂乱无章的事物集合。
-
使您能够在不显式调用反汇编方法、检查二进制目标等的情况下迭代函数中的指令。您应该能够像迭代符号一样轻松地迭代指令。
-
提供集成测试,以验证修改后的二进制文件仍然可使用。我不确定如何在不设置某种第三方ARM64系统仿真平台的情况下做到这一点。
(返回顶部)
贡献
任何人都可以为DEAF做出贡献,只需尽量遵循行为准则和贡献指南。如果某些内容不明确或未在指南中涵盖,请创建一个描述问题的issue,相关人员会尽快回复您。
(返回顶部)
联系方式
创建issue并@mjhouse以引起我的注意,或者通过[email protected]给我发邮件。
(返回顶部)