refactor: rename detect_pointer/KnownPointer to identify_pointer/PointerIdentity
Browse files
crates/openwa-core/src/mem.rs
CHANGED
|
@@ -128,7 +128,7 @@ pub unsafe fn classify_pointer(value: u32, delta: u32) -> Option<PointerInfo> {
|
|
| 128 |
|
| 129 |
/// Rich pointer identification result.
|
| 130 |
#[derive(Debug)]
|
| 131 |
-
pub struct
|
| 132 |
/// Raw runtime value.
|
| 133 |
pub raw_value: u32,
|
| 134 |
/// Ghidra VA (raw_value - ASLR delta).
|
|
@@ -150,7 +150,7 @@ pub struct KnownPointer {
|
|
| 150 |
///
|
| 151 |
/// `delta` is `runtime_base - 0x400000` (the ASLR offset).
|
| 152 |
#[cfg(target_os = "windows")]
|
| 153 |
-
pub unsafe fn
|
| 154 |
if value == 0 || value < 0x10000 {
|
| 155 |
return None;
|
| 156 |
}
|
|
@@ -174,7 +174,7 @@ pub unsafe fn detect_pointer(value: u32, delta: u32) -> Option<KnownPointer> {
|
|
| 174 |
} else {
|
| 175 |
format!("{}+0x{:X}", resolved.entry.name, resolved.offset)
|
| 176 |
};
|
| 177 |
-
return Some(
|
| 178 |
raw_value: value,
|
| 179 |
ghidra_value: ghidra_val,
|
| 180 |
segment,
|
|
@@ -197,7 +197,7 @@ pub unsafe fn detect_pointer(value: u32, delta: u32) -> Option<KnownPointer> {
|
|
| 197 |
}
|
| 198 |
None => format!("{}+0x{:X}", m.object.class_name, m.offset),
|
| 199 |
};
|
| 200 |
-
return Some(
|
| 201 |
raw_value: value,
|
| 202 |
ghidra_value: ghidra_val,
|
| 203 |
segment: PointerKind::Object,
|
|
@@ -215,7 +215,7 @@ pub unsafe fn detect_pointer(value: u32, delta: u32) -> Option<KnownPointer> {
|
|
| 215 |
let first = *(value as *const u32);
|
| 216 |
let ghidra_first = first.wrapping_sub(delta);
|
| 217 |
if let Some(class) = registry::vtable_class_name(ghidra_first) {
|
| 218 |
-
return Some(
|
| 219 |
raw_value: value,
|
| 220 |
ghidra_value: ghidra_val,
|
| 221 |
segment: PointerKind::Object,
|
|
@@ -227,7 +227,7 @@ pub unsafe fn detect_pointer(value: u32, delta: u32) -> Option<KnownPointer> {
|
|
| 227 |
}
|
| 228 |
|
| 229 |
// 4. Fall back to segment-based classification
|
| 230 |
-
classify_pointer(value, delta).map(|info|
|
| 231 |
raw_value: info.raw_value,
|
| 232 |
ghidra_value: info.ghidra_value,
|
| 233 |
segment: info.kind,
|
|
|
|
| 128 |
|
| 129 |
/// Rich pointer identification result.
|
| 130 |
#[derive(Debug)]
|
| 131 |
+
pub struct PointerIdentity {
|
| 132 |
/// Raw runtime value.
|
| 133 |
pub raw_value: u32,
|
| 134 |
/// Ghidra VA (raw_value - ASLR delta).
|
|
|
|
| 150 |
///
|
| 151 |
/// `delta` is `runtime_base - 0x400000` (the ASLR offset).
|
| 152 |
#[cfg(target_os = "windows")]
|
| 153 |
+
pub unsafe fn identify_pointer(value: u32, delta: u32) -> Option<PointerIdentity> {
|
| 154 |
if value == 0 || value < 0x10000 {
|
| 155 |
return None;
|
| 156 |
}
|
|
|
|
| 174 |
} else {
|
| 175 |
format!("{}+0x{:X}", resolved.entry.name, resolved.offset)
|
| 176 |
};
|
| 177 |
+
return Some(PointerIdentity {
|
| 178 |
raw_value: value,
|
| 179 |
ghidra_value: ghidra_val,
|
| 180 |
segment,
|
|
|
|
| 197 |
}
|
| 198 |
None => format!("{}+0x{:X}", m.object.class_name, m.offset),
|
| 199 |
};
|
| 200 |
+
return Some(PointerIdentity {
|
| 201 |
raw_value: value,
|
| 202 |
ghidra_value: ghidra_val,
|
| 203 |
segment: PointerKind::Object,
|
|
|
|
| 215 |
let first = *(value as *const u32);
|
| 216 |
let ghidra_first = first.wrapping_sub(delta);
|
| 217 |
if let Some(class) = registry::vtable_class_name(ghidra_first) {
|
| 218 |
+
return Some(PointerIdentity {
|
| 219 |
raw_value: value,
|
| 220 |
ghidra_value: ghidra_val,
|
| 221 |
segment: PointerKind::Object,
|
|
|
|
| 227 |
}
|
| 228 |
|
| 229 |
// 4. Fall back to segment-based classification
|
| 230 |
+
classify_pointer(value, delta).map(|info| PointerIdentity {
|
| 231 |
raw_value: info.raw_value,
|
| 232 |
ghidra_value: info.ghidra_value,
|
| 233 |
segment: info.kind,
|