#hook #windows #detour

minhook

A Rust wrapper for MinHook, a minimalistic x86/x64 API hooking library for Windows

9 releases (5 breaking)

0.5.0 Mar 16, 2024
0.4.3 Mar 16, 2024
0.4.1 Feb 28, 2024
0.4.0 Jan 27, 2024
0.0.0 Apr 11, 2023

#3 in #detour

Download history 3/week @ 2024-01-23 1/week @ 2024-02-13 6/week @ 2024-02-20 148/week @ 2024-02-27 8/week @ 2024-03-05 260/week @ 2024-03-12 54/week @ 2024-03-19 14/week @ 2024-03-26 46/week @ 2024-04-02

60 downloads per month

Custom license

270KB
5.5K SLoC

Visual Studio Project 3.5K SLoC C 1.5K SLoC // 0.1% comments Rust 332 SLoC // 0.0% comments Visual Studio Solution 322 SLoC Batch 1 SLoC

minhook

Rust Crates.io rustdoc

A Rust wrapper for the MinHook library.

Unlike other detouring crates, this crate does not require nightly.

Usage

Add this to your Cargo.toml:

[dependencies]
minhook = "0.5.0"

Example

This example shows how to create a hook for a function, and also call the original function.

use minhook::{MinHook, MH_STATUS};

fn main() -> Result<(), MH_STATUS> {
    // Create a hook for the return_0 function, detouring it to return_1
    let return_0_addr = unsafe { MinHook::create_hook(return_0 as _, return_1 as _)? };

    // Enable the hook
    unsafe { MinHook::enable_all_hooks()? };

    // Call the detoured return_0 function, it should return 1
    assert_eq!(return_0(), 1);

    // Transmute the original return_0 function address to a function pointer
    let return_0_orig = unsafe { std::mem::transmute::<_, fn() -> i32>(return_0_addr) };

    // Call the original return_0 function
    assert_eq!(return_0_orig(), 0);

    Ok(())
}

fn return_0() -> i32 {
    0
}

fn return_1() -> i32 {
    1
}

License

This project is licensed under the MIT license (LICENSE or http://opensource.org/licenses/MIT).

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the MIT license, shall be licensed as above, without any additional terms or conditions.

Dependencies

~360–680KB
~11K SLoC