A library for hooking and intercepting functions in rust for windows and linux
Each function creates a stub in memory that consists of
| Section | Description |
|---|---|
| Original fn detour stub address | A function pointer the generated detour stub to call the original function |
| Hooking stub | A small stub that adds some metadata (like adding detour stub address to r10 reg) before calling the hook |
| Original fn detour stub | stub that re-creates the original fn call instructions and patches the instructions to work with ling jumps, then calls the hooked function |
A simple hook:
#[hook(lib = "user32.dll", method = "MessageBoxA")]
unsafe extern "C" fn hook_destination(
_: *mut std::ffi::c_void,
lp_text: *const i8,
lp_caption: *const i8,
_: u32,
) -> i32 {
let original_msgbox = unsafe {
hook_destination::original_function()
.expect("hook_destination must be invoked from hook for original_function to work")
};
original_msgbox(
std::ptr::null_mut(),
c"msgbox was hooked!".as_ptr(),
c"Intercepted hook".as_ptr(),
0,
)
}
unsafe {
unsafe { hook_destination::enable_hook(); }
}You can see more examples in the example directory of the repository.