公司动态
SafetyHook项目概览:为什么它是C++函数Hooking库中罕见的线程安全选择
SafetyHook项目概览为什么它是C函数Hooking库中罕见的线程安全选择【免费下载链接】safetyhookC23 procedure hooking library.项目地址: https://gitcode.com/gh_mirrors/sa/safetyhookSafetyHook 是一款C23 函数 Hooking 库专为 Windows x86/x86_64 平台设计。它解决了 Hooking 领域最头疼的问题——多线程下的 Hook 安全在创建或移除 Hook 时自动暂停其他线程并智能修正可能受影响的线程指令指针让运行时函数拦截既简单又稳定。为什么线程安全是 C 函数 Hooking 的难题 函数 HookingHooking的原理是改写目标函数的开头几条指令让程序跳转到你的替代逻辑。但这里藏着一个经典陷阱如果你改写指令时另一个线程恰好正在执行这几条被改写的指令程序会直接崩溃大多数 Hooking 库把暂停线程的责任丢给了开发者稍有不慎就是难以复现的偶发崩溃。SafetyHook 把这件事变成了库内建行为。项目自带的多线程示例 threadsafe.cpp 就演示了一个线程无限循环调用被 Hook 的函数主线程随时创建、移除 Hook 也不出问题的场景。SafetyHook 核心能力一份完整的线程安全清单 ✅从项目 README 和源码中可以提炼出它的安全机制能力说明暂停其他线程创建/删除 Hook 时冻结所有其他线程消除改写冲突指令指针修正通过 Windows 向量异常处理器VEH捕获受影响线程自动修正其 EIP/RIP相对位移修正重定位指令时自动修正 RIP 相对寻址如lea rax, [rip0x1234]相对偏移修正处理jmp 0x1234这类指令的相对偏移短分支拓宽自动把 short branch 拓宽为 near branch现代化反汇编基于 Zydis 引擎支持最新指令集难以误用的 API使用std::expected返回明确错误而非抛异常其中线程冻结与指令修正的核心实现在 os.windows.cpp 的TrapManager类中——它注册了一个异常处理器当线程陷入正在被改写的内存区域时自动把其指令指针搬运到正确位置后放行。SafetyHook 支持的 3 种 Hooking 方式 1️⃣ InlineHook函数入口内联 Hook最基础的用法。把目标函数开头替换为跳转指令被移走的原指令搬进蹦床trampoline供你后续调用原函数。支持E9相对跳转和FF绝对跳转两种模式x86_64下会自动回退见 inline_hook.cpp 中的e9_hook/ff_hook。2️⃣ MidHook函数中部 HookInline Hook 只能拿到函数参数而 mid_hook.hpp 提供的 MidHook 可以拦截函数执行中途的任意地址回调函数会收到一个Context参数通过 context.hpp 读取/修改 CPU 寄存器——适合需要拿到中间状态的高阶拦截场景。3️⃣ VmtHook虚函数表 Hook针对 C 多态场景vmt_hook.hpp 会克隆对象的整个虚函数表VMT只替换你指定的方法项并可对多个对象复用同一份克隆表。这比直接改内存中的 vtable 更安全因为原始表始终原封不动。快速上手5 步接入 SafetyHook 获取源码可 clone 仓库地址https://gitcode.com/gh_mirrors/sa/safetyhook或通过 CMakeFetchContent、git 子模块集成也可使用官方的一体化amalgamated构建包安装依赖SafetyHook 依赖反汇编库 Zydis可用-DSAFETYHOOK_FETCH_ZYDISON让其自动拉取引入头文件只需#include safetyhook.hpp一个头文件包含全部 API见 safetyhook.hpp两行代码创建 Hook使用 easy API 即可自动清理将 Hook 对象置为{}或让其析构原函数即被完整恢复。最简用法节选自 README.mdSafetyHookInline g_add_hook{}; // 创建 hook内部自动完成线程冻结与指令修正 g_add_hook safetyhook::create_inline( reinterpret_castvoid*(add), reinterpret_castvoid*(hook_add)); // 在 hook 中调用原函数 int result g_add_hook.callint(3, 4); g_add_hook {}; // 移除 hook恢复原函数更多完整示例可参考 example/minimal.cpp、example/multiple.cpp、example/vmthook.cpp。项目结构导航 路径内容include/safetyhook/核心头文件inline_hook.hpp、mid_hook.hpp、vmt_hook.hpp、easy.hpp、allocator.hppsrc/实现代码inline_hook.cppHook 构建、os.windows.cpp线程冻结、allocator.cpp蹦床内存分配example/6 个可直接编译的示例最简 Hook、多线程安全、DLL 注入、VMT Hook 等test/单元测试覆盖各类 Hook 与分配器CMakeLists.txtCMake 构建入口amalgamate.py一体化单文件构建脚本内存分配器 allocator.hpp 值得一提它负责把蹦床分配到距目标地址足够近的区域保证跳转指令的相对偏移在 ±2GB 范围内——这是内联 Hook 能成立的前提。总结SafetyHook 适合谁 它特别适合需要在多线程 Windows 应用中稳定拦截函数游戏、安全研究、热修复、行为监控、又不想自己处理线程同步的 C 开发者。选型时请注意平台限定为Windows x86/x86_64源码中os.linux.cpp仅为基础占位Linux 平台 Hook 能力未完整提供需要C23编译器使用了std::expected等特性依赖Zydis反汇编库。如果你受够了Hook 偶发崩溃的调试噩梦SafetyHook 的线程安全设计值得作为 C 函数 Hooking 方案的首选评估对象。【免费下载链接】safetyhookC23 procedure hooking library.项目地址: https://gitcode.com/gh_mirrors/sa/safetyhook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考