2 releases

new 0.1.4 Oct 31, 2024
0.1.3 Oct 23, 2024
0.1.2 Oct 23, 2024
0.1.1 Oct 23, 2024
0.1.0 Oct 23, 2024

#326 in Data structures

Download history 308/week @ 2024-10-21 153/week @ 2024-10-28

461 downloads per month

Unlicense

72KB
1K SLoC

https://crates.io/crates/decomp https://docs.rs/decomp/ https://unlicense.org

Components of a decompilation pipeline.

This library is a Rust reimplementation of The decomp project.

The original decomp project is licensed under The Unlicense. In an effort to keep this resource accessible, this library is also licensed under The Unlicense.

Getting Started:

Add decomp as a dependency to your Cargo.toml. Make sure to replace the version and llvm version with valid versions.

[dependencies]
decomp = { version = "X.X.X", features = [ "llvm-X" ] }

Load an LLVM Module:

use decomp::prelude::*;
// From a textual LLVM IR file.
let module = Module::from_ir_path("/path/to/file.ll").unwrap();
// From a bitcode LLVM IR file.
let module = Module::from_bc_path("/path/to/file.bc").unwrap();

Generate a Control Flow Graph:

See cfg.

use decomp::prelude::*;
for function in &module.functions {
    let cfg = ControlFlowGraph::new(function);
    println!("{}", cfg);
}

Analyse the Control Flow Graph:

See cfa.

use decomp::prelude::*;
for function in &module.functions {
    let cfg   = ControlFlowGraph::new(function);
    let prims = CFAPrim::find_all(cfg).unwrap();
    println!("{}", prims);
}

Recover Control Flow Groups:

See cfr.

use decomp::prelude::*;
for function in &module.functions {
    let cfg    = ControlFlowGraph::new(function);
    let prims  = CFAPrim::find_all(cfg).unwrap();
    let groups = CFRGroups::new(&prims).unwrap();
    println!("{}", groups);
}

Dependencies

~1MB
~14K SLoC