1个不稳定版本

0.1.2 2023年9月4日

#2338解析器实现

GPL-3.0-only

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

Tests Docs GPL v3


DEAF

Rust库,用于解析和修改ELF二进制文件
贡献 · 行为准则 · 报告错误 · 请求功能

目录
  1. 简介
  2. 入门
  3. 路线图
  4. 贡献
  5. 联系方式

简介

这是一个用于解析和修改ELF格式二进制文件的库。有其他库如 elfelfyelfkit 用于解析格式,但它们要么无法修改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_OSABIe_machine
    • 为lib用户提供指定二进制平台的方法
  • 创建依赖于目标平台的平台解析上下文
  • 为函数体添加基本的分块和迭代方法

未来

这是一些应该添加到库中,但目前尚未列入路线图的杂乱无章的事物集合。

  • 使您能够在不显式调用反汇编方法、检查二进制目标等的情况下迭代函数中的指令。您应该能够像迭代符号一样轻松地迭代指令。

  • 提供集成测试,以验证修改后的二进制文件仍然可使用。我不确定如何在不设置某种第三方ARM64系统仿真平台的情况下做到这一点。

(返回顶部)

贡献

任何人都可以为DEAF做出贡献,只需尽量遵循行为准则贡献指南。如果某些内容不明确或未在指南中涵盖,请创建一个描述问题的issue,相关人员会尽快回复您。

(返回顶部)

联系方式

创建issue并@mjhouse以引起我的注意,或者通过[email protected]给我发邮件。

(返回顶部)

依赖