feat(huya): frida证书生成链逆向 - 全链路hook工具与文档
- 定位完整调用链: HYUDBMSDKCommon桥接 -> MsgGetH5InfoEx(184549387) -> HandlerGetH5InfoEx::onHandler@0x38d548 -> getOtp@0x2689f4 -> hyudb_otp_encrypt@0x32fa24 -> createWupRequestData@0x38dab0 - 实测参数表: otp(uid串,2,轮换idx,'5008',SESS_HEX32,hyCred114B,4,nonce) - 密钥字符串确认: 'HuyaUdb1928374650qwertyuiop' (encrypt x3 参数) - Java桥直呼触发: LoginProxy.getQUrlData/getH5InfoEx/getCred 可编程调用 - 稳定时序固化: spawn挂起->bypass->resume->10s->patch_guard->hooks (attach已运行进程必被检测闪退) - 发现App登录态JSON含现成web cookie.biztoken(344B)
This commit is contained in:
@@ -77,3 +77,65 @@ cookies = {
|
||||
--har "/Users/yml/Desktop/抓包/hy/8.24/手机扫码登录-手机端2.har"
|
||||
# 成功记录: evidence/qr_login_success.json(含有效 biztoken,已 gitignore)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、Frida 逆向补充(2026-08-25 下午,手机实测)
|
||||
|
||||
### 7.1 调用链(已全部定位)
|
||||
```
|
||||
JS callHandler("HYUDBMSDKCommon"/"HYUDBMSDKQUrlCommon")
|
||||
└ com.huyaudbunify.HuyaAuth.getH5InfoEx(uid) / getQUrlData(uid,"","")
|
||||
msgId: MsgGetH5InfoEx=184549387(0x0B00000B), meta id 同族 184549392
|
||||
└ HandlerGetH5InfoEx::onHandler @0x38d548 (libudbauthunify.so)
|
||||
├ BusinessCfg::getOtp @0x2689f4
|
||||
│ ├ loadLoginData() ← 本地存储登录态(hyCred 等)
|
||||
│ ├ copyBase64StringToVectChar(safedeviceid)
|
||||
│ ├ getServiceTime + nonce_next → nonce = (time_ms<<16)|seq
|
||||
│ ├ AESkeyMgr key轮换(b2 参数, 1..14 循环)
|
||||
│ └ hyudb_otp_encrypt @0x32fa24
|
||||
└ WupDataPackage<AppCommonData>::createWupRequestData @0x38dab0
|
||||
```
|
||||
|
||||
### 7.2 hook 实测的 otp 输入输出
|
||||
| 参数 | 值 |
|
||||
|---|---|
|
||||
| x0 s1 | uid 十进制字符串 ("1199666914671") |
|
||||
| w1 | 恒 2 |
|
||||
| w2 b2 | AESkeyMgr 轮换索引 (1..14 循环) |
|
||||
| x3 s2 | "5008" |
|
||||
| x4 s3 | SESS_HEX32 "865a4924a40897ac1fcfe6b4c2cbb0e3" |
|
||||
| x5 s4 | hyCred 二进制 (114B, base64 后即 udb_cred 152字符) |
|
||||
| w6 | 恒 4 |
|
||||
| x7 | nonce |
|
||||
| out | [2B头][AES密文] (登录态 146B / 匿名 ~118B) |
|
||||
|
||||
### 7.3 两层 AES 明文(已抓全)
|
||||
- 内层 P2 (131B): `\x02\x0c\x00<12B xxtea(arg7)>...` cred_pack 结构
|
||||
- 外层 P1 (187B): `\x01\x04\x00"5008"\x14\x00<20B随机>\x00<指纹40hex><72 00 0a><10B><cred二进制>`
|
||||
- 尾部证书 = base64([2B头][AES(P1 补零到192)]) = 194B ✓ 与样本吻合
|
||||
|
||||
### 7.4 关键发现:App 登录态 JSON(aes 明文 1106B)
|
||||
```json
|
||||
{"biztoken_vec":[{"bizAppid":"5008","biztoken":"AhNEUAts...","errCode":0}],
|
||||
"cookie":{"biztoken":"AQCRaYXu...(344B web令牌!)","uid":"...","version":"1.0"},
|
||||
"cred":"CmAozmok10sOm1AwUNs...", ...}
|
||||
```
|
||||
→ App 存储里就有现成的 **web cookie.biztoken**!`HuyaAuth.getLoginDataCookies(uid)` 可取。
|
||||
|
||||
### 7.5 Java 桥直呼(全自动触发,无需人工)
|
||||
```js
|
||||
var seed = Java.use('com.duowan.kiwi.base.login.udb.HuyaLoginProxy');
|
||||
var F = Java.ClassFactory.get(seed.class.getClassLoader()); // 双loader注意:
|
||||
// HuyaAuth 系用 com.huyaudbunify.util.HuyaAccountSaveUtils 所在 loader
|
||||
var inst = F.use('com.hysdkproxy.LoginProxy').getInstance();
|
||||
inst.getQUrlData(1199666914671, "", ""); // → 1332字符证书wupData
|
||||
HA.getCred(uid); // → ResGetCred{hyCred(152), yyCred}
|
||||
```
|
||||
|
||||
### 7.6 稳定 hook 时序(不可变)
|
||||
spawn挂起 → attach → 仅装 bypass_msaoaid_maps_art_callsite → resume → 等10s
|
||||
→ patch_guard_block_termination → 业务hooks。**attach 已运行进程必闪退。**
|
||||
|
||||
工具脚本: scripts/hook_final_capture.py(全量采集)/ hook_cred_dump.py(cred+wupData)
|
||||
数据: evidence/final_capture.json, final_wupdata.bin, frida_cred_dump.json
|
||||
|
||||
Reference in New Issue
Block a user