hook_method
Installs a hook on a target method to capture calls, arguments, call source, and return values; use the token to select an overload and avoid ambiguous targets.
Instructions
在目标方法上安装 Hook,捕获它的调用(参数、调用来源、返回值)。用 token 指定重载;多候选未指定则拒绝。
风险:Hook 会改变游戏运行行为,且错误的参数类型可能崩溃游戏。 建议先用 find_hook_target 确认落点与 token。
重载:同名方法可能有多个重载,token 各不相同。若目标方法有多个
重载而你又没给 token / param_count,本工具会拒绝猜测并返回
候选清单(ok: false)。这是故意的:盲挂到错误的重载上,
Hook 照样会成功,错误要到很久以后才以「数据不对」的形式暴露。
最可靠的做法是从静态元数据取目标重载的 token 传进来。
Args:
name: 类名。
method: 方法名。
namespace: 命名空间。
image: 程序集名。
args_type: 参数类型列表,逗号分隔,用于解析参数值。
可选:int/uint/long/ulong/bool/float/double/ptr/string/cstring
例:"ptr,int,float"。留空则不解析参数值。
写错规格名会直接报错(不再静默按指针读)。
实例方法的第一个整型位置是 this:想拿对象指针就写
"ptr"(0 参数方法也一样,第 1 个 ptr 即 this)。
label: 自定义标签,便于在事件里识别(默认 "类名.方法名")。
max_calls: 最多记录多少次调用(防止高频方法刷爆事件队列)。
backtrace: 是否记录调用栈(较慢,排障时用)。
token: 目标重载的 token(如 "0x06000A3D")。选重载首选这个,
静态元数据的 class_detail / get_method_source 里就有。
param_count: 目标重载的参数个数(-1 表示不指定)。仅在拿不到 token
且各重载参数个数不同时可用。
retval_type: 返回值读取类型(int/uint/long/ulong/bool/float/double/
ptr/string/cstring)。留空 = 按静态返回类型自动推断,
这是推荐用法:float/double 的返回值在 XMM0 而不在 RAX,
按 ptr 读会给出毫无意义的整数。
override_retval: 受控改写返回值(默认空串 = 只观察不改,与原行为
100% 兼容)。支持 int/uint/long/ulong/bool/ptr/float/double;
其余类型会被当场拒绝(不假成功)。
比 eval_script 手写 Interceptor 强在三点:它进探针的
hooks 表,所以 hook_status 看得见、unhook 卸得掉、
write_memory 的重叠护栏也保护得到。
浮点返回值同样可覆写(实测走「整体换 XMM0 的 ArrayBuffer」,
见 agent.js 的 encodeRetvalOverride)。请配合 hook_status
的 override_retval 字段核对,并用 drain_events 里的
original_retval 对比改前/改后。
Returns: {ok, hook_id, class, method, chosen: {pointer, rva_hex, token}, retval_type, return_type, candidate_count, usable_count} 失败时 {ok: false, error, candidates: [...]}。
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| image | No | ||
| label | No | ||
| token | No | ||
| method | Yes | ||
| args_type | No | ||
| backtrace | No | ||
| max_calls | No | ||
| namespace | No | ||
| param_count | No | ||
| retval_type | No | ||
| override_retval | No |