3 个版本 (破坏性更新)
0.8.0 | 2024年6月26日 |
---|---|
0.7.0 | 2024年5月27日 |
0.6.0 | 2024年5月8日 |
#524 在 解析实现
285KB
5.5K SLoC
RUSTBIN
这是一个学习项目,用于了解 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