feat(huya): wupData信封规则定论 - 原nonce必带/t3-cred一致/session不可动 + 交接文档更新
This commit is contained in:
@@ -324,3 +324,30 @@ App渠道(WUP)对新账号返回 pt_auth.html(aq.huya.com,param=加密token),
|
||||
= 与 core/huya/verification/solver.py 已实现的 udbrtt get3->verify3 闭环同源!
|
||||
(web渠道才是qr_auth需扫码; app渠道是滑块,可自动)
|
||||
待做: solver适配param上下文(aq页初始化udbrtt的方式), 验证通过后重发WUP登录即得cred。
|
||||
|
||||
## ★ 信封规则定论(v2紧凑窗口对照实验, 2026-08-25夜)
|
||||
|
||||
工具: tools/envelope_forge.py(TAF原位补丁) + scripts/probe_envelope_rules2.py。
|
||||
同一份新鲜信封(239s旧)在紧凑窗口内连续4次bind:
|
||||
|
||||
| 实验 | 操作 | 结果 | 结论 |
|
||||
|---|---|---|---|
|
||||
| X0 对照 | 原t3+信封原nonce换可信新cred铸证 | ✅ ok:true | 信封可复用, nonce无独立时效 |
|
||||
| X1 错配 | 原t3 + 新账号cred铸证 | ❌ 40020 | 服务端校验 cert.cred↔t3.uid 一致 |
|
||||
| X2 换号 | t3补丁成新uid + 新账号cred铸证 | ❌ 40020 | 仍有隐藏账号绑定 => 见下 |
|
||||
| X3 改session | 三处session一致随机化 | ❌ 100 SYS_ERROR | session被服务端实时校验, 不可动 |
|
||||
|
||||
X2根因分析: 信封内uid仅t3一处(BE@688, metaJSON里uid=0/associationId=0x0B000030
|
||||
为固定魔数); 补齐t3仍拒 => 最自洽解释: **证书nonce是SDK在"某账号登录态"下生成
|
||||
的账号绑定令牌**(服务端可凭nonce反查签发账号)。与d29290a终局"新nonce成功"不矛盾
|
||||
(那次同为可信账号自用)。
|
||||
|
||||
工程铁律(修正早前"短TTL"误判):
|
||||
1. 铸证必须【复用信封原证书的rnd/指纹/key_idx】, 仅替换cred字段 —— 纯随机nonce必40020;
|
||||
2. t3.uid 必须与 cert 内 cred 所属账号一致;
|
||||
3. session三处(iRequestId/metaJSON/v0尾4B)保持原值, 不可随机化;
|
||||
4. 同账号信封长期复用(X0@239s✅; 数小时前老信封E-B未单独验证但无失败证据);
|
||||
5. 跨账号 = 每号设备首登一次(hook_cert_keycap自动抓该号信封)后永久纯Python。
|
||||
|
||||
safe_auth闭环(app_login_flow.login_cred)已实现: pt_auth页JS逆向完成,
|
||||
urlParamMap原样回传+wupData空串可过; 新账号触发风控时自动解udbrtt滑块并重发WUP登录。
|
||||
|
||||
@@ -19,13 +19,16 @@
|
||||
| 命令 | 功能 |
|
||||
|---|---|
|
||||
| `.venv/bin/python tools/full_web_cookie.py <账号> <密码>` | 密码→全套网页Cookie(写 evidence/web_cookies_full.txt)|
|
||||
| `.venv/bin/python tools/full_auto_safe.py <账号> <密码>` | 同上, 且新账号safe_auth滑块自动过 |
|
||||
| `.venv/bin/python tools/full_auto_test.py <账号> <密码>` | 密码→cred→铸证→bind 全链路自测 |
|
||||
|
||||
## 二、关键知识(踩坑实录)
|
||||
|
||||
1. **wupData信封有服务端TTL**:bind用的一次性wupData(session/nonce)过期即40020
|
||||
CERT_BIZERR_CREATE_ERROR——与cred无关!刷新方法:设备跑 scripts/hook_cert_keycap.py
|
||||
(Java桥自动触发getQUrlData,无需人工)。
|
||||
1. **wupData信封规则(v2实验定论)**: ①铸证必须复用信封原证书的rnd/指纹/key_idx,
|
||||
仅替换cred字段——纯随机nonce必40020; ②t3.uid须与cert内cred账号一致;
|
||||
③session三处不可动(SYS_ERROR); ④同账号信封长期可复用;
|
||||
⑤跨账号=每号设备首登一次(hook_cert_keycap自动抓该号信封)后永久纯Python。
|
||||
补丁工具 tools/envelope_forge.py (patch_uid/patch_cert/patch_session)。
|
||||
2. **cred每次登录轮换**,第二字节是代次计数器(0x10/0x20/.../0x80循环);旧cred短期仍有效。
|
||||
3. **响应bean解析**:_wup_data值=SIMPLE_LIST(0x1d)+elem头(00)+JCE优化int长度;
|
||||
bean内 tag3(bytes)=cred。虎牙TAF类型表: STR1=6/STR4=7/MAP=8/LIST=9/
|
||||
@@ -37,33 +40,36 @@
|
||||
6. **存储侧**: cred0文件=AES-128-ECB("HuyaUdb192837465")加密的JSON,
|
||||
cred路径 /loginHistory[0]/apploginData/cred。
|
||||
|
||||
## 三、新账号风控(safe_auth)——当前唯一待完成项
|
||||
## 三、新账号风控(safe_auth)——已实现 ✅(2026-08-25夜)
|
||||
|
||||
### 定性(已实锤)
|
||||
### 定性与实现
|
||||
- App渠道(WUP)对新/异地账号返回 `aq.huya.com/p/safe_auth/pt_auth.html?param=xxx`
|
||||
- 页面走 **udbrtt.huya.com 滑块**(主chunk含slideBlock*字段)
|
||||
- **与 core/huya/verification/solver.py 已实现的 udbrtt get3→verify3 闭环同源**
|
||||
- web渠道(5002)才是qr_auth扫码型;App渠道=滑块=可自动
|
||||
→ **udbrtt.huya.com 滑块** → tools/app_login_flow.login_cred() 自动过验并重发WUP
|
||||
- pt_auth页JS逆向结论: urlParamMap=整个query原样回传; wupData纯web上下文空串可过;
|
||||
gurl取图ver:5, segment=UdbCipher.decrypt乱序还原表; vurl提交act=UdbCipher.encrypt;
|
||||
成功后服务端标记param风控会话通过, 直接重发同参WUP登录即放行。
|
||||
- qr_auth(扫码型)明确不可自动化 → QrAuthRequiredError 提示先真机首登建信任。
|
||||
|
||||
### 下会话开工清单
|
||||
1. 抓 pt_auth 页初始化 udbrtt 的请求(param如何传入get3):
|
||||
页面JS chunk: https://a.msstatic.com/huya/hd/h5/udb/js/safe_auth-pt_auth.1a35e28a.js
|
||||
2. 用 HuyaVerificationSolver 解滑块→verify3 提交(带param上下文)
|
||||
3. 重发 WUP 登录 → cred 直出 → 新账号也全自动
|
||||
4. 备选: 对比真机App解滑块时的请求(hook udbrtt 流量)加速逆向
|
||||
### 残留优化项(非阻塞)
|
||||
1. 数小时前老信封复用边界未单独验证(E-B)——不影响主流程, 失败则hook重抓即可
|
||||
2. 完全零设备跨账号需逆向nonce签发机制, 收益低(运营模型本就要求每号设备首登一次)
|
||||
|
||||
## 四、多账号运营模型
|
||||
```
|
||||
新账号首次: 手机App正常登录一次(建设备信任, 若遇滑块人工滑一下)
|
||||
之后永久: 密码 → full_web_cookie.py → 全套cookie 自动出
|
||||
+ 设备上跑 scripts/hook_cert_keycap.py 抓该号信封(cert_keycap.json)
|
||||
之后永久: 密码 → full_auto_safe.py → 全套cookie 自动出
|
||||
```
|
||||
|
||||
## 五、资产清单
|
||||
- 组包: tools/huya_wup_encoder.py (build_password_login_wup, 自检对金样本)
|
||||
- 登录流: tools/app_login_flow.py (login_cred/solve_safe_auth, safe_auth滑块闭环)
|
||||
- 铸证: tools/cert_forge.py (build_p1/forge_cert/parse_p1)
|
||||
- 信封: tools/envelope_forge.py (Envelope原位补丁uid/cert/session)
|
||||
- 绑定: scripts/probe_forge_cert_bind.py (QrRole四步流+cert替换)
|
||||
- 实验: scripts/probe_envelope_rules2.py (信封规则X0-X3紧凑对照)
|
||||
- 网页登录: core/huya/login.py (含滑块solver集成, web渠道)
|
||||
- 滑块: core/huya/verification/{solver,track}.py + core/geetest/v3_slide
|
||||
- 设备指纹: core/huya/device_fingerprint.py (get_huya_sdid)
|
||||
- 证据: evidence/* (金样本wup_passwordlogin_taf.bin等)
|
||||
- 证据: evidence/* (金样本wup_passwordlogin_taf.bin, envelope_rules2.json等)
|
||||
- 协议细节全记录: docs/虎牙hyCred签发-侦察笔记.md (按Round追加)
|
||||
|
||||
Reference in New Issue
Block a user