feat(huya): jadx映射HDID32 Java链(NativeEntry.getHDID@0x20f0c8) + b()全语义表 + 签名锚定实验(仅HDID32锚,DEVID40自由)

- b(1)=5008/b(2)=ver/b(3)=1.14.68/b(107/108)=qimei → unidbg 桩补全
- 实验: 金样本hdid+随机DEVID40=1571B cred / 换hdid恒APP_SIGN
- docs §11.12
This commit is contained in:
yml2213
2026-08-28 23:27:36 +08:00
parent eccc00e090
commit e5aee00a9c
3 changed files with 32 additions and 0 deletions
+26
View File
@@ -478,3 +478,29 @@ mid = LiveUserbase→tUAEx→t5=sMId (16hex)**可任意铸造** → doLaunch
1. libhydeviceid 内定位 32hex-hdid 生成函数 (unidbg 枚举 32hex 返回的导出/偏移) 1. libhydeviceid 内定位 32hex-hdid 生成函数 (unidbg 枚举 32hex 返回的导出/偏移)
2. 若存在: 输入=?(androidId/config/MID 模型已有) → 铸币设备独立 hdid → 登录 2. 若存在: 输入=?(androidId/config/MID 模型已有) → 铸币设备独立 hdid → 登录
3. 若不存在: 登录 hdid = 设备级私钥证书, 纯代码不可达 → 每账号独立设备需真机/模拟器池 3. 若不存在: 登录 hdid = 设备级私钥证书, 纯代码不可达 → 每账号独立设备需真机/模拟器池
## §11.12 Java 侧 HDID32 链全映射 + 签名锚定实验 (2026-08-28 夜)
### Java 调用链 (jadx classes5.dex 实证)
```
HuyaAuth.initSDID() (com/huyaudbunify/HuyaAuth.java:1261)
├─ sdid = dj3.getSDID() → HyDeviceProxy.g() → NativeEntry.getSDID() ← ACTION(注册链t2)
└─ hdid = dj3.getHDID() → HyDeviceProxy.e() → NativeEntry.getHDID() ← native getHDID@0x20f0c8
(setSafeDeviceId(sdid, hdid) → WUP 帧绑定)
NativeBridge.b(i) 语义全表 (b→fj3.c):
1=APPID(5008) 2=versionName(13.4.22) 3=SDK版本(1.14.68) 5=安装时间json
100=GUID 101/102=MID(ANDROID_ID) 104/105=空 106=64hex
107=qimei16 108=qimei36 300/303/304=...
```
- 登录帧 t1.t0(HDID32) 的 JAVA 源头 = NativeEntry.getHDID() (registerNative@0x20f0c8)。
- unidbg 收集器 b(3)=SDK版本 已补桩 (此前 null 导致收集不完整), 但 getter 仍读缓存
(GUID/HDID 均为缓存读, 缓存由 JAVA 侧 doLaunch/注册链回填) —— 下步: 仿真 JAVA 回填序。
### 签名锚定实验 (金样本账号, 逐变量)
| 变量 | hdid(t1.t0) | device_id(t2.t8) | 结果 |
|---|---|---|---|
| 全金样本 | ed0db8334cadd236c00cadf7e11ab5a5 | 7c5387e0…(40hex) | ✅ 1571B cred |
| 换 device_id | ed0db8… | **deadbeef…(随机40hex)** | ✅ **1571B cred** |
| 换 hdid | **0a7dfa…(手机当前GUID32)** | 7c5387e0… | ❌ APP_SIGN_NOT_MATCH |
| 换 hdid | **0a7d91…(铸币sGuid)** | 7c5387e0… | ❌ APP_SIGN_NOT_MATCH |
**定论: 登录 APP_SIGN 唯一锚 = HDID32(t1.t0); DEVID40 自由; GUID32(铸币)≠登录证书体系。**
Binary file not shown.
@@ -140,11 +140,17 @@ public class HyDeviceId extends AbstractJni {
System.out.println("[JNI] NativeBridge.b FALLBACK-STUB (native not registered?)"); System.out.println("[JNI] NativeBridge.b FALLBACK-STUB (native not registered?)");
int i = vaList.getIntArg(0); int i = vaList.getIntArg(0);
// 真机实测值 (2026-08-28): 100=GUID 101= MID 102= MID 106=64hex, 99/103=null, 104/105="" // 真机实测值 (2026-08-28): 100=GUID 101= MID 102= MID 106=64hex, 99/103=null, 104/105=""
// b()-语义来自 jadx (NativeBridge.b -> fj3.c): 1=APPID(5008) 2=versionName 3=SDK版本(1.14.68)
// 102=l5h.a=ANDROID_ID 104=l5h.f 105=pnc.f 106=l5h.i 107=qimei16 108=qimei36
String v = null; String v = null;
if (i == 100) v = "0a7dfaa882938a6ab502511452142c57"; if (i == 100) v = "0a7dfaa882938a6ab502511452142c57";
else if (i == 101 || i == 102) v = "1e8bdf7d4f7a01d3"; else if (i == 101 || i == 102) v = "1e8bdf7d4f7a01d3";
else if (i == 106) v = "a71a0917ab6d0d6a61947a007591cfb97290f88972b047252c0ec7baddcd57df"; else if (i == 106) v = "a71a0917ab6d0d6a61947a007591cfb97290f88972b047252c0ec7baddcd57df";
else if (i == 104 || i == 105) v = ""; else if (i == 104 || i == 105) v = "";
else if (i == 1) v = "5008";
else if (i == 2) v = "13.4.22";
else if (i == 3) v = "1.14.68";
else if (i == 107 || i == 108) v = "67453f5aef55f776967c748a10001c318101";
System.out.println("[JNI] NativeBridge.b(" + i + ") -> " + v); System.out.println("[JNI] NativeBridge.b(" + i + ") -> " + v);
return v == null ? null : new StringObject(vm, v); return v == null ? null : new StringObject(vm, v);
} }