1use std::ffi::CStr;
2
3use hooking::{self, hook};
4use libc::c_int;
5
6#[hook(method = "puts")]
7unsafe extern "C" fn hooked_puts(s: *const i8) -> c_int {
8 let param_s = unsafe { CStr::from_ptr(s) };
9
10 let original_puts: extern "C" fn(*const i8) -> c_int = unsafe {
11 std::mem::transmute(
12 hooking::original_function_ptr()
13 .expect("called from hook")
14 .as_ptr(),
15 )
16 };
17
18 println!(
19 "Hooked function param: {:?} | Original fn restore jump: {:?}",
20 param_s, original_puts
21 );
22
23 original_puts(c"Yes, im hooked!".as_ptr())
24}
25
26fn main() {
27 unsafe { hooked_puts::enable_hook().unwrap() };
28
29 #[cfg(target_os = "linux")]
30 unsafe {
31 libc::puts(c"Am i hooked?".as_ptr());
32 }
33
34 unsafe { hooked_puts::disable_hook().unwrap() };
35
36 #[cfg(target_os = "linux")]
37 unsafe {
38 libc::puts(c"Now im not".as_ptr());
39 }
40}