parent
c31ca2c9f7
commit
a426b6fc3d
@ -20,7 +20,9 @@ type pthread_introspection_hook_t = extern "C" fn(
|
|||||||
);
|
);
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn pthread_introspection_hook_install(hook: *const libc::c_void) -> *const libc::c_void;
|
fn pthread_introspection_hook_install(
|
||||||
|
hook: *const pthread_introspection_hook_t,
|
||||||
|
) -> *const pthread_introspection_hook_t;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PreviousHook(*const pthread_introspection_hook_t);
|
struct PreviousHook(*const pthread_introspection_hook_t);
|
||||||
@ -57,7 +59,7 @@ impl PreviousHook {
|
|||||||
}
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
self.0 = std::ptr::null();
|
self.0 = std::ptr::null();
|
||||||
pthread_introspection_hook_install(inner as *const libc::c_void);
|
pthread_introspection_hook_install(inner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -66,7 +68,7 @@ impl PreviousHook {
|
|||||||
// Mark it as sync.
|
// Mark it as sync.
|
||||||
unsafe impl Sync for PreviousHook {}
|
unsafe impl Sync for PreviousHook {}
|
||||||
|
|
||||||
#[allow(non_upper_case_globals)]
|
// TODO: This could use a RwLock as well
|
||||||
static mut PREVIOUS_HOOK: PreviousHook = PreviousHook(std::ptr::null());
|
static mut PREVIOUS_HOOK: PreviousHook = PreviousHook(std::ptr::null());
|
||||||
|
|
||||||
static CURRENT_HOOK: RwLock<Option<PthreadIntrospectionHook>> = RwLock::new(None);
|
static CURRENT_HOOK: RwLock<Option<PthreadIntrospectionHook>> = RwLock::new(None);
|
||||||
@ -131,9 +133,11 @@ impl From<EventType> for libc::c_uint {
|
|||||||
///# use libafl_frida::pthread_hook;
|
///# use libafl_frida::pthread_hook;
|
||||||
///# use std::time::Duration;
|
///# use std::time::Duration;
|
||||||
///# use std::thread;
|
///# use std::thread;
|
||||||
|
/// unsafe {
|
||||||
/// pthread_hook::install(|event, pthread, addr, size| {
|
/// pthread_hook::install(|event, pthread, addr, size| {
|
||||||
/// log::trace!("thread id=0x{:x} event={:?} addr={:?} size={:x}", pthread, event, addr, size);
|
/// log::trace!("thread id=0x{:x} event={:?} addr={:?} size={:x}", pthread, event, addr, size);
|
||||||
/// });
|
/// });
|
||||||
|
/// };
|
||||||
///# thread::spawn(|| {
|
///# thread::spawn(|| {
|
||||||
///# thread::sleep(Duration::from_millis(1));
|
///# thread::sleep(Duration::from_millis(1));
|
||||||
///# });
|
///# });
|
||||||
@ -156,12 +160,10 @@ where
|
|||||||
let mut new_hook = CURRENT_HOOK.write().unwrap();
|
let mut new_hook = CURRENT_HOOK.write().unwrap();
|
||||||
*new_hook = Some(Box::new(hook));
|
*new_hook = Some(Box::new(hook));
|
||||||
|
|
||||||
let prev = unsafe {
|
let prev = unsafe { pthread_introspection_hook_install(pthread_introspection_hook as _) };
|
||||||
pthread_introspection_hook_install(pthread_introspection_hook as *const libc::c_void)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Allow because we're sure this isn't from a different code generation unit.
|
// Allow because we're sure this isn't from a different code generation unit.
|
||||||
if !(prev).is_null() && prev != pthread_introspection_hook as *const libc::c_void {
|
if !(prev).is_null() && prev != pthread_introspection_hook as _ {
|
||||||
unsafe {
|
unsafe {
|
||||||
PREVIOUS_HOOK.set(prev as *const pthread_introspection_hook_t);
|
PREVIOUS_HOOK.set(prev as *const pthread_introspection_hook_t);
|
||||||
}
|
}
|
||||||
@ -174,7 +176,7 @@ where
|
|||||||
///# use libafl_frida::pthread_hook;
|
///# use libafl_frida::pthread_hook;
|
||||||
///# use std::time::Duration;
|
///# use std::time::Duration;
|
||||||
///# use std::thread;
|
///# use std::thread;
|
||||||
/// pthread_hook::reset();
|
/// unsafe { pthread_hook::reset() };
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
@ -220,7 +222,7 @@ mod test {
|
|||||||
let mut triggered = inner_triggered.lock().unwrap();
|
let mut triggered = inner_triggered.lock().unwrap();
|
||||||
*triggered = true;
|
*triggered = true;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
thread::spawn(|| {
|
thread::spawn(|| {
|
||||||
@ -244,7 +246,7 @@ mod test {
|
|||||||
let mut triggered = inner_triggered.lock().unwrap();
|
let mut triggered = inner_triggered.lock().unwrap();
|
||||||
*triggered = true;
|
*triggered = true;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
thread::spawn(|| {
|
thread::spawn(|| {
|
||||||
@ -268,7 +270,7 @@ mod test {
|
|||||||
let mut triggered = inner_triggered.lock().unwrap();
|
let mut triggered = inner_triggered.lock().unwrap();
|
||||||
*triggered = true;
|
*triggered = true;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
unsafe { super::reset() };
|
unsafe { super::reset() };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user