1use std::{arch::asm, ffi::CStr};
2
3use hooking::{HookData, HookWriter};
4
5unsafe extern "C" fn hook(s: *const libc::c_char) {
6 let param_s = unsafe { CStr::from_ptr(s) };
7
8 let original_puts: extern "C" fn(*const libc::c_char) =
9 unsafe { std::mem::transmute(hooking::original_function_ptr().as_ptr()) };
10
11 println!(
12 "Hooked function param: {:?} | Original fn restore jump: {:?}",
13 param_s, original_puts
14 );
15
16 original_puts(c"Call original puts restore detour".as_ptr());
17}
18
19fn main() {
20 let hook_writer = HookWriter::from_static();
21 let hook = unsafe {
22 hook_writer
23 .write_hook(None, c"puts", hook as *mut u8)
24 .unwrap()
25 };
26
27 let HookData {
28 trampoline_data, ..
29 } = hook.data;
30
31 unsafe {
32 asm! {
33 "mov rdi, {}",
34 "call {}",
35 in(reg)c"Call trampoline hook manually".as_ptr(),
36 in(reg)trampoline_data.as_ptr()
37 }
38 }
39
40 unsafe {
41 libc::puts(c"Not hooked".as_ptr());
42 }
43}