#pe #parser #windows #binary-parser #file-format #file-header #file-offset

bin+lib rustbin

二进制文件格式解析器(大部分与Windows相关)

3 个版本 (破坏性更新)

0.8.0 2024年6月26日
0.7.0 2024年5月27日
0.6.0 2024年5月8日

#524解析实现

MIT 许可证

285KB
5.5K SLoC

RUSTBIN

Build Status

这是一个学习项目,用于了解 Rust 语言并创建相对复杂的文件解析器。


结构

Rustbin 是作为一个库创建的,将添加更多文件解析器。

每个属于头部的值都被包装在 HeaderField 结构体中。 HeaderField 结构体提供 3 个值

  • value: 从文件中读取的字段值
  • offset: 值在文件中的偏移量。结构体具有与其第一个成员相同的偏移量
  • rva: 相对虚拟地址
    • 仅适用于 PE 文件格式
    • 在不适用的情况下应与偏移量相同

目前支持

PE(进行中)

使用方法

注意:此示例仅适用于在 Windows 操作系统上构建。

extern crate rustbin;
extern crate serde_json;

use std::{env, fs::OpenOptions, io::BufReader, path::Path};

use rustbin::{pe::{PeImage, ser::min::MinPeImage}, types::Header};

fn main() {
  //Create PathBuf for self (on Windows only).
  let args:Vec<String> = env::args().collect();
  let exe_name = args.get(0).unwrap();
  let binpath = Path::new(&exe_name);

  //Open file handle in read mode.
  let Ok(f) = OpenOptions::new()
    .read(true)
    .open(binpath)
  else {
    panic!("Failed to open file in read mode.");
  };
  
  //Parse the file from offset 0.
  let Ok(parsed) = parse_file(f, ParseAs::PE) else {
    panic!("Failed to parse as `PE`.");
  };

  let ParsedAs::PE(pe_image) = parsed;

  //Convert parsed image to a minimal set of `serde::Serialize`able values without metadata.
  let min_pe = MinPeImage::from(&pe_image);

  //Serialize minimal pe image to indented json.
  let json_str = serde_json::to_string_pretty(&min_pe).unwrap();

  println!("{}", json_str);
}

解析

  • DOS 头部
  • 文件头部
  • 可选头部 x64
  • 可选头部 x86
  • 数据目录
  • 节头部
  • 导入
  • 导出
  • 重定位
  • 资源

序列化(最小格式)

  • DOS 头部
  • 文件头部
  • 可选头部 x64
  • 可选头部 x86
  • 数据目录
  • 节头部
  • 导入
  • 导出
  • 重定位
  • 资源

依赖

~2.4–3.5MB
~63K SLoC