pub struct Process<'a> { /* private fields */ }Implementations§
Source§impl<'a> Process<'a>
impl<'a> Process<'a>
pub fn pid(&self) -> u32
Sourcepub fn info(&self) -> Result<ProcessInfo, DmaError>
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}Sourcepub fn read<T: Copy>(&self, address: u64) -> Result<T, DmaError>
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
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}Sourcepub fn read_bytes(&self, address: u64, size: usize) -> Result<Vec<u8>, DmaError>
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
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}pub fn write<T: Copy>(&self, address: u64, value: &T) -> Result<(), DmaError>
pub fn write_bytes(&self, address: u64, data: &[u8]) -> Result<(), DmaError>
Sourcepub fn scatter(&'a self) -> Result<ScatterHandle<'a>, DmaError>
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}Sourcepub fn module_base(&self, module_name: &str) -> Result<u64, DmaError>
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}Sourcepub fn proc_address(
&self,
module_name: &str,
function_name: &str,
) -> Result<u64, DmaError>
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}Sourcepub fn list_modules(&self) -> Result<Vec<Module>, DmaError>
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
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}