From 5f77c729a15a74949103fa5e61f05efb24eb1554 Mon Sep 17 00:00:00 2001 From: mnemonikr <138624285+mnemonikr@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:58:38 -0700 Subject: [PATCH 1/4] Use AddressSpace name instead of id to map to sys::AddrSpace --- src/sleigh.rs | 27 +++++++++++---------------- src/tests/sleigh.rs | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/sleigh.rs b/src/sleigh.rs index a68f0f8..9715433 100644 --- a/src/sleigh.rs +++ b/src/sleigh.rs @@ -640,25 +640,20 @@ impl GhidraSleigh { /// Convert an address to a system address. Returns `None` if the provided address space cannot /// be mapped to a system address space. fn sys_address(&self, address: &Address) -> Option> { + let sys_addr_space = self.sys_address_space(&address.address_space)?; + // SAFETY: The provided address space has been verified to be safe - Some(unsafe { - sys::new_address( - self.sys_address_space(address.address_space.id)?, - address.offset, - ) - }) + Some(unsafe { sys::new_address(sys_addr_space, address.offset) }) } - /// Creates address space using the given address space id. Returns `None` if the provided id - /// cannot be mapped to a system address space. - fn sys_address_space(&self, space_id: AddressSpaceId) -> Option<*mut sys::AddrSpace> { - let num_spaces = self.sleigh.num_spaces(); - for i in 0..num_spaces { - let addr_space = self.sleigh.address_space(i); - + /// Converts an address space to a system address space. Returns `None` if the provided address + /// space cannot be mapped to a system address space. + fn sys_address_space(&self, address_space: &AddressSpace) -> Option<*mut sys::AddrSpace> { + for i in 0..self.sleigh.num_spaces() { // SAFETY: The address space returned here is safe to dereference - if AddressSpaceId::from(unsafe { &*addr_space }) == space_id { - return Some(addr_space); + let sys_addr_space = unsafe { &mut *self.sleigh.address_space(i) }; + if sys_addr_space.name() == address_space.name.as_ref() { + return Some(sys_addr_space); } } @@ -685,7 +680,7 @@ impl Sleigh for GhidraSleigh { /// Get the register name for a varnode targeting a register. This will return `None` if the /// target is not a valid register. fn register_name(&self, target: &VarnodeData) -> Option { - let base = self.sys_address_space(target.address.address_space.id)?; + let base = self.sys_address_space(&target.address.address_space)?; // If offset + size overflows then Ghidra can accidentally match a register // diff --git a/src/tests/sleigh.rs b/src/tests/sleigh.rs index 3b9f74a..c43e802 100644 --- a/src/tests/sleigh.rs +++ b/src/tests/sleigh.rs @@ -364,6 +364,21 @@ fn all_register_names() -> Result<()> { Ok(()) } +#[test] +fn all_register_names_multiple_sleigh() -> Result<()> { + let sleigh1 = GhidraSleigh::builder() + .processor_spec(PROCESSOR_SPEC)? + .build(SLEIGH_SPEC)?; + let sleigh2 = GhidraSleigh::builder() + .processor_spec(PROCESSOR_SPEC)? + .build(SLEIGH_SPEC)?; + for (reg, name) in &sleigh1.register_name_map() { + assert_eq!(name, &sleigh1.register_name(reg).unwrap()); + assert_eq!(name, &sleigh2.register_name(reg).unwrap()); + } + Ok(()) +} + fn verify_sleigh(sleigh: GhidraSleigh) { // 0x55 = PUSH RBP let loader = LoadImageImpl(vec![0x55]); From e1112d50795bb2e4616ddaacd8b41c9b3405b703 Mon Sep 17 00:00:00 2001 From: mnemonikr <138624285+mnemonikr@users.noreply.github.com> Date: Thu, 16 Oct 2025 11:08:43 -0700 Subject: [PATCH 2/4] Update CHANGELOG --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3bfe9d..1c21747 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## Unreleased -Nothing here yet +### Fixed + +* `AddressSpace` from another Sleigh instance is now properly recognized. ## [v1.0.0](https://github.com/mnemonikr/libsla/tree/v1.0.0) From 2ad0ce61ff585e7945baf50712807e099f0f0073 Mon Sep 17 00:00:00 2001 From: mnemonikr <138624285+mnemonikr@users.noreply.github.com> Date: Thu, 16 Oct 2025 11:26:55 -0700 Subject: [PATCH 3/4] Remove unnecessary mut reference --- src/sleigh.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sleigh.rs b/src/sleigh.rs index 9715433..4a83496 100644 --- a/src/sleigh.rs +++ b/src/sleigh.rs @@ -650,9 +650,10 @@ impl GhidraSleigh { /// space cannot be mapped to a system address space. fn sys_address_space(&self, address_space: &AddressSpace) -> Option<*mut sys::AddrSpace> { for i in 0..self.sleigh.num_spaces() { - // SAFETY: The address space returned here is safe to dereference - let sys_addr_space = unsafe { &mut *self.sleigh.address_space(i) }; - if sys_addr_space.name() == address_space.name.as_ref() { + let sys_addr_space = self.sleigh.address_space(i); + + // SAFETY: The address space is safe to dereference + if unsafe { (&*sys_addr_space).name() } == address_space.name.as_ref() { return Some(sys_addr_space); } } From 9357f6b07dd663cb109d613b074ae2c296b6d1f3 Mon Sep 17 00:00:00 2001 From: mnemonikr <138624285+mnemonikr@users.noreply.github.com> Date: Thu, 16 Oct 2025 11:31:51 -0700 Subject: [PATCH 4/4] Test comments --- src/tests/sleigh.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tests/sleigh.rs b/src/tests/sleigh.rs index c43e802..a0ce0ed 100644 --- a/src/tests/sleigh.rs +++ b/src/tests/sleigh.rs @@ -365,7 +365,7 @@ fn all_register_names() -> Result<()> { } #[test] -fn all_register_names_multiple_sleigh() -> Result<()> { +fn multiple_sleigh_data_sharing() -> Result<()> { let sleigh1 = GhidraSleigh::builder() .processor_spec(PROCESSOR_SPEC)? .build(SLEIGH_SPEC)?; @@ -373,7 +373,10 @@ fn all_register_names_multiple_sleigh() -> Result<()> { .processor_spec(PROCESSOR_SPEC)? .build(SLEIGH_SPEC)?; for (reg, name) in &sleigh1.register_name_map() { + // Sanity check to ensure sleigh1 correctly identifies this as a register assert_eq!(name, &sleigh1.register_name(reg).unwrap()); + + // Even though the reg varnode is from sleigh1, it should still be recognized by sleigh2 assert_eq!(name, &sleigh2.register_name(reg).unwrap()); } Ok(())