1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use frida_gum_sys as gum_sys;
use std::ffi::CString;
use std::os::raw::c_void;
use crate::{NativePointer, PageProtection, RangeDetails};
extern "C" fn enumerate_ranges_callout(
range_details: *const gum_sys::_GumRangeDetails,
user_data: *mut c_void,
) -> gum_sys::gboolean {
let mut f = unsafe { Box::from_raw(user_data as *mut Box<dyn FnMut(RangeDetails) -> bool>) };
let r = f(RangeDetails::from_raw(range_details));
Box::leak(f);
r as gum_sys::gboolean
}
pub struct Module;
impl Module {
pub fn find_export_by_name(module_name: Option<&str>, symbol_name: &str) -> NativePointer {
let symbol_name = CString::new(symbol_name).unwrap();
NativePointer(match module_name {
None => unsafe {
gum_sys::gum_module_find_export_by_name(std::ptr::null_mut(), symbol_name.as_ptr())
},
Some(name) => unsafe {
let module_name = CString::new(name).unwrap();
gum_sys::gum_module_find_export_by_name(module_name.as_ptr(), symbol_name.as_ptr())
},
} as *mut c_void)
}
pub fn find_base_address(module_name: &str) -> NativePointer {
let module_name = CString::new(module_name).unwrap();
unsafe {
NativePointer(gum_sys::gum_module_find_base_address(module_name.as_ptr()) as *mut c_void)
}
}
pub fn enumerate_ranges(
module_name: &str,
prot: PageProtection,
callout: impl FnMut(RangeDetails) -> bool,
) {
let module_name = CString::new(module_name).unwrap();
unsafe {
let user_data = Box::leak(Box::new(
Box::new(callout) as Box<dyn FnMut(RangeDetails) -> bool>
)) as *mut _ as *mut c_void;
gum_sys::gum_module_enumerate_ranges(
module_name.as_ptr(),
prot as u32,
Some(enumerate_ranges_callout),
user_data,
);
let _ = Box::from_raw(user_data as *mut Box<dyn FnMut(RangeDetails) -> bool>);
}
}
}