3个稳定版本
1.0.2 | 2024年1月29日 |
---|---|
1.0.1 | 2024年1月27日 |
#101 in 内存管理
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_mut
和 make_exec
。我不会做双映射。不。
这个在aarch64上工作吗?
可能但还没测试 🤪
我可以在生产中使用这个吗?
lol请使用它吧,我想看着你的代码烧毁
作为提醒,软件是“按原样”提供的,不提供任何形式的保证,无论是明示的还是暗示的
依赖关系
~215KB