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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use frida_gum_sys as gum_sys;
use std::marker::PhantomData;
#[cfg(feature = "invocation-listener")]
use std::os::raw::c_void;
#[cfg(feature = "invocation-listener")]
use std::ptr;
use crate::Gum;
#[cfg(feature = "invocation-listener")]
use crate::NativePointer;
#[cfg(feature = "invocation-listener")]
mod invocation_listener;
#[cfg(feature = "invocation-listener")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "invocation-listener")))]
pub use invocation_listener::*;
pub struct Interceptor<'a> {
interceptor: *mut gum_sys::GumInterceptor,
phantom: PhantomData<&'a gum_sys::GumInterceptor>,
}
impl<'a> Interceptor<'a> {
pub fn obtain<'b>(_gum: &'b Gum) -> Interceptor
where
'b: 'a,
{
Interceptor {
interceptor: unsafe { gum_sys::gum_interceptor_obtain() },
phantom: PhantomData,
}
}
#[cfg(feature = "invocation-listener")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "invocation-listener")))]
pub fn attach<I: InvocationListener>(
&mut self,
f: NativePointer,
listener: &mut I,
) -> NativePointer {
let listener = invocation_listener_transform(listener);
unsafe {
gum_sys::gum_interceptor_attach(self.interceptor, f.0, listener, ptr::null_mut())
};
NativePointer(listener as *mut c_void)
}
#[cfg(feature = "invocation-listener")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "invocation-listener")))]
pub fn detach(&mut self, listener: NativePointer) {
unsafe {
gum_sys::gum_interceptor_detach(
self.interceptor,
listener.0 as *mut gum_sys::GumInvocationListener,
)
};
}
pub fn begin_transaction(&mut self) {
unsafe { gum_sys::gum_interceptor_begin_transaction(self.interceptor) };
}
pub fn end_transaction(&mut self) {
unsafe { gum_sys::gum_interceptor_end_transaction(self.interceptor) };
}
}