Skip to content

Memory Hook 宏

作用

pl/api/memory/Hook.h 提供 C++ hook 宏,用更少样板代码声明并注册 hook。

头文件

cpp
#include <pl/api/memory/Hook.h>

相关类型

cpp
namespace memory {
enum class HookPriority : int {
  Highest,
  High,
  Normal,
  Low,
  Lowest,
};
}

常用宏

作用
LL_STATIC_HOOK定义静态函数 hook,需要手动调用 hook()
LL_AUTO_STATIC_HOOK定义静态函数 hook,并自动注册
LL_INSTANCE_HOOK定义成员函数 hook,需要手动调用 hook()
LL_AUTO_INSTANCE_HOOK定义成员函数 hook,并自动注册
LL_TYPED_STATIC_HOOK静态 hook,并继承一个自定义类型
LL_AUTO_TYPED_STATIC_HOOK自动注册的 typed 静态 hook
LL_TYPED_HOOK成员 hook,并继承一个自定义类型
LL_AUTO_TYPED_INSTANCE_HOOK自动注册的 typed 成员 hook

参数含义

LL_STATIC_HOOK 为例:

cpp
LL_STATIC_HOOK(DefType, priority, identifier, module, Ret, ...)
参数说明
DefType生成的 hook 类型名
prioritymemory::HookPriority
identifier目标函数地址、函数指针、函数名或 pattern
module目标模块名
Ret返回值类型
...目标函数参数列表

静态函数示例

cpp
#include <pl/api/memory/Hook.h>

LL_STATIC_HOOK(MyTickHook,
               memory::HookPriority::Normal,
               "Game_tick",
               "libminecraftpe.so",
               void,
               void *self) {
  origin(self);
}

void install() {
  MyTickHook::hook();
}

void uninstall() {
  MyTickHook::unhook();
}

自动注册示例

cpp
#include <pl/api/memory/Hook.h>

LL_AUTO_STATIC_HOOK(MyAutoHook,
                    memory::HookPriority::High,
                    "Game_tick",
                    "libminecraftpe.so",
                    void,
                    void *self) {
  origin(self);
}

直接地址示例

cpp
LL_STATIC_HOOK(MyAddressHook,
               memory::HookPriority::Normal,
               reinterpret_cast<uintptr_t>(target_address),
               nullptr,
               int,
               int value) {
  return origin(value);
}

注意事项

  • origin(...) 会调用原函数或 hook 链中的下一个函数。
  • detour 参数和返回值必须与目标函数匹配。
  • 自动注册时目标函数不可用可能会失败;这种情况应使用手动注册宏。