#dll #loader #load #pe #shared #api-bindings #file-format

reflective_pe_dll_loader

Reflective PECOFF DLL 加载器。从内存中加载 DLL 以执行。

3 个版本

0.1.2 2024 年 4 月 11 日
0.1.1 2024 年 4 月 6 日
0.1.0 2024 年 4 月 5 日

#1010 in 解析器实现

Download history 11/week @ 2024-05-19 1/week @ 2024-05-26

131 每月下载量

MIT/Apache

150KB
560 代码行

包含 (Windows DLL, 120KB) test-dlls/hello_world_lib.dll

Reflective PE COFF DLL 加载器

Crates.io Downloads Documentation License Dependency Status

加载器是一种程序,它将可执行代码(例如,在 ELF、PE COFF 或 Mach-O 格式下)加载到内存中以便执行。

反射加载器就是这样一种加载器,它从内存缓冲区加载可执行代码,而不是从磁盘上的文件加载。

use reflective_pe_dll_loader::{PeDll, Symbol};

let bytes: &[u8] = include_bytes!("../test-dlls/hello_world_lib.dll");
let pe_dll = PeDll::new(&bytes).unwrap();

let add: Symbol<extern "C" fn(i32, i32) -> i32> = {
    let symbol = pe_dll.get_symbol_by_name("add").unwrap();
    unsafe { symbol.assume_type() }
};

assert_eq!(add(1, 2), 3);

建议

此 crate 有有限的使用场景。如果您可以避免构建嵌入到可执行文件中的动态库,而是创建一个对象文件,将其与可执行文件静态链接,则应这样做。

致谢

它主要基于来自 https://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ 的代码。

注意:教程不完整,例如,不涵盖 TLS 回调。这可能是某些 DLL 的问题,但可能在将来得到解决。

依赖项

~1.2–1.9MB
~35K SLoC