Skip to main content

hook_puts/
hook_puts.rs

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}