From 2314d4d492c2e9bd18263fe81e71e97a68dc0ad8 Mon Sep 17 00:00:00 2001 From: Albert24GG <guiman.albert09@gmail.com> Date: Thu, 29 Feb 2024 22:23:52 +0200 Subject: [PATCH] Allow to add signed integers to Address variables --- src/dumper/offsets.rs | 2 +- src/util/address.rs | 8 ++++++-- src/util/process.rs | 14 ++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/dumper/offsets.rs b/src/dumper/offsets.rs index d5810d1..59be15e 100644 --- a/src/dumper/offsets.rs +++ b/src/dumper/offsets.rs @@ -81,7 +81,7 @@ pub fn dump_offsets( let mut result: usize = 0; process.read_memory_raw( - address.add(start), + address.add(start.try_into().unwrap()), &mut result as *mut _ as *mut _, end - start, )?; diff --git a/src/util/address.rs b/src/util/address.rs index 3ddd41c..8af0b1d 100644 --- a/src/util/address.rs +++ b/src/util/address.rs @@ -18,8 +18,12 @@ impl Address { /// /// * `Address` - A new `Address` struct with the value of the current address plus the given value. #[inline] - pub fn add(&self, value: usize) -> Self { - Self(self.0 + value) + pub fn add(&self, value: i64) -> Self { + if value.is_negative() { + self.sub(value.wrapping_abs() as usize) + } else { + Self(self.0 + value as usize) + } } /// Returns true if the value of the address is zero. diff --git a/src/util/process.rs b/src/util/process.rs index bd4fb1e..5a0eec1 100644 --- a/src/util/process.rs +++ b/src/util/process.rs @@ -322,11 +322,12 @@ impl Process { length: Option<usize>, ) -> Result<Address> { // The displacement value can be negative. - let displacement = self.read_memory::<i32>(address.add(offset.unwrap_or(0x1)))?; + let displacement = + self.read_memory::<i32>(address.add(offset.unwrap_or(0x1).try_into().unwrap()))?; Ok(address - .add(length.unwrap_or(0x5)) - .add(displacement as usize)) + .add(length.unwrap_or(0x5).try_into().unwrap()) + .add(displacement.into())) } /// Resolves the absolute address of a RIP-relative address. @@ -348,11 +349,12 @@ impl Process { length: Option<usize>, ) -> Result<Address> { // The displacement value can be negative. - let displacement = self.read_memory::<i32>(address.add(offset.unwrap_or(0x3)))?; + let displacement = + self.read_memory::<i32>(address.add(offset.unwrap_or(0x3).try_into().unwrap()))?; Ok(address - .add(length.unwrap_or(0x7)) - .add(displacement as usize)) + .add(length.unwrap_or(0x7).try_into().unwrap()) + .add(displacement.into())) } /// Returns the process ID of the first process with the given name.