76 lines
4.5 KiB
Markdown
76 lines
4.5 KiB
Markdown
# 虎牙纯Python全自动登录 — 总结与交接(2026-08-25)
|
||
|
||
## 一、已达成 ✅(全部实测验证)
|
||
|
||
### 核心链路(可信账号,零设备零手动)
|
||
```
|
||
账号+密码
|
||
→ SHA1
|
||
→ build_password_login_wup() 组TAF包 (servant=huyaudbwebui, func=hypasswordLogin)
|
||
→ POST https://wup.huya.com [body=原始TAF字节, CT=application/multipart-formdata]
|
||
→ HTTP 200 → 解析响应bean → 新鲜cred(114B, 0a开头, 每次登录轮换)
|
||
→ cert_forge.build_p1(fingerprint + 新nonce + cred) → forge_cert(key_idx=0x20)
|
||
→ 扫码绑定流 getQrId→scanQrPicNotify→bindQrLoginUser→tryQrLogin
|
||
→ POST /web/cookie/verify {"appId":5002} ← 关键最后一步!
|
||
→ 全套网页Cookie: udb_cred/yyuid/udb_uid/udb_passport/username/udb_biztoken...
|
||
```
|
||
|
||
### 一键工具
|
||
| 命令 | 功能 |
|
||
|---|---|
|
||
| `.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信封规则(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/
|
||
STRUCT_BEGIN=10(0xa)/STRUCT_END=11(0xb)/ZERO=12/SIMPLE_LIST=13。
|
||
4. **udb消息载荷=JSON命名键**(非二进制JCE),msgId: LoginPassport=0x1001,
|
||
Response=0x2001; wire双体系: 0x0Bxxxxxx业务推送族 vs udb裸id。
|
||
5. **证书算法**=标准AES-128-ECB;P1=[01 04]["5008"][u16le20+20B nonce][u16le40+40B指纹][u16le114+cred];
|
||
cert=b64([0x0C][key_idx][AES128(key16,zeropad(P1))]);钥表@rodata 0x1bc810(AESkeyMgr注册)。
|
||
6. **存储侧**: cred0文件=AES-128-ECB("HuyaUdb192837465")加密的JSON,
|
||
cred路径 /loginHistory[0]/apploginData/cred。
|
||
|
||
## 三、新账号风控(safe_auth)——已实现 ✅(2026-08-25夜)
|
||
|
||
### 定性与实现
|
||
- App渠道(WUP)对新/异地账号返回 `aq.huya.com/p/safe_auth/pt_auth.html?param=xxx`
|
||
→ **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. 数小时前老信封复用边界未单独验证(E-B)——不影响主流程, 失败则hook重抓即可
|
||
2. 完全零设备跨账号需逆向nonce签发机制, 收益低(运营模型本就要求每号设备首登一次)
|
||
|
||
## 四、多账号运营模型
|
||
```
|
||
新账号首次: 手机App正常登录一次(建设备信任, 若遇滑块人工滑一下)
|
||
+ 设备上跑 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, envelope_rules2.json等)
|
||
- 协议细节全记录: docs/虎牙hyCred签发-侦察笔记.md (按Round追加)
|