endpoints-discovered.md 4.5 KB

996box / cq2 真实端点探查结果(2026-09-15 实测)

来源:env.json 解码、modlist/serverlist 拉取、DNS/TCP 探测、Fiddler SAZ 分析 本文档取代此前所有"猜测的"端点。以下均为实测确认的事实。

1. 数据链路(真实流程)

996box 客户端(Electron)
  └─ 登录后写 env.json(含 uid/token/signkey/gameid/serverId)
       ├─ modlist:  https://list-box.dhsf.xqhuyu.com/modlist/modlist_{channel}.txt
       │            → 明文 JSON,含 game_signkey + srvlist URL + 资源 CDN
       ├─ srvlist:  https://list-box.dhsf.xqhuyu.com/serverlist/{channel}/serverlist.txt
       │            → 传输加密(isEncrypt=1),但客户端缓存已解密:
       │              D:\ProgramFiles\996box\GameBoxDownload\1\cq\cache_{gameid}\ResServerlist.txt_{gameid}
       │              ★ 明文 JSON,直接可读!
       └─ box列表:  https://list-box.dhsf.xqhuyu.com/box_serverlist/{gameid}.txt(明文)

2. 玖扬复古176(gameid=206923, channel=110585)

modlist 关键字段(实测拉取)

  • game_signkey: 47f67f306cbdffa3a6606292c1a3fa01(996SDK v2 HMAC-SHA1 签名密钥)
  • srvlist: https://list-box.dhsf.xqhuyu.com/serverlist/110585/serverlist.txt
  • npConfigName: 996CN(GameGuard 反外挂)

serverlist(缓存明文,725 个服)

字段映射(缩写 → 含义): | 字段 | 含义 | |---|---| | d | serverId | | p | TCP 端口(8001/8021/8041/8061/8081) | | s | 状态(1=开服中,2=维护/满,5=其他) | | t | 分组 tag(1000514=玖扬复古176,共 26 组) | | i | 网关 host(可选;缺省 gfgame.dhsf.xqhuyu.com) | | x | 代理端口(12000,代理模式登录用) | | n | 服务器名("玖扬01服"...) | | u | 版本(3.40.9) |

玖扬复古176 组:59 个服(今天开的区),主服 14301060(玖扬战区)。 用户上次玩的服务器:14414738(霸业12服,今日推荐组,port 8021)。

网关(实测 DNS + TCP)

  • gfgame.dhsf.xqhuyu.com → 47.118.169.147 / .153 / 172.233
  • 端口 8001/8021/8041/8061/8081:公网 TCP 超时(仅 CDN/内部可达?或需特殊握手)
  • 端口 12000:OPEN(代理端口模式)

3. TCP 登录(CS 2001)实测结论

向 gfgame.dhsf.xqhuyu.com:12000 发送明文 CS 2001 帧(含 Encode6BitBuf 编码的 token):

  • 服务器立即断开连接(0 字节回复)
  • 尝试过:明文帧 / Encode6BitBuf 密码 / 3 个 IP 直连 / sequence 表(engine-game.dhsf.996db.cn/{md5(sid)}.txt → 404)

结论:TCP 帧必须带 C++ netClient 层的加密(spec §6.2 风险确认)。 协议文档 cq2-01 §2 原文:"加密在 C++ netClient 内部…具体算法未逆向,待动态验证"。 明文帧会被网关静默丢弃。这是纯 Python SDK 的硬边界。

4. HTTP API 实测结论

api.996hezi.com 所有 /userApi/v1/* 端点返回 code=50001 参数非法:

  • 端点路径是猜测(占位符),真实路径未在抓包中出现过(两份 SAZ 的 HTTPS 都未解密)
  • signkey(env.json / modlist 双源确认)+ 996SDK v2 HMAC-SHA1 签名算法已实现(SDK sign_v2)
  • 签名算法可信,端点路径不可信

5. 对 SDK 的影响

模块 状态 说明
srvlist 读取 ✅ 改为读缓存文件 cache_{gameid}/ResServerlist.txt_{gameid} 明文 JSON,跳过加密下载
find_server ✅ 改用新数据源 59 个玖扬服全部可枚举(含 state/port/host)
网关连接 ✅ host 修正 gfgame.dhsf.xqhuyu.com:12000(代理模式)替代错误的 jycq-xxx
HTTP 登录 ⚠️ 端点未知 真实路径需解密 SAZ 或反编译 996box Electron(app.asar)
TCP 登录 ❌ 硬边界 帧加密算法在 cq2.exe C++ 层,未逆向;明文帧被丢弃

6. 下一步可行路径(按代价排序)

  1. 逆向 cq2.exe 帧加密(根治):用 Ghidra/IDA 看 netClient 的 SetNetMessageTypeSData,或 用 Frida hook cq2.exe 运行时 dump 加密前后的帧对照。工作量大但一劳永逸。
  2. 抓 996box 的 Electron HTTP 登录端点(绕开一半):Fiddler 解密失败因为 Electron 独立证书库; 改用 mitmproxy --set harden_tls=false + 给 Electron 加 --ignore-certificate-errors 启动参数。
  3. 客户端内存 hook(绕开加密):不模拟协议,而是 hook 真实 cq2.exe 收发的明文帧 (Frida 在 C++ netClient 的 send/recv 点上),SDK 变成"半客户端"驱动器。