MCPcopy Index your code
hub / github.com/CasualX/pelite

github.com/CasualX/pelite @v0.9.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.9.1 ↗ · + Follow
992 symbols 2,508 edges 100 files 275 documented · 28% updated 10mo ago★ 34112 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

PeLite

MIT License crates.io docs.rs Changelog Build status Build Status

Lightweight, memory-safe, zero-allocation library for reading and navigating PE binaries.

Design

The purpose of this library is inspecting PE binaries (whether on disk or already loaded in memory).

A trade-off was made to not unify the 32-bit (PE32) and 64-bit (PE32+) formats for two reasons:

  • There are small but incompatible differences, which would add overhead by requiring constant matching even if at source code level the match arms look identical.

  • Most of the time you know (at build time) what format you're working with anyway.

This makes it rather awkward to work with both formats together transparently.

Note that while the correct name is PE32+, the name PE64 is used as it is a valid identifier; they are otherwise synonymous.

Tools

Included are bins showing some uses for the library, try them out on the demos!

Library

This library is available on crates.io.

Documentation can be found on docs.rs.

In your Cargo.toml, put

[dependencies]
pelite = "0.8"

Examples

Try this example: cargo run --example readme.

use pelite::FileMap;
use pelite::pe64::{Pe, PeFile};

fn main() {
    // Load the desired file into memory
    let file_map = FileMap::open("demo/Demo64.dll").unwrap();
    // Process the image file
    dll_deps(file_map.as_ref()).unwrap();
}

fn dll_deps(image: &[u8]) -> pelite::Result<()> {
    // Interpret the bytes as a PE32+ executable
    let file = PeFile::from_bytes(image)?;

    // Let's read the DLL dependencies
    let imports = file.imports()?;
    for desc in imports {
        // Get the DLL name being imported from
        let dll_name = desc.dll_name()?;
        // Get the number of imports for this dll
        let iat = desc.iat()?;
        println!("imported {} functions from {}", iat.len(), dll_name);
    }

    Ok(())
}

License

Licensed under MIT License, see license.txt.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, shall be licensed as above, without any additional terms or conditions.

Extension points exported contracts — how you extend this code

Core symbols most depended-on inside this repo

Shape

Method 584
Function 211
Class 172
Enum 18
Interface 7

Languages

Rust96%
TypeScript4%

Modules by API surface

src/pe64/pe.rs65 symbols
src/resources/version_info.rs46 symbols
src/image.rs45 symbols
wasm/pelite.js43 symbols
src/wrap/pe.rs36 symbols
src/pe64/exports.rs36 symbols
src/resources/mod.rs35 symbols
src/wrap/exports.rs28 symbols
src/pe64/scanner.rs28 symbols
src/resources/find.rs24 symbols
src/wrap/debug.rs22 symbols
src/pe64/debug.rs22 symbols

For agents

$ claude mcp add pelite \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page