You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
memflow-pcileech/memflow-pcileech/examples/read_phys.rs

61 lines
1.7 KiB
Rust

/*!
This example shows how to use the pcileech connector to read physical_memory
from a target machine. It also evaluates the number of read cycles per second
and prints them to stdout.
*/
use std::env::args;
use std::time::Instant;
use log::{info, Level};
use memflow::prelude::v1::*;
fn main() {
simplelog::TermLogger::init(
Level::Debug.to_level_filter(),
simplelog::Config::default(),
simplelog::TerminalMode::Stdout,
simplelog::ColorChoice::Auto,
)
.unwrap();
let connector_args = if let Some(arg) = args().nth(1) {
arg.parse()
} else {
"device=FPGA".parse()
}
.expect("unable to parse command line arguments");
let mut connector = memflow_pcileech::create_connector(&connector_args)
.expect("unable to create pcileech connector");
let metadata = connector.metadata();
info!("Received metadata: {:?}", metadata);
let mut mem = vec![0; 8];
connector
.phys_view()
.read_raw_into(Address::from(0x1000), &mut mem)
.expect("unable to read physical memory");
info!("Received memory: {:?}", mem);
let start = Instant::now();
let mut counter = 0;
loop {
let mut buf = vec![0; 0x1000];
connector
.phys_view()
.read_raw_into(Address::from(0x1000), &mut buf)
.expect("unable to read physical memory");
counter += 1;
if (counter % 10000000) == 0 {
let elapsed = start.elapsed().as_millis() as f64;
if elapsed > 0.0 {
info!("{} reads/sec", (f64::from(counter)) / elapsed * 1000.0);
info!("{} ms/read", elapsed / (f64::from(counter)));
}
}
}
}