调试 hook 脚本——日志、空脚本定位、逐个加回
先分清楚是哪类问题
Hook 脚本出问题一般就两大类:
| 症状 | 可能原因 |
|---|---|
| 目标应用一开就闪退 | 注入时机太早、脚本代码本身崩溃、和目标应用生命周期冲突 |
| 脚本没反应(想 Hook 的行为没变) | Hook 没生效(重启了吗?框架选对了吗?)、Hook 写错类名/方法名 |
| 悬浮窗不显示 | 增强渲染不支持、modmenu 创建失败、脚本没跑到那 |
| 控制台没输出 | 日志没开、console.log 被吞了、脚本根本没运行 |
工具一:日志
JsHook 的日志面板是最直接的调试入口。确保:
- 目标应用选对了框架(fridamod 等)
- 开了 Hook 服务
- 脚本里有明确的
console.log('[+] 脚本开始运行')之类的标记行 - 重启目标应用
- 看 JsHook 日志面板
如果脚本运行了但你加的 Hook 没生效,标记行应该能看到。如果标记行都看不到,说明脚本根本没跑。
工具二:空脚本
目标应用一开就闪退,先排除是不是脚本本身的问题:
- 在 JsHook 里取消所有脚本勾选
- 保持 Hook 服务开启、框架选中
- 重启目标应用
- 如果还是闪退 → 注入本身有问题(时机太早、框架不兼容、内核驱动模式触发冲突)
- 如果不闪退了 → 脚本有问题,继续第三步
工具三:逐个加回
确认注入本身没问题后,逐个把脚本加回来:
- 只勾脚本 A → 重启目标应用 → 看会不会闪退
- 取消 A,只勾脚本 B → 重启 → 看会不会闪退
- 如果 A 单独跑没问题、B 单独跑没问题、A+B 一起跑闪退 → A 和 B 互相冲突,得调整脚本逻辑
工具四:注入节奏调整
如果是空脚本也闪退,试试调整注入时机:
- 关 Hook 服务
- 启动目标应用,等它完全跑起来(几秒,进入主界面)
- 开 Hook 服务(此时 Frida 会 attach 到已运行的进程)
- 看目标应用会不会崩
如果 attach 到运行中的进程不闪退,说明注入时机太早干扰了应用初始化流程。以后用这种"先开应用、再开 Hook"的模式。
工具五:VS Code 扩展联动
用 JS Hook 的 VS Code 扩展可以实时看日志:
Shift+Alt+F:清日志Shift+Alt+G:看日志(自动刷新)
配合电脑端 frida 直连模式(fridainject 框架),可以在电脑上直接改脚本、推送、看日志。
常见坑快速排查
console.log 没输出
Frida 不支持 console.log 的 %s 风格格式化(像 Node.js 那样)。如果你的代码里写了:
console.log('[+] 结果: %d', result); // ❌ 只会输出 '[+] 结果: %d'
改成字符串拼接:
console.log('[+] 结果: ' + result); // ✅
Hook 写错了类名
Frida 对类名不报错,只会找不到 → Hook 不生效但不崩。如果 Hook 没反应,先验证类名和方法名对不对:
Java.perform(function () {
// 列所有已加载类,搜索目标
Java.enumerateLoadedClasses({
onMatch: function (name) {
if (name.indexOf('Shop') !== -1) {
console.log('[+] 找到类: ' + name);
}
},
onComplete: function () {}
});
});
方法名大小写
Java 方法名是大小写敏感的。getGold 和 getgold 是两个不同的方法名,Frida 不会帮你模糊匹配。