#read-write #read-memory #memory #read #write #memory-access #windows

windows_memory_access

使用Microsoft发布的Windows Crate API,通过Windows内存访问库来实现对Windows内存的读写。使用已配置的函数读取和写入内存,这些函数需要最少的参数即可开始。此crate的创建目的是使内存的读取和写入变得简单。

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

Download history 1/week @ 2024-04-17 28/week @ 2024-04-24 319/week @ 2024-07-03 1/week @ 2024-07-10

每月320次下载

MIT/Apache

11KB
150

Windows内存访问Crate

对于一些人来说,与Windows官方API Crate一起工作可能会有些令人不知所措,这个Lib就是为了使读取和写入内存更容易而创建的。

您可以简单地将进程PID传递进去,然后使用u32偏移量从内存中读取。有各种各样的函数可供选择,您想读取u32、u16甚至utf16字符串,这些都有,写入内存位置同样如此。

免责声明:此lib使用了不安全的内存操作函数,我不是专家,使用风险自负。请确保您知道自己在做什么,因为手动操作内存可能会产生不可预测的结果。读取和写入内存还需要管理员权限,您才能读取或写入内存。

示例

读取

需要带有读写权限的句柄,可以使用Handle构造函数之一构建,例如 Handle::read_onlyHandle::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