| Crates.io | memory_utils |
| lib.rs | memory_utils |
| version | 0.2.3 |
| created_at | 2025-05-26 17:45:30.108447+00 |
| updated_at | 2026-01-05 19:55:35.188522+00 |
| description | A memory reading/writing utility using Windows and mach API |
| homepage | https://github.com/penguin-cmyk/memory_utils |
| repository | https://github.com/penguin-cmyk/memory_utils |
| max_upload_size | |
| id | 1690093 |
| size | 285,927 |
A simple and safe(ish) Rust library for reading and writing memory of external Windows and macOS processes. Useful for building tools like trainers, debuggers, and analyzers.
Please note that this is project is in its early stages so bugs may occur.
To get the cargo crate check out this link
A simple project I made using this library is a walk speed modifier. You can find it here
0.1.2:
0.1.4:
0.1.6:
process.get_module and process.get_base_address,mbi.Protect == PAGE_READWRITE check from pattern_scan which should speed it up a bit.0.1.8:
ProtectOptions, Added process.get_protection0.1.9 & 0.1.10:
addr as LPVOID instead of addr as LCPVOID0.1.11:
process.get_threads() since it had TH32CS_SNAPPROCESS instead of TH32CS_SNAPTHREAD0.1.12:
process.get_thread_context() error due to invalid handling of the returned error (? -> is_err() )0.1.13:
process.find_pattern_str and process.pattern_scan by using the Boyer-Moore-Horspool algorithm in find_pattern0.1.14:
process.read_stack,process.pe_headers0.1.15:
process.sanitize_bytes public,process.get_modules,process.is_valid_address,process.allocate,process.trampoline_hookprocess.place_absolute_jmp0.1.17:
process.write_bytes0.1.18:
pid in Process publichandle to the Process struct (so that it doesn't open a new handle everytime. This is due to performance)0.1.19:
Process struct can now be safely shared between threadsclone for Process0.2.2:
process.read_bytesprocess.read_string by using process.read_bytes instead of going character-by-character0.2.3:
0.2.0
DllLib (memory_utils::dll), separate from the main processuse memory_utils::process::Process;
fn main() {
// Get the PID of the target process
let pid = Process::pid("RobloxPlayerBeta.exe").expect("Failed to find process");
// Create a new process handle
let process = Process::new(pid);
// Read an integer from an address
let value: i32 = process.read_memory(0x00ABCDEF).expect("Failed to read memory");
// Write a new value
process.write_memory(0x00ABCDEF, &1337).expect("Failed to write memory");
// Read a string (null-terminated)
let name = process.read_string(0x00FFEEDD).expect("Failed to read string");
println!("Read value: {}, Read string: {}", value, name);
}