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.
61 lines
1.7 KiB
Rust
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)));
|
|
}
|
|
}
|
|
}
|
|
}
|