#load #memory #reflective #byte #linux #anonymous #libload

libload_reflective

A package to reflectively load libraries from memory

4 releases

new 0.1.12 Dec 19, 2024
0.1.11 Nov 4, 2024
0.1.1 Nov 4, 2024
0.1.0 Nov 4, 2024

#361 in Memory management

23 downloads per month

MIT/Apache

36KB
810 lines

Libload Reflective

maintenance-status Crates.io Version

This crate allows loading dynamic libraries into memory from bytes, rather than from disk. A lot of this code was taken from the libloading crate, because I thought their implementation of Symbol<T> was already done and it didn't need a lot of modifications for it to work with in-memory libraries. For Windows it uses Reflective DLL loading, and for Linux it uses anonymous file-descriptors to load the library into memory. I am by no means expecting people to use this, since it's still messy, and I want to clean and reformat the code to be prettier. Feel free to open issues or PRs to make it better.

I only tested this on Windows 11 and Ubuntu 22.04, so be advised.

Why?

I wanted to implement a custom "plugin" system for the C2 framework (payload and server) that I'm working on, and I couldn't find something that fit my needs, so I decided to implement my own system for this.

Example usage

type AddFn = fn(usize, usize) -> usize;

fn main() -> Result<(), ReflectError> {
    let data = vec![/*Library bytes*/]
    let lib = ReflectedLibrary::new(data)?;
    let add: Symbol<AddFn> = lib.get(b"add")?;
    let result = add(1,2);
    println!("Result: {res}");
}

References

Dependencies

~127MB
~2M SLoC