1 个不稳定版本
0.0.1 | 2024 年 5 月 22 日 |
---|
#26 在 #elf-file
39KB
585 行
HexSpell:可执行文件 Rust 解析器
描述
HexSpell 是一个使用 Rust 开发的开源库,旨在以最少的依赖关系解析和操作可执行文件 (.exe, .dll 等)。创建这个库的原因是为了深化我对可执行文件、它们的操作以及 Rust 的了解!
功能
- 低依赖:使用最少的外部库,便于集成和维护
- PE & ELF 解析:易于理解的 PE & ELF 文件结构
- 修改功能:帮助操作可执行文件的功能
安装
要将 HexSpell 包含到您的 Rust 项目中,使用 cargo 将其添加到依赖中
cargo add hexspell
或者只需将此行添加到您的 Cargo.toml
[dependencies]
hexspell = "0.1.x"
使用示例
一些使用示例
显示 PE 信息
显示 PE 文件的信息
use hexspell::pe::PE;
fn main() {
let file_name = "outt.exe";
let pe = PE::from_file(file_name).unwrap();
println!("┌───────────────────────────────┐");
println!("│ File {}\t\t\t│", file_name);
println!("│ File PE Checksum: 0x{:X}\t│", pe.header.checksum.value);
println!("│ Architecture: {}\t\t│", pe.header.architecture.value);
println!("│ PE type: {:?}\t\t\t│", pe.header.pe_type);
println!("│ Number of sections 0x{:X}\t│", pe.header.number_of_sections.value);
println!("│ Size of image: 0x{:X}\t\t│", pe.header.size_of_image.value);
println!("└───────────────────────────────┘");
}
修改 PE 文件的属性
使用 HexSpell 修改 PE 文件的入口点
use hexspell::pe::PE;
fn main() {
// Attempt to parse a PE from file
let mut pe = match PE::from_file("file.exe") {
Ok(file) => file,
Err(e) => {
eprintln!("Failed to parse PE file: {}", e);
return;
}
};
// Print old entry point
print!("Old entry point: {:X} | ", pe.header.entry_point.value);
// Update the entry point to a new value, on the same pe.buffer
pe.header.entry_point.update(&mut pe.buffer, 0x36D4u32);
// Print new entry point
print!("New entry point: {:X}", pe.header.entry_point.value);
// Try to write the modified PE file back to disk
if let Err(e) = pe.write_file("file_modified.exe") {
eprintln!("Failed to write modified PE file: {}", e);
}
}
创建新段并注入 shellcode
在具有自己头的段中添加代码
use hexspell::pe::PE;
const SHELLCODE: [u8; 284] = [../*msfvenom shellcode*/..]
fn main(){
// Open PE from file
let mut pe = PE::from_file("tests/samples/sample1.exe").expect("[!] Error opening PE file");
// Create new section header based on basic parameters
let new_section_header = pe.generate_section_header(
".shell", // Name for the new section
shellcode.len() as u32, // The size of the data it has to store
section::Characteristics::Code.to_u32() // Basic characteristics for a shellcode
+ section::Characteristics::Readable.to_u32()
+ section::Characteristics::Executable.to_u32(),
).expect("[!] Error generating new section header");
// Add new section header and payload into PE
pe.add_section(new_section_header, shellcode.to_vec()).expect("[!] Error adding new section into PE");
// Optional: Update entry point to execute our payload instead of the original code
pe.header.entry_point.update(&mut pe.buffer, pe.sections.last().unwrap().virtual_address.value);
// Write output to a new file
pe.write_file("tests/out/modified.exe").expect("[!] Error writing new PE to disk");
}
支持或联系
在使用 HexSpell 时遇到问题?请在 GitHub 上提交 问题。
许可证
HexSpell 在 MIT 许可证的条款下分发。有关详细信息,请参阅 LICENSE。