11个稳定版本
1.0.10 | 2024年1月20日 |
---|---|
1.0.9 | 2023年8月9日 |
1.0.8 | 2022年11月23日 |
1.0.6 | 2021年8月12日 |
1.0.0 | 2020年1月17日 |
#55 in 内存管理
每月301次下载
38KB
701 代码行
对进程虚拟内存内容的I/O访问
从/到当前进程和其他进程读取/写入数据。这可以用于进程监控、调试、测试、通信等。
示例
通过此库读取当前运行进程的堆栈
# fn main() -> Result<(), Box<dyn std::error::Error>> {
use process_vm_io::ProcessVirtualMemoryIO;
use std::io::Read;
// Perform I/O on this current process.
let process_id = std::process::id();
let address_of_pid = &process_id as *const _ as u64;
let mut process_io = unsafe { ProcessVirtualMemoryIO::new(process_id, address_of_pid) }?;
// Read the stack of this current thread.
let mut buffer = [0u8; std::mem::size_of::<u32>()];
process_io.read_exact(&mut buffer)?;
let also_pid = u32::from_ne_bytes(buffer);
assert_eq!(process_id, also_pid);
# Ok(())
# }
通过此库写入当前运行进程的堆
# fn main() -> Result<(), Box<dyn std::error::Error>> {
use process_vm_io::ProcessVirtualMemoryIO;
use std::io::{Seek, Write};
// Perform I/O on this current process.
let process_id = std::process::id();
let mut process_io = unsafe { ProcessVirtualMemoryIO::new(process_id, 0) }?;
// Some location on the heap that we will write to.
let mut pid_on_the_heap = Box::new(0_u32);
// Seek to that location and write the PID there.
process_io.seek(std::io::SeekFrom::Start(pid_on_the_heap.as_mut() as *mut _ as u64))?;
process_io.write(&process_id.to_ne_bytes())?;
assert_eq!(process_id, *pid_on_the_heap);
# Ok(())
# }
安全性
内存安全性
向进程的虚拟内存写入是潜在的不安全操作,因为它可能会在该进程中引入内存不安全,并可能导致该进程出现意外状态。如果目标进程是当前运行的进程,这会更加危险。
正在运行的进程
不建议对正在运行的进程执行I/O操作,因为其虚拟内存布局可能随时更改,或者进程可能会简单地终止并消失。在执行I/O之前,考虑暂停指定进程的所有线程。这通常可以通过SIGSTOP
和SIGCONT
POSIX信号来完成。
平台特定说明
目前仅支持Linux。
版本控制
本项目遵循语义版本控制。`CHANGELOG.md`文件详细说明了随时间的变化。
许可协议
版权所有(c)2020-2023 MicroDoc Software GmbH。
请参阅此分发顶层目录中的`LICENSE.txt`文件。
根据MIT许可协议授权。此文件可能不得根据这些条款进行复制、修改或分发。
依赖关系
~2.5–3.5MB
~74K SLoC