2 个版本

0.15.1 2024年7月23日
0.15.0 2024年7月21日
0.0.2 2024年4月28日
0.0.1 2022年7月3日

#254解析器实现

Download history 122/week @ 2024-04-28 2/week @ 2024-05-05 5/week @ 2024-05-19 267/week @ 2024-07-21 39/week @ 2024-07-28 25/week @ 2024-08-04

每月331次下载

Apache-2.0

560KB
14K SLoC

LIEF Rust 绑定

这是 LIEF 的官方 Rust 绑定。

LIEF Architecture

入门

[dependencies]
lief = "0.15.1"

绑定需要 Rust 版本 2021 和 rustc >= 1.74.0

use lief;

if let Some(lief::Binary::ELF(elf)) = lief::Binary::from(&mut file) {
    println!("Dependencies:");
    for entry in elf.dynamic_entries() {
        if let dynamic::Entries::Library(lib) = entry {
            println!("  - {}", lib.name());
        }
    }
    println!("Versions:");
    for version in elf.symbols_version_requirement() {
        println!("  From {}", version.name());
        for aux in version.auxiliary_symbols() {
            println!("    - {}", aux.name());
        }
    }
}

lib.rs:

LIEF

LIEF Design

此软件包提供了对 LIEF 的 Rust 绑定。它暴露了 LIEF API 的大部分功能,用于 读取 这些格式

  • ELF
  • PE
  • Mach-O

绑定需要至少 Rust 版本 1.74.0,2021 版本及支持

  • Windows x86-64(支持 /MT/MD 链接)
  • Linux x86-64/aarch64(Ubuntu 20.04,Almalinux 9,Debian 11.5,Fedora 29)
  • macOS(x86-64aarch64 至少 OS X Big Sur:11.0)
  • iOS(aarch64

入门

[package]
name    = "my-awesome-project"
version = "0.0.1"
edition = "2021"

[dependencies]
# For nightly
lief = { git = "https://github.com/lief-project/LIEF", branch = "main" }
# For releases
lief = 0.15.0
fn main() {
   let path = std::env::args().last().unwrap();
   let mut file = std::fs::File::open(path).expect("Can't open the file");
   match lief::Binary::from(&mut file) {
       Some(lief::Binary::ELF(elf)) => {
           // Process ELF file
       },
       Some(lief::Binary::PE(pe)) => {
           // Process PE file
       },
       Some(lief::Binary::MachO(macho)) => {
           // Process Mach-O file (including FatMachO)
       },
       None => {
           // Parsing error
       }
   }
   return;
}

注意,generic 模块实现了不同可执行格式结构(符号、重定位等)之间共享的不同特性

依赖

~3–8MB
~150K SLoC