QQ(Android)SSO 协议抓包分析工具 —— 基于 Xposed / LSPosed 的模块。
本项目是 callng/QQHook(原作者 fuqiuluo)的fork。
fork 之后做了一次整体重构,抓包对象从「TEA / TLV / MD5 / 完整包」收敛为 SSO 收发包, 交互与展示重做,并修掉了一批解析上的错误:
- 界面重写:Compose + Material 3,参考 Reqable 的交互;按
seq把同一次请求的 发送包与回包合并成「一次交互」卡片,显示耗时、大小与状态。 - 协议自动识别:protobuf / JCE / TRPC 信封 / 纯文本 / gzip 自动判定,不再需要手动选类型。
- 长度前缀自动探测:不硬编码宽度,枚举 1 / 2 / 4 字节 × 大小端,只有数值与包长自洽 且解析成功才采用该候选。
- 解析器重写:修正 JCE 语义错误(STRUCT 包裹、MAP、LIST、类型宽度), protobuf 侧补齐嵌套消息与 tag 扩展;两者都能解时按结构特征打分择优。
- 详情页 JSON 树:结构视图输出
{tag: value}形式,嵌套自动展开、可折叠; 复制 / 分享直接得到标准 JSON,未解析的包退回 hex,不丢数据。 - 文件投递通道:MIUI 等 ROM 会拦截 QQ 进程唤醒本应用的 ContentProvider
(WakePathChecker),导致数据全丢。改为 hook 端写 QQ 自己的
files/qqhook_inbox/(JSON Lines),App 端用 root +nsenter进入 QQ 的 mount namespace 轮询读取。 未受限的设备仍保留 ContentProvider 通道。 - 历史会话:一次抓包 = 一个会话,落盘为
files/captures/<开始时间戳>.json, 可在「历史」页回看;浏览历史时新包不会混入,也不会覆盖原始记录。 - 悬浮控制条:在 QQ 之上显示开始 / 暂停,可拖动。
- 导出:列表长按多选,导出到
Download/QQHook/并拉起系统分享面板; 写文件失败时退回剪贴板。 - 单元测试:解析器、收发合并等纯逻辑有覆盖(
app/src/test)。 - CI:推送
v*标签自动构建并发布 Release,也可手动触发。
- 抓取 QQ 的 SSO 收发包(
send/receive),记录cmd、seq、uin、msgCookie、原始 buffer - 较新版本 QQ 通过 MSF 内核层(
MSFKernel)hook 收发;旧版本走CodecWarpper - 抓包列表支持搜索(
cmd/seq/uin)、左滑删除、长按多选 - 详情页左右对照「发送 / 接收」,结构树与 HEX 双视图
上游的 HTTP 推送通道代码仍在(
PrefsManager.KEY_PUSH_API),但设置界面已移除入口, 默认不会向任何服务端发送数据。
模块作用域:com.tencent.mobileqq、com.tencent.tim、com.tencent.qqlite。
| 项目 | 要求 |
|---|---|
| 模块框架 | LSPosed(Xposed API 82) |
| 系统 | Android 8.1+(minSdk 27) |
| 架构 | arm64-v8a |
| root | 读取数据需要 root(文件投递通道依赖 su + nsenter) |
没有 root 时,只有未被 ROM 拦截 ContentProvider 的设备还能收到数据; 大多数国产 ROM(MIUI / HyperOS 等)会拦截,此时列表为空。
- 在 LSPosed 中启用 TXHook,作用域勾选 QQ,然后强制停止并重启 QQ。
- 打开 TXHook 本体(不运行模块本体收不到任何数据),同意提示后进入主界面。
- 点右下角开始抓包,再回到 QQ 正常使用,包会实时出现在列表里。
- 点卡片看详情;长按进入多选,可批量导出。
- 暂停抓包时当前会话自动落盘到「历史」。
不抓包时请关闭模块或暂停抓包,hook 常驻会带来一定性能开销。
依赖 JDK 21、Android SDK Platform 37、Build-Tools 36.1.0。
git clone --recursive https://github.com/weq-devs/qqhook
cd qqhook
# 子模块 libs/qqstub 提供 QQ 侧的编译期 stub(compileOnly,不会打进 APK)
# 如果克隆时漏了 --recursive:
git submodule update --init --recursive
./gradlew :app:assembleDebug产物在 app/build/outputs/apk/debug/。
Release 签名通过环境变量提供,缺省则构建未签名的 APK:
export KEYSTORE_PATH=../keystore.jks
export KEYSTORE_PASSWORD=...
export KEY_ALIAS=...
export KEY_PASSWORD=...
./gradlew :app:assembleRelease版本号由 git 推导:v3.3.0-<提交数>-<短 hash>,versionCode 即提交数。
跑单元测试:
./gradlew :app:testDebugUnitTest- 只展示 SSO 收发;TEA / TLV / MD5 等旧 action 已不再抓取与展示。
- QQ 版本适配随官方更新变化,不保证所有版本可用;新版本可能只能拿到内层包数据。
- 历史记录里单条 buffer 超过 2 MiB 会被截断,避免大文件包撑爆存储。
- 无 root 时功能严重受限(见上文)。
本项目沿用上游的 GPL-3.0 许可证,详见 LICENSE。 修改与分发需同样以 GPL-3.0 开源并保留原作者版权声明。
本工具仅供学习与研究使用。抓包数据可能包含账号、消息等个人隐私, 请勿传播或用于任何非法用途;使用需遵守当地法律法规。因使用本工具产生的一切后果由使用者自行承担。