README.md 5.9 KB

996传奇盒子 反编译工程

从 D:\ProgramFiles\996box\ 安装目录逆向出来的完整工程。 所有高价值信息(URL、密钥、版本、签名证书等)见 SUMMARY.md。

目录结构

D:\传奇\996box-decompiled\
├── README.md                    本文件
├── SUMMARY.md                   高价值信息汇总
├── src-app/                     app.asar 完整解包 (业务代码 + 资源)
│   ├── package.json
│   ├── src/
│   │   ├── index.js                 ★ 主进程入口, 完整可读
│   │   ├── proxyWindow.js
│   │   ├── spawnLauncher.js
│   │   ├── render/*.js              8 个 preload 脚本 (明文)
│   │   ├── browserRender/*.js       6 个 BrowserView preload
│   │   ├── offline/*.html           12 个离线兜底页
│   │   ├── localpages/              内置 React 静态资源
│   │   ├── assets/                  图标 + axios + crypto-js
│   │   ├── libs/*.jsc               6 个核心库字节码
│   │   ├── bridge/*.jsc             4 个 IPC 桥字节码
│   │   ├── static/*.jsc             2 个静态配置字节码
│   │   ├── workers/*.jsc            1 个 Worker 字节码
│   │   ├── message.html
│   │   ├── xmode.html
│   │   └── versionLF.json
│   └── (已移除 node_modules, 占 90% 体积但无业务价值)
└── jsc-extract/                  .jsc 字节码反编译产物
    ├── extract-strings.js            字符串提取脚本
    └── strings/                      13 个 .jsc 的字符串提取结果
        ├── src__static__config.md    ★ 包含 16 个真实 URL + 8 个 key
        ├── src__libs__urlCreator.md
        ├── src__libs__tools.md
        ├── src__libs__Buryingpoint.md
        ├── src__libs__request.md
        ├── src__libs__encrypt.md
        ├── src__libs__titlebarConfig.md
        ├── src__bridge__core.md
        ├── src__bridge__main.md
        ├── src__bridge__common.md
        ├── src__bridge__server.md
        ├── src__static__remark.md
        └── src__workers__dbWorker.md

已知限制

1. 996box.exe 本身无法"反编译"

996box.exe (127MB) 是原版 Electron 22.3.4 运行时 (Chromium 108 + V8 10.8 + Node 16.17.1 ABI)。 里面没有任何定制业务代码 — 业务全在 resources/app.asar 里。所以"反编译 exe"没有意义,反编译对象应该是 app.asar。

2. 12 个 .jsc 字节码无法还原为可读 JS

已尝试: | 方案 | 结果 | |---|---| | bytenode 1.6.0 + Node 24 (V8 12.x) | ❌ cachedDataRejected | | bytenode 1.6.0 + Node 18.20.4 (V8 10.2) | ❌ cachedDataRejected | | bytenode 1.6.0 + Electron 22.3.4 (V8 10.8.168) | ❌ cachedDataRejected | | bytenode 1.3.6 + Electron 22.3.4 | ❌ cachedDataRejected | | 手动 patch V8 字节码 0-32 字节 header | ❌ 全部 rejected, hsize=16 时 V8 直接崩溃 | | brotli/gzip 解压 0xa4 0x05 wrapper | ❌ 不是压缩格式 |

根因 (技术细节):

  1. 作者用了自定义 .jsc 格式: 文件头 0xa4 0x05 不是 bytenode 标准格式(1.5+ 写 0xa9, 1.3.x 直接写无 wrapper)。作者用 bytenode 编译后又加了 wrapper,或用了 bytenode fork。
  2. V8 字节码硬版本绑定: 即使 V8 版本号完全一致,字节码的 versionHash 还依赖编译时的 V8 标志/RandomNumberGenerator 状态/snapshot checksum, V8 硬错拒绝。
  3. urlCreator.jsc 的字符串被额外混淆: 即便能加载,也会看到 ֤샞ᘢ尮ӝ 这种乱码 (XOR 加密),需要运行 decode 函数才能解。

实际可用的工作:

  • ✅ 字符串提取 (明文 URL/密钥/常量): 已完成,见 jsc-extract/strings/*.md
  • ❌ 还原控制流/逻辑: 不可行
  • ❌ 还原混淆字符串: 需要运行 urlCreator 模块,需 Frida 动态 hook

3. 已清理的临时文件

反编译过程中产生的临时文件 (bytenode 0.x~1.6 全部版本 tarball、各类 probe 脚本、Node 18 / Electron 22 下载) 已清理。 如需重新尝试 .jsc 加载,需要:

  • Node 18.20.4 (自带 V8 10.2)
  • Electron 22.3.4 (自带 V8 10.8.168)
  • bytenode 1.3.6 / 1.6.0 任一
  • 仍不会成功,作者 wrapper 是核心障碍

如何重新生成 .jsc 字符串提取

cd D:\传奇\996box-decompiled
node jsc-extract\extract-strings.js

输入: src-app/src/**/*.jsc (13 个文件) 输出: jsc-extract/strings/*.md (13 个文件,每文件 500~90000 字符)

验证 EXE 元数据

(Get-Item D:\ProgramFiles\996box\996box.exe).VersionInfo
Get-AuthenticodeSignature D:\ProgramFiles\996box\996box.exe

推荐后续工作

  1. Frida hook 提取 urlCreator 真实 URL

    • 启动 996box.exe, attach V8 Inspector
    • 在 urlCreator.createTextUrl 函数入口设置断点, 打印参数
    • 完整还原 5 个环境 (pro/pre/dev/local/custom) 的主域名 + 全部子路径
  2. 公网 API 密钥安全审计

    • 提取的 8 个 MD5-like key 全部硬编码在客户端
    • 用 a3e031d8b98743c69fc98d34f12fef08 试着签一次 pc-api.996box.com 的请求
    • 如果服务端接受 → 整个 API 网关无安全可言
    • 如果拒绝 → 服务端有补充校验(更可能)
  3. IPC API 表面梳理

    • src-app/src/render/*.js 8 个 preload 文件已全部明文
    • 与 src-app/src/index.js 的 ipcMain.on(...) 对照
    • 能完整还原 Electron 前后端 IPC 协议

法律声明

本工程仅供安全研究/学习目的使用。提取出来的密钥、URL、签名证书信息不得用于:

  • 绕过 996传奇盒子 的任何付费/认证机制
  • 攻击闲趣互娱公司的服务器
  • 任何违反中国《刑法》第 285、286 条 (非法获取计算机信息系统数据、非法控制计算机信息系统) 的行为

代码中明文出现的硬编码 key 和 URL 反映的是客户端安全设计缺陷 — 任何客户端 key 都不应被视为"机密"。