| Crates.io | pe-assembler |
| lib.rs | pe-assembler |
| version | 0.0.3 |
| created_at | 2025-10-15 09:03:30.776356+00 |
| updated_at | 2025-10-16 10:18:57.549085+00 |
| description | 支持 x64 和 x86 指令集的现代 PE 汇编器 - 强类型、面向对象、零依赖核心 |
| homepage | https://github.com/nyar-vm/project-gaia |
| repository | https://github.com/nyar-vm/project-gaia |
| max_upload_size | |
| id | 1883966 |
| size | 261,089 |
一个用 Rust 编写的综合 PE(可移植可执行文件)分析器,可以分析 Windows DLL 文件和可执行文件。 该工具提供有关 PE 文件结构、节区、导入、导出和调试信息的详细信息。
在您的 Cargo.toml 中添加此库:
[dependencies]
pe-rust = { path = "../pe-rust" }
use pe_assembler::reader::{PeReader, PeView};
use pe_assembler::types::ReadConfig;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 配置 PE 读取器
let config = ReadConfig {
include_sections: true,
validate_checksum: false,
parse_imports: true,
parse_exports: true,
};
// 创建 PE 读取器
let reader = PeReader::with_config(config);
// 演示 PE 读取器的配置
println!("PE 读取器已配置");
println!("包含节区: {}", config.include_sections);
println!("验证校验和: {}", config.validate_checksum);
println!("解析导入: {}", config.parse_imports);
println!("解析导出: {}", config.parse_exports);
Ok(())
}
use pe_assembler::reader::PeReader;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建 PE 读取器
let reader = PeReader::new();
// 演示 PE 读取器的使用
println!("PE 读取器已创建");
println!("可以使用 reader.view_file() 或 reader.read_file() 来处理 PE 文件");
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建示例 PE 数据
let pe_data = vec![0u8; 1024]; // 示例数据
// 模拟写入操作
println!("创建的 PE 数据长度: {}", pe_data.len());
Ok(())
}
reader 模块提供了解析 PE 文件的函数:
read(data: &[u8]) -> Result<PeInfo, PeError>: 解析 PE 文件数据read_file(path: &str) -> Result<PeInfo, PeError>: 读取并解析 PE 文件writer 模块提供了生成 PE 文件的函数:
write(pe_info: &PeInfo) -> Result<Vec<u8>, PeError>: 生成 PE 文件数据write_file(path: &str, pe_info: &PeInfo) -> Result<(), PeError>: 将 PE 文件写入磁盘主要数据结构包括:
PeInfo: 完整的 PE 文件表示DosHeader: DOS 头结构NtHeaders: NT 头结构CoffHeader: COFF 头结构OptionalHeader: 可选头结构SectionHeader: 节区头结构PeError: PE 操作错误类型cargo build
cargo test
cargo doc --open
cargo fmt
cargo clippy
该库设计用于:
查看 examples 目录获取更详细的使用示例:
read_pe.rs: 演示读取和显示 PE 文件信息write_pe.rs: 显示如何创建简单的 PE 文件modify_pe.rs: 修改现有 PE 文件的示例详见根目录的 License.md。
欢迎贡献!请随时提交拉取请求。
为提升在不同加载器/环境下的兼容性,写入导入表时采用“兼容模式”策略:
OriginalFirstThunk(INT)指向名称指针数组,FirstThunk(IAT)初始填入对应 IMAGE_IMPORT_BY_NAME 的 RVA(指向 Hint+Name)。加载器解析后会将 IAT 条目覆盖为实际函数地址。OriginalFirstThunk 设为 0,FirstThunk(IAT)初始填入 IMAGE_IMPORT_BY_NAME 的 RVA。实现位置与说明:
helpers/pe_writer/mod.rs::write_import_table,根据 pointer_size 在 x64 下为 IAT 写入名称 RVA;x86 维持既有行为。helpers/builder/mod.rs 中明确注释了该“兼容模式”,同时可选头会填写 Import Directory(索引 1)与 IAT Directory(索引 12),便于加载器识别范围。tests/runnable/exit_code.rs 提供最小调用示例;新增的 x64-only 导入表测试断言 IAT 非零且指向有效 IMAGE_IMPORT_BY_NAME。注意事项:
DllCharacteristics 的 DYNAMIC_BASE 位以禁用 ASLR,配合基于 RVA 的修补与 RIP 相对位移计算,确保加载稳定。