Added all hook types and possibility for user data
This commit is contained in:
parent
282da6f98b
commit
418aef083c
1 changed files with 73 additions and 12 deletions
85
src/lib.rs
85
src/lib.rs
|
@ -1,5 +1,6 @@
|
|||
use ilhook::x64::{
|
||||
CallbackOption, Hooker, HookFlags, HookPoint, HookType, JmpBackRoutine, RetnRoutine,
|
||||
CallbackOption, Hooker, HookFlags, HookPoint, HookType, JmpBackRoutine, JmpToAddrRoutine,
|
||||
JmpToRetRoutine, RetnRoutine,
|
||||
};
|
||||
|
||||
pub struct Interceptor {
|
||||
|
@ -11,38 +12,98 @@ impl Interceptor {
|
|||
Self { hooks: Vec::new() }
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
/// Creates an attach hook.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// * `addr` - The being-hooked address.
|
||||
/// * `routine` - The callback routine.
|
||||
/// * `user_data` - The ptr to user defined data, caller must ensure data remains valid, otherwise its UB.
|
||||
pub fn attach(
|
||||
&mut self,
|
||||
addr: usize,
|
||||
routine: JmpBackRoutine,
|
||||
user_data: Option<usize>,
|
||||
) -> Result<(), ilhook::HookError> {
|
||||
let hooker = Hooker::new(
|
||||
self.hook(Hooker::new(
|
||||
addr,
|
||||
HookType::JmpBack(routine),
|
||||
CallbackOption::None,
|
||||
0,
|
||||
user_data.unwrap_or(0),
|
||||
HookFlags::empty(),
|
||||
);
|
||||
|
||||
let hook_point = unsafe { hooker.hook() }?;
|
||||
self.hooks.push(hook_point);
|
||||
Ok(())
|
||||
))
|
||||
}
|
||||
|
||||
/// Creates a replace hook.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// * `addr` - The being-hooked address.
|
||||
/// * `routine` - The callback routine.
|
||||
/// * `user_data` - The ptr to user defined data, caller must ensure data remains valid, otherwise its UB.
|
||||
pub fn replace(
|
||||
&mut self,
|
||||
addr: usize,
|
||||
routine: RetnRoutine,
|
||||
user_data: Option<usize>,
|
||||
) -> Result<(), ilhook::HookError> {
|
||||
let hooker = Hooker::new(
|
||||
self.hook(Hooker::new(
|
||||
addr,
|
||||
HookType::Retn(routine),
|
||||
CallbackOption::None,
|
||||
0,
|
||||
user_data.unwrap_or(0),
|
||||
HookFlags::empty(),
|
||||
);
|
||||
))
|
||||
}
|
||||
|
||||
/// Creates a jmp_to_ret hook.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// * `addr` - The being-hooked address.
|
||||
/// * `routine` - The callback routine.
|
||||
/// * `user_data` - The ptr to user defined data, caller must ensure data remains valid, otherwise its UB.
|
||||
pub fn jmp_to_ret(
|
||||
&mut self,
|
||||
addr: usize,
|
||||
routine: JmpToRetRoutine,
|
||||
user_data: Option<usize>,
|
||||
) -> Result<(), ilhook::HookError> {
|
||||
self.hook(Hooker::new(
|
||||
addr,
|
||||
HookType::JmpToRet(routine),
|
||||
CallbackOption::None,
|
||||
user_data.unwrap_or(0),
|
||||
HookFlags::empty(),
|
||||
))
|
||||
}
|
||||
|
||||
/// Creates a jmp_to_addr hook.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// * `addr` - The being-hooked address.
|
||||
/// * `routine` - The callback routine.
|
||||
/// * `jmp_addr` - The address to jump back to once done.
|
||||
/// * `user_data` - The ptr to user defined data, caller must ensure data remains valid, otherwise its UB.
|
||||
pub fn jmp_to_addr(
|
||||
&mut self,
|
||||
addr: usize,
|
||||
routine: JmpToAddrRoutine,
|
||||
jmp_addr: usize,
|
||||
user_data: Option<usize>,
|
||||
) -> Result<(), ilhook::HookError> {
|
||||
self.hook(Hooker::new(
|
||||
addr,
|
||||
HookType::JmpToAddr(jmp_addr, routine),
|
||||
CallbackOption::None,
|
||||
user_data.unwrap_or(0),
|
||||
HookFlags::empty(),
|
||||
))
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn hook(&mut self, hooker: Hooker) -> Result<(), ilhook::HookError> {
|
||||
let hook_point = unsafe { hooker.hook() }?;
|
||||
self.hooks.push(hook_point);
|
||||
Ok(())
|
||||
|
|
Loading…
Reference in a new issue