Process

Struct Process 

Source
pub struct Process<'a> { /* private fields */ }

Implementations§

Source§

impl<'a> Process<'a>

Source

pub fn pid(&self) -> u32

Source

pub fn info(&self) -> Result<ProcessInfo, DmaError>

Examples found in repository?
examples/process_memory.rs (line 7)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5
6    let process = dma.attach("explorer.exe")?;
7    let info = process.info()?;
8
9    println!("Attached to {} (PID: {})", info.name, info.pid);
10    println!("Path: {}\n", info.path);
11
12    let modules = process.list_modules()?;
13    println!("Loaded modules: {}", modules.len());
14
15    for module in modules.iter().take(5) {
16        println!("  {} @ 0x{:X} (size: 0x{:X})",
17            module.name, module.base, module.size);
18    }
19
20    if let Some(kernel32) = modules.iter().find(|m| m.name.eq_ignore_ascii_case("kernel32.dll")) {
21        println!("\nkernel32.dll base: 0x{:X}", kernel32.base);
22
23        let bytes = process.read_bytes(kernel32.base, 64)?;
24        println!("First 64 bytes:");
25        for (i, chunk) in bytes.chunks(16).enumerate() {
26            print!("  {:04X}: ", i * 16);
27            for byte in chunk {
28                print!("{:02X} ", byte);
29            }
30            println!();
31        }
32    }
33
34    Ok(())
35}
Source

pub fn read<T: Copy>(&self, address: u64) -> Result<T, DmaError>

Examples found in repository?
examples/scatter_read.rs (line 18)
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5    let dma = Dma::new("fpga://algo=0")?;
6    let process = dma.attach("explorer.exe")?;
7
8    let modules = process.list_modules()?;
9    let kernel32 = modules.iter()
10        .find(|m| m.name.eq_ignore_ascii_case("kernel32.dll"))
11        .ok_or("kernel32.dll not found")?;
12
13    let base = kernel32.base;
14    let num_reads = 1000;
15
16    let start = Instant::now();
17    for i in 0..num_reads {
18        let _: u32 = process.read(base + i * 0x1000)?;
19    }
20    let normal_time = start.elapsed();
21
22    let start = Instant::now();
23    let mut scatter = process.scatter()?;
24
25    for i in 0..num_reads {
26        scatter.prepare_read(base + i * 0x1000, 4);
27    }
28
29    scatter.execute()?;
30
31    for i in 0..num_reads {
32        let _: u32 = scatter.read_as(base + i * 0x1000)?;
33    }
34    let scatter_time = start.elapsed();
35
36    println!("Normal reads ({} iterations): {:?}", num_reads, normal_time);
37    println!("Scatter reads ({} iterations): {:?}", num_reads, scatter_time);
38    println!("Speedup: {:.2}x", normal_time.as_secs_f64() / scatter_time.as_secs_f64());
39
40    Ok(())
41}
More examples
Hide additional examples
examples/read_write.rs (line 13)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5    let process = dma.attach("explorer.exe")?;
6
7    let modules = process.list_modules()?;
8    let module = modules.first()
9        .ok_or("No modules found")?;
10
11    println!("Reading from {} @ 0x{:X}", module.name, module.base);
12
13    let value_u32: u32 = process.read(module.base)?;
14    println!("u32 value: 0x{:08X}", value_u32);
15
16    let value_u64: u64 = process.read(module.base)?;
17    println!("u64 value: 0x{:016X}", value_u64);
18
19    let bytes = process.read_bytes(module.base, 16)?;
20    print!("Bytes: ");
21    for byte in &bytes {
22        print!("{:02X} ", byte);
23    }
24    println!();
25
26    #[repr(C)]
27    #[derive(Copy, Clone, Debug)]
28    struct DosHeader {
29        e_magic: u16,
30        e_cblp: u16,
31        e_cp: u16,
32        e_crlc: u16,
33    }
34
35    let dos_header: DosHeader = process.read(module.base)?;
36    println!("\nDOS Header:");
37    println!("  Magic: 0x{:04X} ({}{})",
38        dos_header.e_magic,
39        (dos_header.e_magic as u8) as char,
40        (dos_header.e_magic >> 8) as u8 as char
41    );
42
43    Ok(())
44}
Source

pub fn read_bytes(&self, address: u64, size: usize) -> Result<Vec<u8>, DmaError>

Examples found in repository?
examples/process_memory.rs (line 23)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5
6    let process = dma.attach("explorer.exe")?;
7    let info = process.info()?;
8
9    println!("Attached to {} (PID: {})", info.name, info.pid);
10    println!("Path: {}\n", info.path);
11
12    let modules = process.list_modules()?;
13    println!("Loaded modules: {}", modules.len());
14
15    for module in modules.iter().take(5) {
16        println!("  {} @ 0x{:X} (size: 0x{:X})",
17            module.name, module.base, module.size);
18    }
19
20    if let Some(kernel32) = modules.iter().find(|m| m.name.eq_ignore_ascii_case("kernel32.dll")) {
21        println!("\nkernel32.dll base: 0x{:X}", kernel32.base);
22
23        let bytes = process.read_bytes(kernel32.base, 64)?;
24        println!("First 64 bytes:");
25        for (i, chunk) in bytes.chunks(16).enumerate() {
26            print!("  {:04X}: ", i * 16);
27            for byte in chunk {
28                print!("{:02X} ", byte);
29            }
30            println!();
31        }
32    }
33
34    Ok(())
35}
More examples
Hide additional examples
examples/read_write.rs (line 19)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5    let process = dma.attach("explorer.exe")?;
6
7    let modules = process.list_modules()?;
8    let module = modules.first()
9        .ok_or("No modules found")?;
10
11    println!("Reading from {} @ 0x{:X}", module.name, module.base);
12
13    let value_u32: u32 = process.read(module.base)?;
14    println!("u32 value: 0x{:08X}", value_u32);
15
16    let value_u64: u64 = process.read(module.base)?;
17    println!("u64 value: 0x{:016X}", value_u64);
18
19    let bytes = process.read_bytes(module.base, 16)?;
20    print!("Bytes: ");
21    for byte in &bytes {
22        print!("{:02X} ", byte);
23    }
24    println!();
25
26    #[repr(C)]
27    #[derive(Copy, Clone, Debug)]
28    struct DosHeader {
29        e_magic: u16,
30        e_cblp: u16,
31        e_cp: u16,
32        e_crlc: u16,
33    }
34
35    let dos_header: DosHeader = process.read(module.base)?;
36    println!("\nDOS Header:");
37    println!("  Magic: 0x{:04X} ({}{})",
38        dos_header.e_magic,
39        (dos_header.e_magic as u8) as char,
40        (dos_header.e_magic >> 8) as u8 as char
41    );
42
43    Ok(())
44}
Source

pub fn write<T: Copy>(&self, address: u64, value: &T) -> Result<(), DmaError>

Source

pub fn write_bytes(&self, address: u64, data: &[u8]) -> Result<(), DmaError>

Source

pub fn scatter(&'a self) -> Result<ScatterHandle<'a>, DmaError>

Examples found in repository?
examples/scatter_read.rs (line 23)
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5    let dma = Dma::new("fpga://algo=0")?;
6    let process = dma.attach("explorer.exe")?;
7
8    let modules = process.list_modules()?;
9    let kernel32 = modules.iter()
10        .find(|m| m.name.eq_ignore_ascii_case("kernel32.dll"))
11        .ok_or("kernel32.dll not found")?;
12
13    let base = kernel32.base;
14    let num_reads = 1000;
15
16    let start = Instant::now();
17    for i in 0..num_reads {
18        let _: u32 = process.read(base + i * 0x1000)?;
19    }
20    let normal_time = start.elapsed();
21
22    let start = Instant::now();
23    let mut scatter = process.scatter()?;
24
25    for i in 0..num_reads {
26        scatter.prepare_read(base + i * 0x1000, 4);
27    }
28
29    scatter.execute()?;
30
31    for i in 0..num_reads {
32        let _: u32 = scatter.read_as(base + i * 0x1000)?;
33    }
34    let scatter_time = start.elapsed();
35
36    println!("Normal reads ({} iterations): {:?}", num_reads, normal_time);
37    println!("Scatter reads ({} iterations): {:?}", num_reads, scatter_time);
38    println!("Speedup: {:.2}x", normal_time.as_secs_f64() / scatter_time.as_secs_f64());
39
40    Ok(())
41}
Source

pub fn module_base(&self, module_name: &str) -> Result<u64, DmaError>

Examples found in repository?
examples/module_functions.rs (line 7)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5    let process = dma.attach("explorer.exe")?;
6
7    let kernel32_base = process.module_base("kernel32.dll")?;
8    println!("kernel32.dll base: 0x{:X}", kernel32_base);
9
10    let functions = [
11        "CreateFileW",
12        "ReadFile",
13        "WriteFile",
14        "GetProcAddress",
15        "LoadLibraryW",
16    ];
17
18    for func_name in &functions {
19        match process.proc_address("kernel32.dll", func_name) {
20            Ok(addr) => {
21                let offset = addr - kernel32_base;
22                println!("{}+0x{:X} = 0x{:X}", func_name, offset, addr);
23            }
24            Err(e) => println!("Failed to find {}: {}", func_name, e),
25        }
26    }
27
28    Ok(())
29}
Source

pub fn proc_address( &self, module_name: &str, function_name: &str, ) -> Result<u64, DmaError>

Examples found in repository?
examples/module_functions.rs (line 19)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5    let process = dma.attach("explorer.exe")?;
6
7    let kernel32_base = process.module_base("kernel32.dll")?;
8    println!("kernel32.dll base: 0x{:X}", kernel32_base);
9
10    let functions = [
11        "CreateFileW",
12        "ReadFile",
13        "WriteFile",
14        "GetProcAddress",
15        "LoadLibraryW",
16    ];
17
18    for func_name in &functions {
19        match process.proc_address("kernel32.dll", func_name) {
20            Ok(addr) => {
21                let offset = addr - kernel32_base;
22                println!("{}+0x{:X} = 0x{:X}", func_name, offset, addr);
23            }
24            Err(e) => println!("Failed to find {}: {}", func_name, e),
25        }
26    }
27
28    Ok(())
29}
Source

pub fn list_modules(&self) -> Result<Vec<Module>, DmaError>

Examples found in repository?
examples/process_memory.rs (line 12)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5
6    let process = dma.attach("explorer.exe")?;
7    let info = process.info()?;
8
9    println!("Attached to {} (PID: {})", info.name, info.pid);
10    println!("Path: {}\n", info.path);
11
12    let modules = process.list_modules()?;
13    println!("Loaded modules: {}", modules.len());
14
15    for module in modules.iter().take(5) {
16        println!("  {} @ 0x{:X} (size: 0x{:X})",
17            module.name, module.base, module.size);
18    }
19
20    if let Some(kernel32) = modules.iter().find(|m| m.name.eq_ignore_ascii_case("kernel32.dll")) {
21        println!("\nkernel32.dll base: 0x{:X}", kernel32.base);
22
23        let bytes = process.read_bytes(kernel32.base, 64)?;
24        println!("First 64 bytes:");
25        for (i, chunk) in bytes.chunks(16).enumerate() {
26            print!("  {:04X}: ", i * 16);
27            for byte in chunk {
28                print!("{:02X} ", byte);
29            }
30            println!();
31        }
32    }
33
34    Ok(())
35}
More examples
Hide additional examples
examples/scatter_read.rs (line 8)
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5    let dma = Dma::new("fpga://algo=0")?;
6    let process = dma.attach("explorer.exe")?;
7
8    let modules = process.list_modules()?;
9    let kernel32 = modules.iter()
10        .find(|m| m.name.eq_ignore_ascii_case("kernel32.dll"))
11        .ok_or("kernel32.dll not found")?;
12
13    let base = kernel32.base;
14    let num_reads = 1000;
15
16    let start = Instant::now();
17    for i in 0..num_reads {
18        let _: u32 = process.read(base + i * 0x1000)?;
19    }
20    let normal_time = start.elapsed();
21
22    let start = Instant::now();
23    let mut scatter = process.scatter()?;
24
25    for i in 0..num_reads {
26        scatter.prepare_read(base + i * 0x1000, 4);
27    }
28
29    scatter.execute()?;
30
31    for i in 0..num_reads {
32        let _: u32 = scatter.read_as(base + i * 0x1000)?;
33    }
34    let scatter_time = start.elapsed();
35
36    println!("Normal reads ({} iterations): {:?}", num_reads, normal_time);
37    println!("Scatter reads ({} iterations): {:?}", num_reads, scatter_time);
38    println!("Speedup: {:.2}x", normal_time.as_secs_f64() / scatter_time.as_secs_f64());
39
40    Ok(())
41}
examples/read_write.rs (line 7)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let dma = Dma::new("fpga://algo=0")?;
5    let process = dma.attach("explorer.exe")?;
6
7    let modules = process.list_modules()?;
8    let module = modules.first()
9        .ok_or("No modules found")?;
10
11    println!("Reading from {} @ 0x{:X}", module.name, module.base);
12
13    let value_u32: u32 = process.read(module.base)?;
14    println!("u32 value: 0x{:08X}", value_u32);
15
16    let value_u64: u64 = process.read(module.base)?;
17    println!("u64 value: 0x{:016X}", value_u64);
18
19    let bytes = process.read_bytes(module.base, 16)?;
20    print!("Bytes: ");
21    for byte in &bytes {
22        print!("{:02X} ", byte);
23    }
24    println!();
25
26    #[repr(C)]
27    #[derive(Copy, Clone, Debug)]
28    struct DosHeader {
29        e_magic: u16,
30        e_cblp: u16,
31        e_cp: u16,
32        e_crlc: u16,
33    }
34
35    let dos_header: DosHeader = process.read(module.base)?;
36    println!("\nDOS Header:");
37    println!("  Magic: 0x{:04X} ({}{})",
38        dos_header.e_magic,
39        (dos_header.e_magic as u8) as char,
40        (dos_header.e_magic >> 8) as u8 as char
41    );
42
43    Ok(())
44}
Source

pub fn read_string( &self, address: u64, max_length: usize, ) -> Result<String, DmaError>

Source

pub fn inner(&self) -> &VmmProcess<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for Process<'a>

§

impl<'a> RefUnwindSafe for Process<'a>

§

impl<'a> Send for Process<'a>

§

impl<'a> Sync for Process<'a>

§

impl<'a> Unpin for Process<'a>

§

impl<'a> UnwindSafe for Process<'a>

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.