中文 | English
本仓库是 HookNext 在 Xposed Modules Repo 的发布与功能介绍页面;完整使用教程与 HookNext 主页保持同步。它不包含 Android 客户端源码。功能描述以 HookNext 当前发布版本和应用内界面为准。
HookNext 是面向 Android 的可视化 Xposed 模块管理与运行时分析工具。它允许用户在不编写 Xposed 模块代码的情况下,为目标应用配置方法、参数、返回值和字段 Hook,并通过 Android 客户端、局域网 Web 页面或 MCP 客户端查看和管理结果。
HookNext 是 SimpleHook 的全新升级版本。它延续了 SimpleHook 的“用配置表达 Hook”思路,并重新设计了配置模型、编辑体验、运行时兼容层、记录存储和远程管理能力。它不是对旧 APK 的简单改名,也不应假设所有旧配置都能原样运行;项目提供了 SimpleHook 自定义配置导入工具,迁移后仍需检查、启用并测试。
Hook 会改变目标应用的运行过程。请只在自有设备、自有应用或已获得明确授权的测试环境中使用。记录内容可能包含账号、令牌、输入数据、文件内容或密钥材料,请妥善保护。不要将 HookNext 用于绕过付费、访问控制、反作弊或其他安全机制。
- HookNext 与 SimpleHook
- 功能概览
- 安装前提与三个概念
- 首次使用
- 自定义 Hook 配置教程
- 扩展配置
- 记录查看与管理
- DEX 浏览器与 Smali 导入
- 备份、迁移与 Frida 导出
- Web 管理与 MCP
- 常见问题
HookNext 是 SimpleHook 的后继升级版本,而不是一套互不相关的工具。两者都面向可配置 Java/Smali Hook,但 HookNext 在以下方面进行了系统性升级:
| 方面 | HookNext 的变化 |
|---|---|
| 配置编辑 | 将 Hook 模式、值类型、参数、条件和字段信息拆分为结构化编辑项,并在保存前校验 |
| 值类型 | 显式选择 BOOLEAN、INT、STRING、JSON_DATA、NULL 等类型,不再主要依赖文本后缀猜测 |
| 成员定位 | 内置 DEX/APK/APKS 浏览器,支持粘贴 Java/Smali 成员签名并规范化类型 |
| 运行时 | 共享 Hook 语义同时适配现代 libxposed API 101/102 和传统 Xposed API 82 |
| 配置管理 | Room 保存配置,目标应用可读取的 JSON 文件作为同步副本;同步失败可单独重试 |
| 记录系统 | 自定义记录与扩展记录分开存储,支持搜索、筛选、标记、详情查看、删除和导出 |
| 扩展功能 | 以分类开关管理算法、界面、安全、网络、WebView、剪贴板、文件、退出、签名和 HotFix 等能力 |
| 远程管理 | 内置 Ktor Web 服务、Vue 管理页面和分级授权的 MCP 服务 |
| 数据工具 | 支持备份/恢复、SimpleHook 配置导入和自定义配置的 Frida JavaScript 导出 |
迁移时请注意:
- HookNext 和 SimpleHook 的内部配置模型不同,不应手工复制内部文件。
- HookNext 可从剪贴板识别 SimpleHook 导出的单个或多个自定义配置。
- 导入后的配置组默认禁用;已存在的相同配置会被标记并跳过。
- SimpleHook 的扩展开关、应用设置和运行环境状态不会等价地自动迁移。
- 显式值类型、通配符和条件语义应逐条复核,然后在测试应用中验证。
- 修改方法返回值。
- 在调用前修改一个或多个参数。
- 拦截方法执行并返回
null。 - 在指定方法前后修改静态字段或实例字段。
- 不依赖触发方法,直接读取或写入静态字段。
- 记录参数、返回值、参数与返回值、静态字段或实例字段。
- 按参数或返回值条件决定规则是否执行。
- 精确匹配重载,也可使用方法名或参数通配符。
- 支持基本类型、字符串、随机字符串、JSON 对象和
null。
- 浏览已安装应用、APK、APKS 或 DEX 中的类、方法和字段。
- 搜索、按类型或应用汇总、标记、删除并按当前分组/筛选条件导出 Hook 记录。
- 通过 Root、Shizuku 或 Normal 模式同步配置和读取记录。
- 手动或自动备份配置与设置,并从 ZIP 快照恢复。
- 将选中的自定义配置导出为 Frida JavaScript。
- 在同一设备或可信局域网中使用 Web 页面管理配置、扩展和记录。
- 通过 MCP 让兼容客户端以只读、读写或完全访问权限调用 HookNext 工具。
HookNext 当前最低支持 Android 8.0(API 26)。实际可用性还取决于 ROM、Xposed 框架、存储限制和目标应用实现。
真正执行 Hook 的是 Xposed 运行环境。HookNext 当前运行时支持:
- 现代 libxposed API 101/102。
- 传统 Xposed API 82 兼容路径。
需要在兼容的 Xposed 管理器中启用 HookNext,并将目标应用加入模块作用域。现代服务 API 可以让 HookNext 辅助同步作用域;传统框架或不支持相应服务能力的环境需要在框架管理器中手工维护作用域。
工作模式负责配置文件、记录文件和部分应用操作,不替代 Xposed:
| 模式 | 适用环境 | 主要用途 | 注意事项 |
|---|---|---|---|
| Root | 设备已取得 Root 授权 | 通过 libsu 执行高权限文件和进程操作 | 首次使用会请求 Root;只授予可信版本 |
| Shizuku | 已安装并启动 Shizuku | 通过 IPC 执行授权的文件和进程操作 | Shizuku 重启或授权失效后需要重新连接 |
| Normal | 无 Root/Shizuku,或希望使用普通权限 | Android 10 及以下使用允许的文件访问;Android 11+ 使用 SAF 目录授权 | 需要按提示授权 Android/media 等目录,能力受系统限制 |
同一条 Hook 规则在三种工作模式中的期望语义相同;区别主要在 HookNext 如何把配置同步给目标进程、读取记录以及执行启动/停止等辅助操作。
- 从 HookNext 主页的 Releases 获取可信 APK 并安装。
- 在兼容的 Xposed 管理器中启用 HookNext 模块。
- 将准备测试的目标应用加入 HookNext 的模块作用域。
- 打开 HookNext,在设置中选择
Root、Shizuku或Normal工作模式,并完成授权。 - 回到首页,新建自定义配置并选择目标应用。
- 先添加一条记录规则确认成员定位正确,再添加会修改行为的规则。
- 保存配置。若界面提示“已保存,但未写入配置文件”,先解决权限或目录问题并重试同步。
- 完全结束目标应用后重新启动,触发目标功能,再到记录页查看结果。
配置先保存到 HookNext 数据库,再同步为目标应用可读取的 JSON 文件。数据库保存成功但文件同步失败时,编辑不会被回滚;这也是“保存成功”不一定等于“目标进程已经读到新配置”的原因。
对不熟悉的目标方法,建议按以下顺序操作:
- 用 DEX 浏览器或 Smali 签名确认类名、方法名、参数和返回类型。
- 首先使用“记录参数和返回值”,不要立即修改行为。
- 重启目标应用,只触发一次目标功能。
- 在记录页核对实际参数、返回值和调用栈。
- 将规则收窄到精确重载,并按需增加条件。
- 再切换到修改返回值、修改参数或字段模式。
- 每次只改一个变量,出现异常时立即停用规则并重启目标应用。
以下示例均使用虚构的本地测试应用:
package me.example.demo;
public final class DemoService {
public static String environment = "production";
private boolean debugPanelVisible = false;
public boolean isDemoFeatureEnabled() {
return false;
}
public String buildGreeting(String name, int repeat) {
return "Hello " + name;
}
public Profile loadLocalProfile(String id) {
return new Profile(id, "Guest");
}
public void initialize() {
debugPanelVisible = false;
}
}这些片段只用于解释配置字段,不代表真实应用,也不是 Java/Xposed 源代码模板。
| 项目 | 含义 |
|---|---|
| 启用 | 单条规则开关;应用配置总开关也必须开启 |
| Hook 模式 | 修改返回值、参数、字段,拦截执行或记录数据 |
| 类名 | 触发方法所属类的完整名称,例如 me.example.demo.DemoService |
| 方法名 | 普通方法名、构造方法 <init> 或通配符 * |
| 参数类型 | 用于精确定位重载;顺序和数量必须与目标方法一致 |
| 条件判断 | 对指定参数或返回值进行字符串条件匹配 |
| 修改值 | 要写入参数、返回值或字段的值及其显式类型 |
| 字段信息 | 字段所属类、字段名和 Hook 点,仅字段模式使用 |
| 备注 | 便于维护,不参与运行时匹配 |
类、方法和字段应填写实际声明它们的类。当前精确查找针对声明成员,不会自动沿父类层级搜索;混淆后的名称也必须与目标版本一致。
| 模式 | 执行时间 | 是否修改目标行为 | 核心用途 |
|---|---|---|---|
| 修改返回值 | 无返回条件时在调用前;有返回条件时在调用后 | 是 | 用指定值替换方法结果 |
| 修改参数值 | 调用前 | 是 | 替换一个或多个实参 |
| 拦截方法执行 | 调用前 | 是 | 跳过原方法并返回 null |
| 修改静态变量值 | 立即,或触发方法前/后 | 是 | 写入静态字段 |
| 修改实例变量值 | 触发方法前/后 | 是 | 写入当前对象字段 |
| 记录返回值 | 调用后 | 否 | 保存方法结果 |
| 记录参数值 | 调用后 | 否 | 保存调用参数 |
| 记录参数和返回值 | 调用后 | 否 | 同时保存参数与结果 |
| 记录静态变量值 | 立即,或触发方法前/后 | 否 | 读取静态字段 |
| 记录实例变量值 | 触发方法前/后 | 否 | 读取当前对象字段 |
目标:让测试方法 isDemoFeatureEnabled() 返回 true。
模式:修改返回值
类名:me.example.demo.DemoService
方法名:isDemoFeatureEnabled
参数类型:留空
值类型:BOOLEAN
修改值:true
没有返回值条件时,HookNext 会在原方法执行前设置结果并跳过原调用。这样能减少副作用,但也意味着原方法中的日志、状态更新和 I/O 都不会执行。
如果添加了返回值条件,原方法必须先执行;HookNext 在调用后检查原返回值,条件成立才替换结果。例如仅当原结果为 false 时改为 true。
不要对构造方法或 void 方法使用修改返回值。引用类型可返回 NULL,但基本类型返回 null 可能导致拆箱错误或目标应用崩溃。
目标:调用 buildGreeting(String, int) 时,仅把第二个参数改为 3。
模式:修改参数值
类名:me.example.demo.DemoService
方法名:buildGreeting
参数 0 类型:java.lang.String
参数 0 修改值:不设置
参数 1 类型:int
参数 1 值类型:INT
参数 1 修改值:3
参数在原方法执行前修改。没有修改值的参数仍用于定位重载,但保持运行时原值。显式选择的值类型必须与目标参数兼容。
可以给参数 0 添加条件 Equal / demo,使第二个参数只在第一个参数的运行时字符串为 demo 时修改。多个条件之间是“全部满足”关系。
该模式在调用前跳过原方法并返回 null,不需要填写修改值。
它适合返回引用类型或 void 的可控测试方法。对于返回 boolean、int 等基本类型的方法,null 可能在拆箱时引发异常;对于构造、初始化、锁、资源释放和状态提交方法,跳过执行也可能破坏应用状态。遇到这些情况,应优先使用类型正确的“修改返回值”或更精确的条件。
目标:把 DemoService.environment 改为 staging。
直接模式不依赖触发方法:
模式:修改静态变量值
Hook 点:不设置
字段所属类:me.example.demo.DemoService
字段名:environment
值类型:STRING
修改值:staging
配置加载时会尝试写入一次。如果目标应用稍后又覆盖字段,应选择一个触发方法,并将 Hook 点设为“方法执行之前”或“方法执行之后”。
实例字段属于某个对象,必须依附于该对象的方法或构造方法。要在 initialize() 完成后显示测试面板,可配置:
模式:修改实例变量值
类名:me.example.demo.DemoService
方法名:initialize
参数类型:留空
Hook 点:方法执行之后
字段名:debugPanelVisible
值类型:BOOLEAN
修改值:true
实例字段模式不能使用“不设置” Hook 点。通常在字段完成初始化后选择“之后”;需要让原方法读取到新值时选择“之前”。
“记录返回值”“记录参数值”和“记录参数和返回值”均在方法执行后输出,因此看到的是方法结束时的参数数组和结果。“记录静态变量值”可立即读取,也可绑定方法前后;“记录实例变量值”必须绑定当前对象的方法前后。
记录规则不会主动修改方法结果,但序列化复杂对象、生成调用栈或高频写入记录仍会产生性能开销。先使用精确方法和参数类型,避免一开始就对整类所有方法开启记录。
HookNext 使用显式值类型:
| 类型 | 用途与填写方式 |
|---|---|
BOOLEAN |
true 或 false |
BYTE / SHORT / INT / LONG |
对应整数文本,例如 42、-1 |
FLOAT / DOUBLE |
浮点文本,例如 3.14 |
CHAR |
单个字符 |
STRING |
原样字符串;空内容表示空字符串 |
RANDOM_STRING |
选择字符集、长度,以及每次生成、固定复用或定时刷新策略 |
JSON_DATA |
指定目标类名和 JSON,由目标进程的 ClassLoader 与 Gson 构造对象 |
NULL |
null,仅在目标类型允许时使用 |
JSON_DATA 适合字段结构简单、Gson 可构造的对象。例如:
public final class Profile {
public String id;
public String name;
}模式:修改返回值
目标:loadLocalProfile(java.lang.String)
值类型:JSON_DATA
JSON 类名:me.example.demo.Profile
JSON:{"id":"local-001","name":"Test User"}
包含自定义反序列化、复杂泛型、系统句柄、Binder、Context 或特殊构造逻辑的对象不一定能通过 JSON 正确创建。转换失败会产生错误记录,应停用规则并改用更合适的测试对象。
methodName = <init>:匹配构造方法。methodName = *:匹配该类声明的任意方法;合成方法会被排除。- 某个参数类型填写
*:该位置匹配任意类型,但参数数量仍必须一致;该位置不能配置修改值,仍可配置条件。 - 参数列表只填写一个
**:匹配任意参数列表。 <clinit>:不允许配置。
例如 *(**) 的含义接近“当前类声明的所有方法”。这是高风险、高开销的宽泛规则,可能同时命中生命周期、线程、I/O 和内部桥接方法。只应在隔离测试中短时记录,确认目标后改为精确签名。
支持的操作符为:
Equal (=)
NotEqual (!=)
Greater (>)
GreaterOrEqual (>=)
Less (<)
LessOrEqual (<=)
MatchRegex (Regex)
运行时会先把参数或返回值转换为字符串,再执行比较。表达式方向是“填写的判断值 运算符 运行时匹配值”,与编辑器中的条件预览一致。Greater、Less 等目前是字符串字典序比较,不是数值比较;例如判断值 "10"、操作符 <、运行时值 "2" 会成立。正则表达式使用 Kotlin Regex 语法,保存前会检查语法。
所有已配置条件都必须满足,规则才继续执行。返回值条件只用于“修改返回值”“记录返回值”和“记录参数和返回值”;由于必须先得到原返回值,带返回条件的修改规则不会跳过原方法。
假设测试方法如下:
public String buildGreeting(String name, int repeat) {
return "Hello " + name;
}第一步,添加记录规则:
模式:记录参数和返回值
类名:me.example.demo.DemoService
方法名:buildGreeting
参数类型:[java.lang.String, int]
保存、重启目标应用并触发一次。在记录页确认参数 0、参数 1、返回值和调用栈。
第二步,添加修改规则:
模式:修改返回值
类名:me.example.demo.DemoService
方法名:buildGreeting
参数类型:[java.lang.String, int]
参数 0 条件:Equal / demo
值类型:STRING
修改值:Hello from HookNext
此时只有 name.toString() == "demo" 时返回值才会被替换。参数条件可在调用前判断,因此没有返回值条件时,匹配调用会跳过原方法。
扩展配置提供常见系统和框架 API 的预设 Hook。必须同时开启“启用扩展”总开关和具体功能开关;只开启子项但关闭总开关不会生效。
| 分类 | 可配置能力 |
|---|---|
| 基础 | Hook 生效提示;扩展记录总开关、缓存、单条大小、调用栈、Base64 和 Hex 展示 |
| 算法 | Base64 编解码、消息摘要、HMAC、Cipher 加解密记录;摘要/HMAC/Cipher 支持算法族筛选 |
| 界面 | 记录或调整 Dialog、Toast、PopupWindow;按关键词或 View ID 拦截 Dialog;记录点击回调 |
| 安全 | 过滤加速度计、陀螺仪和运动传感器;阻止常见联系人查询;隐藏常见 ADB 状态读取 |
| JSON | 记录 JSONObject 和 JSONArray 的创建或写入内容 |
| 其他 | 记录签名读取、配置签名替换、剪贴板记录/拦截/过滤、文件操作、Intent、Application 入口、退出调用和未捕获异常 |
| 网络 | 对常见 VPN 检测路径返回“未检测到”的结果 |
| WebView | 记录 loadUrl URL/请求头,强制开启 WebView 调试 |
| HotFix | 实验性 DEX 补丁加载;失败始终记录,可选记录“已应用”和“未发现补丁” |
这些扩展针对常见 Android API 路径,并不保证覆盖目标应用的自研实现、Native 代码、反射调用或厂商改造。开启的范围越大,性能开销和兼容性风险越高。
HotFix 属于实验性功能,兼容性受 Android 版本、ClassLoader、编译优化和目标应用结构影响。它会先把补丁复制到目标应用私有 code_cache,校验后设为只读,再尝试注入;仍应只在可恢复的测试环境中使用。
记录来源分为“自定义 Hook”和“扩展 Hook”。记录页支持:
- 按记录类型或应用查看汇总。
- 按关键字搜索,并筛选已读、未读、已标记或未标记记录。
- 查看结构化详情、原始数据、调用栈和编码展示。
- 标记记录、删除单条、删除分组、删除已读或清空全部。
- 按当前分组和筛选条件导出记录,并选择可读格式或包含完整字段的原始 JSON。
自定义记录与扩展记录有独立的输出设置。调用栈、Base64、Hex 和大对象序列化会明显增加记录体积;高频方法应关闭不必要的展示项并设置合理截断长度。
记录由目标应用进程写入分片文件,再由 HookNext 读取并保存到本地数据库。看不到记录时,既要检查 Hook 是否命中,也要检查当前工作模式是否能够读取目标应用的记录目录。
DEX 浏览器可从已安装应用、.apk、.apks 或 .dex 文件读取类、方法和字段,并把成员信息带入编辑器。对于重载方法,这比手工输入更可靠。
编辑器也支持粘贴 Smali/JVM 成员签名,例如:
Lme/example/demo/DemoService;->buildGreeting(Ljava/lang/String;I)Ljava/lang/String;
导入后会规范化为:
类名:me.example.demo.DemoService
方法名:buildGreeting
参数:[java.lang.String, int]
返回类型:java.lang.String
常见类型转换:
| JVM/Smali | Java |
|---|---|
I |
int |
Z |
boolean |
Ljava/lang/String; |
java.lang.String |
[B |
byte[] |
[[Ljava/lang/String; |
java.lang.String[][] |
构造方法、数组、对象描述符、字段静态性和 void 都会在导入时校验。纯字段签名无法表达静态性时,编辑器会要求用户确认当前使用的是静态字段还是实例字段模式。
在“设置 → 备份与恢复”中选择 Documents/HookNext 目录后,可以:
- 手动创建包含自定义配置、扩展配置和设置的 ZIP 快照。
- 在配置变化后自动备份,并按自动、每小时或每天的粒度管理最新备份。
- 从当前目录选择 ZIP 恢复。
恢复会替换当前自定义配置、扩展配置和设置。恢复前先创建当前快照,并确认目标备份来源可信。
- 在 SimpleHook 中将一个或多个自定义配置复制到剪贴板。
- 打开 HookNext 的“设置 → 备份与恢复”。
- 选择“导入 SimpleHook 配置”。
- 查看识别结果和重复标记,勾选需要导入的配置。
- 完成导入后逐条检查类名、参数、值类型、字段和通配符。
- 导入配置组默认禁用;确认无误后手工启用并保存。
- 确认目标应用在 Xposed 作用域中,重启后进行小范围测试。
迁移工具覆盖 SimpleHook 的自定义配置模式,包括旧版 JSON 返回值和随机字符串配置。未识别的旧功能、扩展配置和环境设置需要在 HookNext 中重新配置。
“备份与恢复”页面可选择自定义配置并生成 Frida JavaScript。导出的脚本是便于继续调整的代码产物,不等于对所有 Hook 模式和目标应用的无条件兼容保证;运行前应检查类加载时机、重载、值类型和异常处理。
在“设置 → 局域网 Web 访问”中可以设置端口、访问范围和密码,然后启动前台服务。
- “仅本机”只监听当前 Android 设备使用的本地地址。
- “局域网”允许同一网络中的电脑或手机访问显示的 LAN 地址。
- 页面可查看状态,管理自定义配置和扩展配置,并浏览、标记或删除记录。
- 端口范围为
1024–65535;配置修改后可能需要重启服务。
局域网模式应只在可信网络使用,并启用访问密码。不要把端口直接暴露到公网;系统可能还要求通知权限和允许后台运行。
MCP 端点位于 Web 地址下的 /mcp,供兼容 Model Context Protocol 的客户端使用。HookNext 提供三个权限级别:
| 级别 | 能力 |
|---|---|
| 只读 | 查询状态、应用、配置和记录 |
| 读写 | 只读能力,加上启用/禁用及更新配置和扩展 |
| 完全访问 | 读写能力,加上删除记录、强停应用、切换工作模式等破坏性操作 |
从设置页复制生成的 MCP 客户端配置,避免手工输入令牌。访问密码变更或令牌过期后,需要重新复制配置。未启用密码时,能够连接服务的设备可能直接使用当前授权能力,因此不要在非可信网络开启 MCP,尤其不要开放“完全访问”。
依次检查:
- HookNext 模块是否在 Xposed 管理器中启用。
- 目标应用是否在模块作用域中;传统 Xposed 环境通常需要手工管理。
- 应用配置总开关和单条规则开关是否都开启。
- 保存时是否出现“未写入配置文件”或工作模式不可用提示。
- 类名、方法名、参数数量和类型是否精确匹配目标重载。
- 目标应用是否已完全结束并重新启动,而不只是返回桌面。
- 错误记录中是否存在类、方法、字段或类型转换异常。
Root、Shizuku 和 Normal 是 HookNext 的文件及辅助操作模式。它们不会安装或替代 Xposed,也不会自动让目标应用进入模块作用域。
条件会把值转成字符串。Greater 和 Less 是字典序比较,不是数值比较;需要数值范围逻辑时,应选择可明确表达的字符串格式,或改在测试代码/专用 Hook 中处理。
该模式返回 null。基本类型返回、构造方法以及依赖副作用的方法可能无法接受这个结果。改用类型正确的“修改返回值”,并用参数条件收窄范围。
确认 JSON 类名能被目标进程 ClassLoader 加载,JSON 字段与目标类匹配,并且对象适合 Gson 构造。复杂泛型、系统对象、Context、Binder 或带特殊创建流程的对象通常不适合直接构造。
避免使用 *(**),关闭不需要的算法、调用栈、Base64 和 Hex 记录,缩小到精确方法,降低单条记录大小,并及时清理旧记录。
Android 11+ 的存储限制更严格。按应用提示重新授权正确的 SAF 目录;如果目录授权仍不可用,可在明确理解权限边界后改用 Shizuku 或 Root。
确认服务正在运行、选择的是局域网而不是仅本机、两台设备处于同一网络、端口没有被占用,并检查系统防火墙、VPN、访客网络隔离和后台限制。
- Xposed Hook 依赖实现细节。目标应用升级、混淆、动态加载、Native 代码或厂商 ROM 都可能使既有规则失效。
- 宽泛 Hook、字段修改、签名替换、退出拦截和 HotFix 可能导致目标应用异常,应先备份并在可恢复环境中测试。
- HookNext 只能验证一部分静态类型关系;最终赋值发生在目标进程,运行时失败会写入错误记录。
- 本文按当前 HookNext 实现描述功能。界面名称和能力可能随版本演进,以应用内实际状态和最新发布说明为准。
问题反馈时,请提供 HookNext 版本、Android 版本、Xposed 框架及 API 版本、工作模式、目标应用是否在作用域中,以及已脱敏的错误记录。不要公开上传令牌、签名、账号数据或完整敏感调用内容。