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.