diff --git a/docs/HUYA_HDID_ALGORITHM_GEN.md b/docs/HUYA_HDID_ALGORITHM_GEN.md index 36bbc72..f7c6ec0 100644 --- a/docs/HUYA_HDID_ALGORITHM_GEN.md +++ b/docs/HUYA_HDID_ALGORITHM_GEN.md @@ -478,3 +478,29 @@ mid = LiveUserbase→tUAEx→t5=sMId (16hex),**可任意铸造** → doLaunch 1. libhydeviceid 内定位 32hex-hdid 生成函数 (unidbg 枚举 32hex 返回的导出/偏移) 2. 若存在: 输入=?(androidId/config/MID 模型已有) → 铸币设备独立 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(铸币)≠登录证书体系。** diff --git a/evidence/mint/login_pair_golden_hdid_control.bin b/evidence/mint/login_pair_golden_hdid_control.bin new file mode 100644 index 0000000..96d1941 Binary files /dev/null and b/evidence/mint/login_pair_golden_hdid_control.bin differ diff --git a/tools/unidbg/hydev/src/hydev/HyDeviceId.java b/tools/unidbg/hydev/src/hydev/HyDeviceId.java index d61b386..f1412ca 100644 --- a/tools/unidbg/hydev/src/hydev/HyDeviceId.java +++ b/tools/unidbg/hydev/src/hydev/HyDeviceId.java @@ -140,11 +140,17 @@ public class HyDeviceId extends AbstractJni { System.out.println("[JNI] NativeBridge.b FALLBACK-STUB (native not registered?)"); int i = vaList.getIntArg(0); // 真机实测值 (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; if (i == 100) v = "0a7dfaa882938a6ab502511452142c57"; else if (i == 101 || i == 102) v = "1e8bdf7d4f7a01d3"; else if (i == 106) v = "a71a0917ab6d0d6a61947a007591cfb97290f88972b047252c0ec7baddcd57df"; 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); return v == null ? null : new StringObject(vm, v); }