feat(huya): 登录路径OTP全链LIVE验证 + appSign≠getOtp结构性证伪 (R14)

- 决定性捕获(hook_huya_crypto.js全链): xxtea密钥=账号稳定uid(1199666914671)
  getkey(1,2)=MKDK/1,3=nskdI7, md5输入=k1+getkey, AES明文=[02][0c00][12B xxtea][7200][114B cred] 逐字节验证
- frida入口arg0读""为误读(SSO读取bug), 内部xxtea钩子为真值
- GOLD模式(正确uid)346k+J2 6.2M+I 6.3M+H 1.39M 全零 -> ~14.3M差分终态
- 结构性证明: appSign跨账号稳定 vs getOtp账号级(cred轮换) -> t1.t0≠OTP-mid QED
- 更正旧文档: in=uid非空串; 登录可带frida; 金样本uid=1199666914671
- 下一步: createWupRequestData@0x38dab0 appSign填充点反汇编
This commit is contained in:
yml2213
2026-08-29 05:35:34 +08:00
parent cb049a590b
commit 3abded94eb
6 changed files with 234 additions and 7 deletions
+48 -2
View File
@@ -921,7 +921,7 @@ hypasswordLogin/MsgLoginReq/LogLoginReq → mid 各异, tail 恒定 8b38f1 → a
- 真明文结构 (AES 密钥 312334e88d8c35cb 解密确认):
`[02][u16le 12][xxtea 12B][u16le 114][hyCred 114B][零垫]` — s5=完整 cred, xxtea 12B 精确一致
- OTP 全部语义锁定: AESkey=md5_char16(s4+getkey(cnt)) | plaintext=[02]∥cred(xxtea(nonce,key=in))∥cred(s5)
- 金样本六元组 (待命中): in="1471238907296"(或"0"), cnt 1..15, s3="5008", s4=K1, s5=hyCred(0a80ee...), nonce=st<<16, st=金样本时窗
- 金样本六元组 (待命中, 已正确化): **in = 账号稳定 uid = "1199666914671"** (hy_300023887; req-json 的 1471238907296 为会话号, 非 xxtea 密钥), cnt 1..15, s3="5008", s4=K1, s5=hyCred(0a80ee...), nonce=st<<16, st=金样本时窗 — GOLD 模式实测零命中
### 2) 差分覆盖统计 (全部 out[2:34] 正确窗口, 无命中)
| 模式 | 范围 | 次数 |
@@ -957,7 +957,7 @@ hypasswordLogin/MsgLoginReq/LogLoginReq → mid 各异, tail 恒定 8b38f1 → a
### 6) Frida 真机捕获实验 (结论)
- 真机唯一稳定注入通道 = spawn 挂起 + 只加载 `bypass_msaoaid_maps_art_callsite.js` (STATUS.md)
- 登录流程不可带 frida (msaoaidsec 标记上报); 普通启动也卡 splash 后被杀 (2 轮)
- **登录可带 frida (两阶段配方)** — 2026-08-29 实测 2 次真实密码登录成功, app 存活 170s+/多轮, OTP 全链捕获; "不可登录"旧结论作废 (msaoaidsec 标记上报风险仍存在, 仅限低风险实验)
- 捕获成功部分: 6 个导出钩子全部定位 (hyudb_otp_encrypt/0x32fa24, getOtp/0x26916c, setSafeDeviceId/0x26a2e0, getHdid/0x26a484, getkey/0x26a71c, md5_char16/0x32fb7c) — 偏移与 merged so 完全一致 => **lib 版本无漂移, 差分引擎可信**
- 工具: tools/frida/run_capture.py + hook_otp_capture.js
@@ -990,3 +990,49 @@ hypasswordLogin/MsgLoginReq/LogLoginReq → mid 各异, tail 恒定 8b38f1 → a
- 自愈运行器: tools/frida/run_capture.py (多轮自动重 spawn, 事件汇总单 JSONL, 进程死亡检测)
- 实测: 两阶段配方下 app 存活 >120s, crypto-otp/getHdid 全触发 (vs 旧三脚本配方 <60s 被杀)
- 已知残余: msaoaid solist 快照面 (G2-0019) 未掩; 登录流程仍不推荐带 frida (标记上报)
---
## §11.44 R14: 登录路径 OTP 全链 LIVE 验证 + appSign 结构性证伪 (2026-08-29)
### 1) 决定性捕获 (tools/frida + hook_huya_crypto.js 全链 hook, 用户真实密码登录 ×2)
捕获证据: evidence/frida/capture_20260829_052648.jsonl
| 链节 | LIVE 值 | 结论 |
|---|---|---|
| hyudb_otp_encrypt arg0 | frida 入口读 "" (误读!!) | 入口寄存器读不可靠 |
| **xxtea 内部密钥** (crypt_util xxtea hook) | **"1471259186024" / "1199666914671" = 账号稳定 UID** | xxtea key = uid ✓ |
| AESkeyMgr::getkey(1,2) | MKDKeridjing7avnsasdSDHI | getkey 表实锤 ✓ |
| getkey(1,3) | nskdI7MDGKSDJsnadjdoonvs | 表序实锤 ✓ |
| md5_char16 输入 | `865a4924a40897ac1fcfe6b4c2cbb0e3` + `MKDKeridjing7avnsasdSDHI` | AESkey = md5_char16(k1+getkey) ✓ |
| UdbAESUtil::encrypt 明文 | `02 0c00 [12B xxtea] 7200 [114B cred]` | 与引擎模型逐字节一致 ✓ |
| AES 密文 | b0a0af88aaf53a411b0eb1d283c88ff8... | OTP out[2:34] = 密文首块 ✓ |
| nonce | nc=0, st=调用时刻 | nonce=counter?st<<16 ✓ |
**结论: getOtp 全链语义 100% 定案** — in=账号uid, s3=非空门(值不进计算), s4=k1, s5=cred, AESkey=md5_char16(k1+getkey(1,cnt)), 明文结构如 V2。
### 2) 差分终态 (全部零命中)
| 模式 | 语义 | 次数 |
|---|---|---|
| GOLD | in="1199666914671"(正确uid) s3="5008" s5=金cred st登录窗+单点 | 346,545 |
| J2 | 全笛卡尔 in{uids,"0",""} × s3{5008,"",k1} × s5{cred,""} 登录窗 | 6,233,760 |
| I | 装机窗 in"0" s5"" | 6,300,000 |
| H/H2 | 旧uid窗+单点 (含 K1C 补齐) | 1.39M+3072 |
| **合计** | | **~14.3M** |
### 3) ★ 结构性证伪: t1.t0 appSign ≠ getOtp 输出 (QED)
- ed0db8 **跨账号稳定** (device_profiles.json: 多账号共用同一登录 hdid) — 设备级值
- getOtp 六元组含 **s5=账号级 cred** (每次登录轮换 → 每次 OTP mid 不同 — 08-25 biztoken mid vs 今日两次 mid 均不同)
- **账号级输入不可能产出设备级稳定值** → t1.t0 不可能是 getOtp 的 mid
- 推论: 770万+ 差分验证的是一必败假设; OTP 引擎已完全解码 (V2+live 双证), 但 **32hex appSign 由 libhydeviceid 设备级装配产出** (0x3ba484 "hdid:" 格式串 / 0x64670 区 / setSafeDeviceId 上报链)
### 4) 旧文档更正 (R13 → R14)
- ~~登录路径六元组 in=""/s3=""~~ → **in=账号uid, s3 非空门** (frida 入口读 "" 为误读, xxtea/内部 hook 为真值)
- ~~登录不可带 frida~~ → **两阶段配方可带登录** (2026-08-29 实测)
- ~~金样本 in="1471238907296"~~ → **in="1199666914671"** (稳定 uid; req-json 1471238907296=会话号)
- ~~I 模式"运行中"~~ → 完成零命中
### 5) 下一步 (appSign 真源)
- 反汇编登录 WUP 构建器 createWupRequestData<AppCommonData>@0x38dab0 → ProtoInfo.appSign 填充点 → 找 32hex getter
- 或 frida 全 hook BusinessCfg 设备 getters + setDeviceInfo 链直接读 appSign 来源