A crate to read memory from another process. Code originally taken from the rbspy project. This crate has now returned home to the rbspy
GitHub organization. :)
Example
This example re-executes itself as a child process in order to have a separate process to use for demonstration purposes. If you need to read memory from a process that you are spawning, your usage should look very similar to this:
use std::convert::TryInto;
use std::env;
use std::io::{self, BufReader, BufRead, Read, Result};
use std::process::{Command, Stdio};
use read_process_memory::{
Pid,
ProcessHandle,
CopyAddress,
copy_address,
};
fn main() -> Result<()> {
if env::args_os().len() > 1 {
return in_child();
}
let mut child = Command::new(env::current_exe()?)
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.arg("child")
.spawn()?;
let handle: ProcessHandle = (&child).try_into().unwrap();
let mut stdout = BufReader::new(child.stdout.take().unwrap());
let mut addr_string = String::new();
stdout.read_line(&mut addr_string)?;
let address = usize::from_str_radix(addr_string.trim(), 16).unwrap();
let bytes = copy_address(address, 10, &handle)?;
println!("Read: {:?}", bytes);
drop(child.stdin.take());
child.wait()?;
Ok(())
}
fn in_child() -> Result<()> {
let readable_bytes: Vec<u8> = vec![
0xc0, 0x72, 0x80, 0x79, 0xeb, 0xf1, 0xbc, 0x87, 0x06, 0x14,
];
println!("{:x}", readable_bytes.as_ptr() as usize);
let mut buf = Vec::new();
drop(io::stdin().read_to_end(&mut buf));
Ok(())
}