6个版本 (3个破坏性更新)
0.6.61 | 2024年7月3日 |
---|---|
0.6.6 | 2024年7月3日 |
0.5.6 | 2024年7月3日 |
0.5.0 | 2023年5月29日 |
0.3.2 | 2023年5月29日 |
#7 in #read-memory
每月320次下载
11KB
150 行
Windows内存访问Crate
对于一些人来说,与Windows官方API Crate一起工作可能会有些令人不知所措,这个Lib就是为了使读取和写入内存更容易而创建的。
您可以简单地将进程PID传递进去,然后使用u32偏移量从内存中读取。有各种各样的函数可供选择,您想读取u32、u16甚至utf16字符串,这些都有,写入内存位置同样如此。
免责声明:此lib使用了不安全的内存操作函数,我不是专家,使用风险自负。请确保您知道自己在做什么,因为手动操作内存可能会产生不可预测的结果。读取和写入内存还需要管理员权限,您才能读取或写入内存。
示例
读取
需要带有读写权限的句柄,可以使用Handle构造函数之一构建,例如 Handle::read_only
或 Handle::full_access
。
use windows_memory_access::Handle;
fn main() {
let pid: u32 = 50;
let handle = Handle::read_only(pid).unwrap();
let address_offset = 2050;
let base = handle.read_u32(address_offset).unwrap() + 24;
let base_offset = handle.read_u32(base).unwrap() + 48;
let desired_value = handle.read_u8(base_offset).unwrap();
handle.close().unwrap();
println!("{desired_value}");
}
写入
需要带有写入权限或全部访问权限的句柄,可以使用Handle构造函数 Handle::full_access
。
use windows_memory_access::Handle;
fn main() {
let pid: u32 = 2020;
let handle: Handle = Handle::full_access(pid).unwrap();
let address_offset = 5050;
let desired_value: u32 = 202;
handle.write_u32(address_offset, desired_value).unwrap();
handle.close().unwrap();
println!("{desired_value}");
}
版本:0.5更新 回滚到返回结果,因为只有在读取内存和写入内存时才会出现错误,这不会影响返回结果,在最坏的情况下,返回的结果始终是0,因为我们初始化了一个0值的字节数组,然后在Windows API函数内部修改它,如果没有变化,数组将保持不变,因此返回0。
版本:0.6.0更新 以清理API,让Handle结构处理所有关于写入和读取的操作,而无需依赖于windows crate手动操作。我们大量使用结果来指示读取和写入失败。
依赖关系
~129MB
~2M SLoC