JSXHook模块开发文档
JSXHook简介
由 道无涯i x GPT-5.4 借助现有开源项目联合开发的:
为逆向调试、脚本实验和模块化交付准备的一体化 Javascript Xposed Hook 工作台。
JSXHook 的核心目标,不是单纯做一个“能写脚本”的工具,而是尽量把 Hook 编写、日志调试、项目管理、模块打包、远程更新、HTTP/MCP 服务能力 放进同一套工作流里,让开发者可以用更低的门槛完成从“实验”到“交付”的全过程。
- 一套基于
JavaScript的 Hook 开发环境 - 一个面向逆向实验和模块交付的工作台
- 一个支持项目化、多脚本、独立模块打包和远程协作的桥接层
它适合做这些事:
- 针对目标应用快速编写和验证 Hook
- 用 JavaScript 而不是完整 Android 工程进行逆向实验
- 把项目直接打包成可独立安装的模块应用
- 对外暴露 HTTP 或 MCP 服务,供 AI、脚本或其他工具联动
- 快速交付给测试人员或最终用户使用
功能特性
1. JavaScript Hook 开发
JSXHook 允许直接使用 JavaScript 编写 Xposed Hook 逻辑,无需每次都开一个完整的 Android 模块工程。
支持的典型能力包括:
hook(...)普通方法 Hookreplace(...)替换方法返回hookAll(...)Hook 同名全部重载hookctor(...)Hook 构造函数XposedHelpers/XposedBridge直接调用imports(...)/importClass(...)快速导入 Java 类this["new"](...)创建 Java 对象findClass(...)、callMethod(...)、callStaticMethod(...)等 Java 反射桥接
这意味着可以像写脚本一样去完成原本需要 Java/Kotlin 才能完成的大量 Hook 工作。
2. 项目化管理
JSXHook 不只是“单文件脚本运行器”,而是支持完整的项目结构。
一个项目通常包含:
init.js:项目配置入口main.js:主脚本入口- 其他模块文件:按需拆分为多个
.js
3. 多脚本管理
除了项目模式,JSXHook 也支持“多脚本管理”模式,适合:
- 按应用拆分多个独立脚本
- 快速做小实验
- 按宿主分开维护逻辑
- 一些不需要完整项目结构的轻量场景
4. 日志与调试能力
JSXHook 内置了比较完整的调试能力,包括:
- 运行日志页面
- 悬浮日志窗口
- 最近状态 / Hook 状态查看
- 错误追踪与 ErrorTrace 输出
- Probe 线索与最近 Hook 状态提示
这使得“改代码 -> 启动宿主 -> 看日志 -> 继续修”形成了比较顺手的闭环。
5. 内置 HTTP 服务
脚本里可以直接开启 httpServer,用于:
- 对外提供简单接口
- 做本地调试桥接
- 让其他工具调用模块能力
- 快速把脚本能力变成接口服务
6. 内置 MCP 服务
JSXHook 既支持脚本内自己启动 mcpServer,也支持主程序内置工作区 MCP。
这意味着它不仅能“自己 Hook”,还可以:
- 被 AI 工具直接接入
- 让 AI 读取和修改 JSXHook 项目代码
- 让 AI 启动宿主、读取日志、查看 Hook 状态
- 形成自动化调试闭环
7. 独立模块打包
JSXHook 支持把项目直接打包成一个独立模块应用。
可配置项包括:
- 应用名称
- 包名
- 版本名
- 版本号
- 图标
- 是否包含应用 UI
- 是否包含日志页面
- 签名方式
这样就能把实验项目直接变成交付给用户的成品模块。
8. 远程更新能力
打包后的独立模块支持接入远程更新系统,可实现:
- 启动时自动检查版本
- 版本号区域手动检查更新
- 模块内弹出更新提示
- 宿主应用内提示发现新版本
- 跳转模块界面完成更新
对于需要长期维护和发布给用户的模块,这一项非常实用。
已打包发布的成品模块
| 模块名称 | 版本 | 目标应用 | 简介 | 状态 |
|---|---|---|---|---|
| 待补充 | 待补充 | 待补充 | 待补充 | 开发中 / 已发布 |
模块开发文档
一、开发前准备
1. 基础环境
- 已安装 JSXHook 主程序
- 已启用的 Xposed / LSPosed 框架
- 已授予目标应用作用域
二、项目结构
一个典型项目通常包含:
project = {
name: "项目名",
description: "",
author: "",
icon: "icon.png",
launcher: "com.example.app",
scope: ["com.example.app"]
};
主文件结构通常是:
init.js:项目配置main.js:主入口逻辑lib/*.js:拆分出的工具模块ui/*.js:可选的 UI 或辅助逻辑模块
init.js 的作用
init.js 负责描述项目本身,而不是主要业务逻辑。常见字段:
name:项目名description:项目描述author:作者icon:图标launcher:宿主启动包名scope:作用域列表
main.js 的作用
main.js 负责真正的 Hook 和运行逻辑。大多数模块的主要代码都应该写在这里,或者在这里再 require() 其他模块。
三、基础 Hook 写法
1. 普通方法 Hook
hook({
class: "com.example.Target",
classloader: lpparam.classLoader,
method: "targetMethod",
params: ["java.lang.String", "int"],
before(it) {
log("before", JSON.stringify(it.args));
},
after(it) {
log("after", String(it.result));
}
});
适用于:
- 观察参数
- 观察返回值
- 做行为记录
- 小范围修改逻辑
2. 替换方法实现
replace({
class: "com.example.Target",
classloader: lpparam.classLoader,
method: "isVip",
params: [],
replace(it) {
return true;
}
});
适用于:
- 强行改返回值
- 跳过原逻辑
- 做简单功能解锁
3. Hook 全部重载
hookAll({
class: "com.example.Target",
classloader: lpparam.classLoader,
method: "login",
before(it) {
log("login overload hit");
}
});
适用于:
- 方法重载很多
- 还没完全确定参数签名
- 想快速确认某个方法是否被调用
4. Hook 构造函数
hookctor({
class: "com.example.Target",
classloader: lpparam.classLoader,
params: ["android.content.Context"],
after(it) {
log("constructor called");
}
});
适用于:
- 观察对象创建
- 拿关键实例
- 初始化时注入逻辑
四、运行时可用能力
JSXHook 脚本运行时常见可用对象包括:
lpparamclassLoaderXposedHelpersXposedBridgeDexFinderXpHelperactivitycontext
常见可用函数包括:
log(...)print(...)console.log/info/warn/error(...)imports(...)importClass(...)findClass(...)callMethod(...)callStaticMethod(...)invoke(...)this["new"](...)loadDex(...)openDexKit(...)require(...)
一个很重要的点
大多数 Hook 场景中,类查找建议优先写:
classloader: lpparam.classLoader
因为很多目标类并不在宿主默认 ClassLoader 之外乱飘,直接显式指定更稳。
五、模块拆分与 require()
当逻辑开始变复杂时,不建议把所有内容堆在 main.js 里。
推荐写法
main.js
const helper = require("lib/helper");
helper.run();
lib/helper.js
function run() {
log("helper running");
}
module.exports = {
run
};
注意事项
require()是项目内模块加载,不是 Node.js 模块系统- 不要写
require("npm-package") module.exports只适合写在被引入的模块文件里- 不要在顶层
main.js或init.js里滥用module.exports
六、进程过滤
有些目标应用是多进程的,如果代码没生效,可能不是代码错了,而是跑错了进程。
JSXHook 支持通过注释声明进程过滤:
//@process=main
也支持:
//@process=all//@process=com.tencent.mobileqq:MSF//@process=com.tencent.mobileqq,com.tencent.mobileqq:MSF
七、HTTP 与 MCP 扩展能力
1. http
脚本可直接发起网络请求:
http.get(...)http.post(...)http.postJson(...)
适合:
- 调接口
- 获取配置
- 接更新服务
- 请求自己的后端
2. httpServer
脚本里可以直接开本地 HTTP 服务:
- 对外暴露能力
- 本地调试接口
- 被第三方工具调用
3. mcpServer
脚本里还能直接开启 MCP 服务,让其他 AI 工具或客户端接入。
适合:
- 暴露调试能力
- 暴露脚本能力
- 让 AI 自动调用工具完成修改、调试、读取日志等操作
如果你想做“Auto.js MCP 工具”“本地逆向调试 MCP 工具”“脚本远程控制 MCP 工具”,JSXHook 这套能力会非常合适。
八、独立模块打包
当项目调试稳定后,可以直接通过 JSXHook 打包成独立模块应用。
常见打包配置
- App 名称
- 包名
- 版本名称
- 版本号
- 图标
- 是否包含 UI
- 是否包含日志页面
- 签名方式
九、远程更新
独立模块可接入远程更新系统。
- 启动自动检查更新
- 模块界面检查更新
- 宿主应用内提醒有新版本
- 引导用户进入模块完成升级
结语
JSXHook 并不是为了替代传统 Android 模块开发,而是为了让“逆向调试、Hook 实验、项目管理、模块打包、AI 联动”这几件事变得更顺手。
如果你只想快速验证一个想法,它可以很轻。
如果你想把一个 Hook 项目长期维护并交付出去,它也可以很完整。
它的价值不只是“能 Hook”,而是尽量让你从一个想法开始,最后真的做出一个可调试、可维护、可发布的模块。