000nico/rusthook

GitHub: 000nico/rusthook

一个用 Rust 实现的极简 inline trampoline hooking 库,用于在运行时安全拦截和重定向函数执行流。

Stars: 0 | Forks: 0

# rusthook 一个使用 Rust 实现的极简、高性能 trampoline hooking 库。专为底层系统插桩和二进制分析而设计,使用原始指针进行直接内存控制,实现零开销。 ## 概述 本库利用 **Inline Trampoline Hooking** 来拦截函数的执行流。它会安全地将目标函数的 prologue 覆盖为一条跳转指令,重定向到你的 hook,同时将原始指令保存在一个动态分配的执行桥接(即 trampoline)中。 ![示例](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/462a8d6e11013929.png) ### Hooking 机制工作流 基于上图所示的架构,hooking 过程会执行以下步骤: 1. **指令边界对齐**:库会解码 `original` 函数的初始字节,以确定一个安全的指令边界(说明至少需要 5 个字节用于相对跳转)。它避免了将指令切断一半,确保应用程序在执行重定位的代码时不会崩溃。 2. **Trampoline 分配**:分配一个单独的可执行内存桩(`trampoline`)。从原函数 prologue 中被覆盖的指令将被克隆到其中: - `mov edi, edi` - `push ebp` - `mov ebp, esp` 3. **追加跳回指令**:在这些克隆的指令之后,紧接着追加一条 `JMP original + N bytes` 指令,以顺畅地恢复不受阻碍的执行流。 4. **函数 Patching**:原函数的 prologue 在内存中被热补丁替换,使用直接的 `JMP hook` 替换掉被覆盖的指令,从而将控制权转移给你的自定义函数。 ## 如何使用 ``` use rusthook::hook; fn main() { hook(function_to_hook as *mut u8, hooked_function as *mut u8); function_to_hook(); } fn hooked_function() { println!("you got hooked buddy"); } fn function_to_hook() { println!("Hello!"); } ```
标签:Hook, Rust, 二进制分析, 云安全运维, 内存操作, 可视化界面, 底层开发, 网络流量审计, 通知系统