#pe #executable #elf #parser #binary #elf-file

hexspell

一个用于解析可执行文件的 Rust 库

1 个不稳定版本

0.0.1 2024 年 5 月 22 日

#26#elf-file

MIT 许可证

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

无运行时依赖