login-protocol-real.md 8.1 KB

996box 登录链路真实协议(从解密 SAZ 实测提取)

来源:登录过程-https解密.saz(778 个解密会话,用户 real longwu988 账号密码登录全程) 本文档 100% 实测,取代此前所有猜测。

完整登录链(按时间序)

1. POST api.jiyuhz.cn/auth/v3/login/safe/byPwd   ← 密码登录(第1次,无验证码 → 101000 需行为校验)
2. (网易易盾行为验证 + Geetest 滑块)
3. POST api.jiyuhz.cn/auth/v3/login/safe/byPwd   ← 密码登录(第2次,带 _captcha_ → 200 成功!)
4. POST user-api.996hezi.com/v1/WyAnticheat/riskCheck  ← 网易反作弊
5. GET  pc-api.996hezi.com/box/v1/getTodayOpen?gameId=206923  ← 今日开服列表
6. POST pc-api.996hezi.com/v1/homeapi/gameindex/EnterGameClient  ← 启动游戏!
7. GET  list-box.dhsf.xqhuyu.com/modlist/modlist_110585.txt  ← 游戏配置
8. GET  list-box.dhsf.xqhuyu.com/box_serverlist/206923.txt   ← 服务器列表
9. GET  ws.996hezi.com/ws/pushMessage (WebSocket)            ← 盒子推送

1. 密码登录(核心接口)

请求

POST https://api.jiyuhz.cn/auth/v3/login/safe/byPwd
Content-Type: application/json;charset=UTF-8
Origin: https://pc.hzwlan.com
Referer: https://pc.hzwlan.com/
User-Agent: Mozilla/5.0 ... 996Box/5.1.1 Chrome/108 ... Electron/22.3.4 ...
X-BOX-AUTHORIZATION: BOXAPP-SHA256 NONCE=<32位大写随机>;TIMESTAMP=<ms>;SIGNATURE=<sha256hex>
appv: 5.1.1.9007
box-agent: device:pc;channel:;appv:5.1.1.9007;deviceOs:win32 10.0.22631 32bit;deviceId:<MAC>;deviceBrand:;deviceModel:;netType:;gameOwner:;isSimulator:false;
device: pc
deviceId: <MAC地址,如 00:15:5d:0a:04:00>

Body(JSON)

{
  "loginInfo": "<加密hex串,含账号密码,342字符>",  // 加密算法待逆向(AES/RSA,从 996box Electron JS 里找)
  "channel_id": "",
  "game_id": "",
  "inviter_uid": "",
  "needConfirmLogin": true,
  "_captcha_": "<base64 JSON:captchaId + captchaOutput + genTime + lotNumber + passToken>"  // 第2次必带
}

第一次调用(无 _captcha_)→ 需要行为校验

{"code":101000,"msg":"需要进行行为校验","data":null,"success":false}

第二次调用(带 Geetest _captcha_)→ 成功

{
  "code": 200,
  "msg": "登录成功",
  "data": {
    "token": "eyJ0eXAiOiJKV1Qi...",  // JWT(HS256, iss=996box, sub=uid, 30天有效)
    "loginCertificate": {
      "certificateTime": 1789459942,
      "certificate": "000000.62f7cc..."  // 登录证书(后续进游戏用)
    },
    "userInfo": {
      "id": 1186115037,          // uid
      "account": "longwu988",
      "phone": "177****6757",
      "nick_name": "龙武",
      "enterGame": true
    }
  },
  "success": true
}

JWT token 结构(HS256)

{
  "token_version": "V2",
  "app_channel": "9007",
  "sub": 1186115037,              // uid
  "device_id": "00:15:5d:0a:04:00",
  "app_version": "5.1.1",
  "login_time": 1789459942,
  "iss": "996box",
  "exp": 1792051942,              // 30天后
  "device": "pc",
  "iat": 1789459942,
  "jti": "rqDLsPwnHKiQEIuF5"
}

2. X-BOX-AUTHORIZATION 签名(所有 996box/996hezi API 通用)

格式:

BOXAPP-SHA256 NONCE=<32位大写字母数字>;TIMESTAMP=<毫秒时间戳>;SIGNATURE=<64位hex>

待逆向:SIGNATURE = SHA256(?) 的具体拼接方式(nonce+timestamp+secret?)。 线索:sdkAppkey: yAeOlBTx4JQg + sdkAppid: GAjWNTqNpOVx(env.json / EnterGameClient body 里有 appid)。 推测签名材料含 appkey + nonce + timestamp + body。

3. 今日开服列表(这就是"今天多少个区"接口!)

GET https://pc-api.996hezi.com/box/v1/getTodayOpen?gameId=206923
token: <JWT>
+ 同上一套 X-BOX-AUTHORIZATION 头

响应(明文 UTF-8):

{"code":200,"msg":"操作成功","data":[
  {"server_name":"霸业10服","serverid":14414736,"open_time":1789401600,
   "section":" 00:00","state":1,"box_game_id":206923,"main_serverid":"14414736"},
  {"server_name":"霸业11服","serverid":14414737,"section":" 07:00",...},
  {"server_name":"霸业12服","serverid":14414738,"section":" 10:00",...},
  ...
]}

4. 启动游戏(点击【启动】按钮)

POST https://pc-api.996hezi.com/v1/homeapi/gameindex/EnterGameClient
token: <JWT>
Content-Type: application/json

{
  "box_game_id": 206923,
  "serverid": 14403981,       // 选中的服
  "device_info": "{\"type\":\"pc\",\"model\":\"pc\",\"os\":\"Win10\",\"width\":1920,\"height\":1032,\"lang\":\"zh-CN\",\"id\":\"43b2d8df251be893bf57a67560b1e74b\",\"net_type\":\"unknown\",\"mac\":\"00:15:5d:0a:04:00\",\"ua\":\"Mozilla...\"}",
  "appid": "GAjWNTqNpOVx"
}

响应(gzip)包含 download_info(游戏名/描述)— cq2.exe 由 Electron 本地拉起,不走此 HTTP。

5. 网关 TCP(cq2.exe 直连,非 HTTP)

  • 域名:gfgame.dhsf.xqhuyu.com,代理端口 12000(serverlist x 字段)
  • TCP 帧格式:24B 头明文 + body,登录链 CS 2001 前调 SetNetMessageTypeSData(0)
  • 帧头布局(LoginProxy.lua 实证):msg_id/recog/param1/param2/param3/len 全 little-endian int32
  • CS 2001 body:account/Encode6BitBuf(password)/Encode6BitBuf(channelID)/otpType/otpCode
  • 服务器仍丢弃我们的明文帧 → C++ netClient 帧加密仍是硬墙(需 Frida hook cq2.exe)

6. 修正 SDK 需要改的关键认知

项 旧认知(错) 实测真相
登录域名 api.996hezi.com api.jiyuhz.cn(登录页 pc.hzwlan.com)
登录端点 /userApi/v1/Login/account /auth/v3/login/safe/byPwd(JSON body)
认证头 sign 参数 X-BOX-AUTHORIZATION: BOXAPP-SHA256 ... 请求头
密码格式 明文/Encode6BitBuf loginInfo 加密 hex(算法在 Electron JS 里,待逆向)
验证码 Geetest 独立 网易易盾(行为) + Geetest v4 滑块(captcha 字段)
今日开服 猜的 /Zone/list /box/v1/getTodayOpen?gameId=
启动游戏 猜的 /Game/launch /v1/homeapi/gameindex/EnterGameClient
token 40字符 JWT (HS256, 30天有效, header token:)

7. 加密与签名算法(已从 app.asar 源码完全破解)

7.1 loginInfo 加密 = RSA-PKCS1v1.5 + base64url

// 源码位置: src/browserRender/static/js/main.d44f9b41.chunk.js (offset ~63213)
var t = new JSEncrypt();  // rt.a = jsencrypt 库
t.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAjCQvqNPnOZm6GVDqeOb5S2pJtbN3FMZ8\n vddW3B2f3jB0mf7vd1B+yjjfex2A5XVxr4YwAY/w4d1/m3v3Bn/qgAnLMKnpjeEwxQU3cU81eXAam4fMB+\n nlmC291quIuC0qFFL8YgT2bDjARsMRYbmKd6LTc58sKYeJD2MvkkOdKwIDAQAB");
loginInfo = t.encrypt(JSON.stringify({username, password}))
    .replace(/\+/g, "-")   // + -> -
    .replace(/\//g, "_");  // / -> _
  • 明文是 JSON.stringify({username, password})(注意:等到的 hex 长度和抓包一致——抓包里 342 字符是 base64url 后的 RSA 2048 输出)
  • ⚠️ 抓包里 loginInfo 是 hex 风格(无 - _),说明服务器端可能同时接受两种;以实测为准

7.2 X-BOX-AUTHORIZATION 签名 = HMAC-SHA256(签名串 9 行)

// 源码位置: src/bridge/mainPreload.js (E2SignCer 函数)
SIGN_KEY = 'BB0AAAC906FC4B7CADB116A213D46689'   // 32 字节密钥(硬编码)

NONCE  = 32 位随机大写字母数字
rqtime = Date.now() 毫秒

value = [
  method,             // "POST" / "GET"
  url_with_params,    // 完整 URL(含 query string)
  rqtime,             // 毫秒时间戳
  nonce,              // 32位随机
  deviceType,         // "pc"
  deviceId,           // MAC "00:15:5d:0a:04:00"
  appv,               // "5.1.1.9007"
  token,              // JWT 或空字符串
  navigator.userAgent,
  (body_json 或 "\n")
].join("\n") + "\n"

signature = HMAC_SHA256(value, SIGN_KEY).hex()
header = `BOXAPP-SHA256 NONCE=${nonce};TIMESTAMP=${rqtime};SIGNATURE=${signature}`

7.3 其他 HTTP 头(每次请求必带)

appv: 5.1.1.9007
box-agent: device:pc;channel:;appv:5.1.1.9007;deviceOs:win32 10.0.22631 32bit;deviceId:<MAC>;deviceBrand:;deviceModel:;netType:;gameOwner:;isSimulator:false;
device: pc
deviceId: <MAC>
token: <JWT>          # 登录后的接口带

8. 修正 SDK 需要改的关键认知