JSXHook模块开发文档

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(...) 普通方法 Hook
  • replace(...) 替换方法返回
  • 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 脚本运行时常见可用对象包括:

  • lpparam
  • classLoader
  • XposedHelpers
  • XposedBridge
  • DexFinder
  • XpHelper
  • activity
  • context

常见可用函数包括:

  • 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.jsinit.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”,而是尽量让你从一个想法开始,最后真的做出一个可调试、可维护、可发布的模块。



作 者:道无涯
来 源:道无涯博客
链 接: https://www.daowuya.love/jsxhook/
版 权 声 明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。文章版权归作者所有,未经允许请勿转载!


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇