#memory #executable #unix #windows

no-std vonneumann

适用于Windows和Unix的可执行内存

3个稳定版本

1.0.2 2024年1月29日
1.0.1 2024年1月27日

#101 in 内存管理

MIT许可协议

14KB
196

冯·诺伊曼

适用于Windows和Unix的可执行内存("冯·诺伊曼架构")

示例

use vonneumann::ExecutableMemory;

fn main() {
    let mut memory = ExecutableMemory::new(6);

    // https://www.felixcloutier.com/x86/
    memory[0] = 0xb8;
    memory[1] = 0xff;
    memory[2] = 0xff;
    memory[3] = 0xff;
    memory[4] = 0xff;
    memory[5] = 0xc3;

    let f: fn() -> u32 = unsafe {
        std::mem::transmute((&memory[0..6]).as_ptr())
    };

    assert_eq!(f(), 4294967295);
}

与其他可执行内存crate的比较

jit-allocator

此crate将页面映射为RWX。这有点不安全,并使得提升安全漏洞更容易。 jit-allocator 将页面“双映射”为RX和RW,避免了这个问题。

此crate始终分配完整页面,这在小分配时不高效,并且如果你频繁分配则较慢。 jit-allocator 可以返回字节级别的分配。

当启用--features nightly时,此crate支持Allocator API。因此,它可以与Vec一起使用,并且使用它需要更少的unsafe(基本上就是将数据转换为函数指针的transmute)。由于使用了双映射,jit-allocator 本身无法做到这一点。

memfd-exec

memfd-exec 完全具有不同的用途:它执行整个进程。这个crate用于执行共享你的进程状态的单独函数。

"just handrolling it with mmap lol"

此crate在drop时会自动取消映射内存,并支持Windows以及Unix。与 memmap2 不同,您可以同时使内存可执行和可写:ferrisClueless

常见问题解答

有人真正在使用这个吗?

是的! https://github.com/chellipse/bf-jit

这个在macOS上工作吗?

是的!

即使在运行时加固的情况下?

不?手册页实际上说“MAP_JIT区域永远不会同时可写和可执行” lol

如果有人想要这个,我可以想象一个API,它会强制你分别调用 make_mutmake_exec。我不会做双映射。不。

这个在aarch64上工作吗?

可能但还没测试 🤪

我可以在生产中使用这个吗?

lol请使用它吧,我想看着你的代码烧毁

作为提醒,软件是“按原样”提供的,不提供任何形式的保证,无论是明示的还是暗示的

依赖关系

~215KB