复刻QIMEI UUID42并默认使用无头浏览器
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
| `udb_anouid` | anonymousLogin 响应 uid | ✅ 已接入 anon_device |
|
||||
| `udb_guiddata` | middle URL 第三段 hex32(客户端自选) | ✅ 已接入 anon_device |
|
||||
| `guid` | `HyUDBWebSDK-Exchange-2.4.js` 写 document.cookie | 会话值已接入;回退生成规则待确认 |
|
||||
| `_qimei_uuid42` | QIMEI SDK 脚本写 document.cookie | 结构已对齐;SDK 语义待复刻 |
|
||||
| `_qimei_uuid42` | QIMEI SDK 脚本写 document.cookie | 0.6.3 时间/CRC32/随机半字节算法已复刻 |
|
||||
| `__yamid_new` | 门户业务脚本写 document.cookie | `room_normal.js` `generate32` 已复刻 |
|
||||
| `game_did` | 门户业务脚本写 document.cookie | 35 位、63 字符集规则已复刻 |
|
||||
|
||||
@@ -41,13 +41,13 @@ udb_appid, udb_guiddata` —— 4 个匿名设备字段已有(anon_device 协
|
||||
| --- | --- | --- | --- |
|
||||
| `guid` | 32 hex,`0a7d…` 前缀 | udbres.huya.com SDK 脚本 | `wsLaunch` 会话值已接入;回退规则待确认 |
|
||||
| `game_did` | 35 位字母数字 | liveapi.ip/getIpLocation 后门户脚本 | 35 位、63 字符集已复刻 |
|
||||
| `_qimei_uuid42` | 42 hex,`1a901…` 前缀 | QIMEI SDK 脚本 | `1a` + 40hex;精确算法待复刻 |
|
||||
| `_qimei_uuid42` | 42 hex,时间前缀 | QIMEI SDK 脚本 | 14 位时间前缀 + CRC32 替换段 + 随机半字节 |
|
||||
| `__yamid_new` | 32 hex 大写 | 门户脚本 | `generate32` 已复刻并通过 WSS 验证 |
|
||||
|
||||
浏览器 round1 同一字段多次出现均**值稳定**(跨 profile 稳定):`_qimei_fingerprint`
|
||||
恒为 `2822a43b5a3bd016fc844218c35c8a74`,`_qimei_uuid42` 前缀恒为 `1a901…`,
|
||||
`guid` 前缀恒为 `0a7dfaa2…` → 存在固定前缀/哈希结构,**随机值可能被风控识别**,
|
||||
需还原生成算法。
|
||||
恒为 `2822a43b5a3bd016fc844218c35c8a74`,`_qimei_uuid42` 按秒内时间前缀稳定,
|
||||
`guid` 前缀恒为 `0a7dfaa2…`。QIMEI 时间/CRC32/随机半字节生成算法已由 SDK VM
|
||||
固定输入探针闭合,随机字段仍会在每次生成时变化。
|
||||
|
||||
### 3.2 统计/会话字段(随机即可,服务端仅记录)
|
||||
|
||||
@@ -108,7 +108,7 @@ cd /Users/yml/codes/live-hub-py
|
||||
|
||||
## 六、风险与验证要求
|
||||
|
||||
当前实现已经通过活动 WSS 查询链路验证。`_qimei_uuid42` 仍只保证结构,`guid` 的回退值和设备字段持久化仍需继续完善;详细状态见 [HUYA_COOKIE路线状态.md](HUYA_COOKIE路线状态.md)。
|
||||
当前实现已经通过活动 WSS 查询链路验证。`guid` 的回退值和设备字段持久化仍需继续完善;详细状态见 [HUYA_COOKIE路线状态.md](HUYA_COOKIE路线状态.md)。
|
||||
|
||||
## 七、各通道 Cookie 依赖矩阵(2026-09-01 晚实测)
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
同一网页会话内这些值保持稳定:
|
||||
|
||||
- `_qimei_uuid42`:42 位;`_qimei_h38`:38 位;`_qimei_fingerprint`:32 位。三者是 QIMEI 设备标识;其中 fingerprint 已按 SDK 能力特征串算法复刻,uuid42 仍只保证结构。
|
||||
- `_qimei_uuid42`:42 位;`_qimei_h38`:38 位;`_qimei_fingerprint`:32 位。三者是 QIMEI 设备标识;其中 fingerprint 与 uuid42 均已按 SDK 0.6.3 算法复刻。
|
||||
- `udb_anobiztoken`:344 位 URL-safe 字符串,和 `udb_anouid` 共同属于匿名设备状态,不能用重复 UUID 字节拼接。
|
||||
- `guid` 与 `udb_guiddata` 均为 32 位,但抓包值不同,不能复用同一画像字段。
|
||||
- `udb_deviceid` 为 `w_` 加 19 位数字;格式可以校验,但仅凭格式无法得到真实值。
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
## 旧实现的问题
|
||||
|
||||
旧实现曾在空 Session 中生成 `__yamid_new`、`game_did`、三个 QIMEI 字段、`udb_anobiztoken`、`HMACCOUNT`、`_yasids` 和多个固定计数器。它们只能满足长度测试,不能证明值具有协议语义;当前 fingerprint 已替换为 SDK 算法,uuid42 仍保留结构化回退。
|
||||
旧实现曾在空 Session 中生成 `__yamid_new`、`game_did`、三个 QIMEI 字段、`udb_anobiztoken`、`HMACCOUNT`、`_yasids` 和多个固定计数器。它们只能满足长度测试,不能证明值具有协议语义;当前 fingerprint 与 uuid42 均已替换为 SDK 0.6.3 算法,仍需以同一会话的线上结果确认风控关联性。
|
||||
|
||||
旧实现还把 `device_info["guid32"][:32]` 同时写入 `guid` 和 `udb_guiddata`,并把手机号直接写入 `udb_passport`/`username`。这两点会造成设备身份和账号映射偏差。
|
||||
|
||||
|
||||
+19
-6
@@ -19,7 +19,7 @@ App 登录可以得到新鲜的 `udb_cred`、`udb_uid`、`yyuid`、`udb_biztoken
|
||||
| `__yamid_new` | 已完成 | `room_normal.js` `generate32` Python 复刻 |
|
||||
| `game_did` | 已完成 | 35 位、63 字符集规则复刻 |
|
||||
| `_yasids` | 格式完成,精确共享种子未确认 | 与 `__yamid_new` 使用同类时钟生成器 |
|
||||
| `_qimei_uuid42` | 结构完成,SDK 内部算法待复刻 | `1a` + 40hex |
|
||||
| `_qimei_uuid42` | 已完成 | QIMEI SDK 0.6.3 的 14 位时间前缀 + CRC32 替换段 + 20 位随机半字节段 |
|
||||
| `_qimei_fingerprint` | 算法已复刻 | QIMEI `x64hash128(feature_string, 31)` |
|
||||
| 统计字段 | 已完成 | 线上查询已接受;部分字段仍是统计用途 |
|
||||
|
||||
@@ -46,11 +46,10 @@ SDK/Python 输出:d07a45de567322edcd42312f38e610be
|
||||
## 尚未闭合的工程项
|
||||
|
||||
1. 将真实 WebView/Chrome 的 `getFeature()` 结果接入登录调用,替代当前的设备画像近似值。
|
||||
2. 对 `_qimei_uuid42` 做 SDK VM 级复刻,当前只保证结构。
|
||||
3. 明确 `guid` 的 `956a` / `966a` 版本差异和无 `wsLaunch` 时的真实生成规则。
|
||||
4. 让活动会话补齐后的 Cookie 持久化回账号,避免原始 16 字段账号每次任务重新生成设备字段。
|
||||
5. 为 `raw_cookie` 增加重建网页 Cookie 的服务入口。
|
||||
6. 商城下单、支付和支付状态轮询保持单独人工验证,不纳入只读回归。
|
||||
2. 明确 `guid` 的 `956a` / `966a` 版本差异和无 `wsLaunch` 时的真实生成规则。
|
||||
3. 让活动会话补齐后的 Cookie 持久化回账号,避免原始 16 字段账号每次任务重新生成设备字段。
|
||||
4. 为 `raw_cookie` 增加重建网页 Cookie 的服务入口。
|
||||
5. 商城下单、支付和支付状态轮询保持单独人工验证,不纳入只读回归。
|
||||
|
||||
## 证据入口
|
||||
|
||||
@@ -58,3 +57,17 @@ SDK/Python 输出:d07a45de567322edcd42312f38e610be
|
||||
- [Cookie 合并审计](HUYA_COOKIE合并审计与来源矩阵.md)
|
||||
- [浏览器抓包报告](../evidence/browser_cookie_harvest/report.md)
|
||||
- [虎牙精英宝典联调指南](HUYA精英宝典联调指南.md)
|
||||
|
||||
## `_qimei_uuid42` VM 复刻(2026-09-02)
|
||||
|
||||
固定时间 `1700000000000`、固定随机值时,SDK 观测值如下:
|
||||
|
||||
```text
|
||||
random=0 17b0f060d1410085cc000000000000000000003207
|
||||
random=0.25 17b0f060d14100037f4444444444444444444437df
|
||||
random=0.5 17b0f060d1410053db888888888888888888883ff6
|
||||
random=0.75 17b0f060d14100966bcccccccccccccccccccc1cf3
|
||||
random=.999 17b0f060d141003174ffffffffffffffffffffd85d
|
||||
```
|
||||
|
||||
每个值都可以拆成 `14 + 4 + 20 + 4 = 42` 位。时间前缀由本地时间组成:年份末两位转十六进制并补两位、月份转十六进制、日/时/分/秒转十六进制并各补两位,最后追加 `cookieEnabled ? 100 : 000`。中间 20 位是 `floor(Math.random() * 16)` 对应的十六进制半字节重复。两个 `----` 占位组成模板后,SDK 对模板 ASCII 字节计算标准 CRC32(多项式 `0xEDB88320`),将 8 位小写结果的前后四位分别替换占位,最后调用 `toLocaleLowerCase()`。Python 实现位于 `core/huya/web_cookie_fields.py`,并用上述固定向量回归;随机上界按 15 处理,避免理论输入 `1.0` 产生两位半字节。VM 追踪在 `/tmp/qvmtrace17.out`,生成器入口为 `e=6064`,模板拼接和替换发生在 `m≈5015..5137`。该实现只用于查询链路的设备态生成,不触发兑换、下单或支付。
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
| --- | --- | --- |
|
||||
| `__yamid_new` | 88 条写入中无此 key,但最终 cookie 有值 | **CBCC 前缀 + 递增种子**(见下) |
|
||||
| `game_did` | 同上 | 30-35 位字母数字 |
|
||||
| `_qimei_uuid42` | 同上 | `1a` 前缀 + 32hex UUID 结构 + 10hex |
|
||||
| `_qimei_uuid42` | 同上 | 14 位时间前缀 + 8 位 CRC32 替换值 + 20 位随机半字节 + 4 位 CRC32 尾段 |
|
||||
|
||||
## 三、设备字段结构规律(真实样本)
|
||||
|
||||
@@ -58,13 +58,13 @@ CBCC 06ECB5 0000 0001 B63016D6162BC990 ← reqable 8.31
|
||||
`yamid=CBCC6479D9B0...` ↔ `rootsid=CBCC647A8A20...`(同会话,种子差 0xB1≈177)
|
||||
- `0001` 固定,尾部大段随机
|
||||
|
||||
### _qimei_uuid42 = `1a` + 40hex(32hex UUID 结构 + 10hex 附加)
|
||||
### _qimei_uuid42 = 14 位时间前缀 + CRC32 替换段 + 20 位随机半字节 + CRC32 尾段
|
||||
```
|
||||
1a81f140c08100b89fb1be450f640501568684b2ea ← reqable 8.31
|
||||
1a901123a1f10045427c1c73420287f44f49d11b45 ← round2 fresh
|
||||
1a901171b051007527940c2acef15dcd2342b6ff ← live 窗口
|
||||
17b0f060d14100037f4444444444444444444437df ← 固定时间/随机 .25
|
||||
17b0f060d1410053db888888888888888888883ff6 ← 固定时间/随机 .5
|
||||
17b0f060d141003174ffffffffffffffffffffd85d ← 固定时间/随机 .999
|
||||
```
|
||||
首字节 `1a` 恒定;前 32 hex 符合 RFC 4122 UUID 布局(8-4-4-4-12)。
|
||||
时间前缀的编码为:年份末两位十六进制(补两位)+ 月份十六进制 + 日/时/分/秒各两位十六进制 + `cookieEnabled` 标志(`100`/`000`)。模板 `prefix + "----" + nibble * 20 + "----"` 的标准 CRC32 小写结果会拆成前后四位填回两个占位;`nibble = floor(Math.random() * 16)`,因此合法范围为 `0` 到 `f`。
|
||||
|
||||
### _qimei_fingerprint = x64hash128(feature_string, 31) 32hex
|
||||
qimeisdk-web 0.6.3 源码已定位:
|
||||
@@ -79,7 +79,7 @@ qimeisdk-web 0.6.3 源码已定位:
|
||||
| --- | --- | --- | --- |
|
||||
| `guid` | 浏览器脚本(有固定段 `0a..966a`)| 高(设备与会话绑定) | **必须按结构仿造或复用 wsLaunch 会话值**;随机纯 hex 与真实结构不符 |
|
||||
| `__yamid_new` | 浏览器脚本(CBCC 前缀+种子)| 高(与 rootsid 同源)| `room_normal.js` `generate32` 已复刻;精确 rootsid 共享计数仍待确认 |
|
||||
| `_qimei_uuid42` | QIMEI SDK 0.6.3(`1a` 前缀)| 中 | 前缀 `1a` + UUID 布局 |
|
||||
| `_qimei_uuid42` | QIMEI SDK 0.6.3 VM 生成器 `e=6064` | 中 | Python 已按时间编码、CRC32 和随机半字节逐项复刻 |
|
||||
| `_qimei_fingerprint` | QIMEI SDK 0.6.3 x64hash128(feature_string, 31) | 中 | Python 已复刻,输入字段见路线状态文档 |
|
||||
| `game_did` | 浏览器脚本 | 中 | 长度需对齐(35 变体含 `-`)|
|
||||
| 统计字段(SoundValue 等)| 页面脚本 | 低 | 随机 OK |
|
||||
@@ -116,10 +116,17 @@ B = (t=35) => { const e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012
|
||||
- **长度 35**(旧随机 30 位是错的);字符集 64 去掉末尾 `_`(63 选 1)
|
||||
- cookie 名 `game_did`,无 cookie 时生成并写入
|
||||
|
||||
### ⚠️ _qimei_uuid42 结构已定,算法待深挖
|
||||
- cookie 值:首字节 `1a` 固定 + 40hex(localStorage 是 44hex,cookie 为截断子串)
|
||||
- 由 qimeisdk-web 0.6.3 内部 VM 生成(`_qimei_ssid`/`_qimei_last_get_id_time_<16hex>` 同源)
|
||||
- 当前实现对齐结构(1a 前缀 + 42hex 随机化),精确算法待继续
|
||||
### ✅ _qimei_uuid42 = QIMEI SDK VM 生成器(已 Python 复刻)
|
||||
|
||||
清理 localStorage/cookie 后对 QIMEI SDK 0.6.3 做固定时间、固定随机值追踪,定位到 VM 生成器 `e=6064`。它先拼出:
|
||||
|
||||
```text
|
||||
14 位时间前缀 + "----" + 20 位随机半字节重复串 + "----"
|
||||
```
|
||||
|
||||
随后计算模板 ASCII 字节的标准 CRC32,将 8 位小写结果的前 4 位和后 4 位分别填入占位,最后调用 `toLocaleLowerCase()`。例如 `random=0.25` 的模板是 `17b0f060d14100----44444444444444444444----`,替换值是 `037f37df`,结果为 `17b0f060d14100037f4444444444444444444437df`。`navigator.cookieEnabled` 只影响时间前缀末三位(`100`/`000`)。
|
||||
- 由 qimeisdk-web 0.6.3 内部 VM 生成(`_qimei_ssid`/`_qimei_last_get_id_time_<16hex>` 同源);字段本身为 42 位小写十六进制。
|
||||
- Python 实现按 SDK 时间、CRC32 和随机上界复刻,固定向量覆盖 `0`、`.25`、`.5`、`.75`、`.999`。
|
||||
|
||||
### ✅ _qimei_fingerprint = x64hash128(feature_string,31),已完成 Python 复刻
|
||||
- Cookie 输入由屏幕分辨率、浏览器能力、WebGL 和时区字段按 `###` 拼接。
|
||||
@@ -130,7 +137,7 @@ B = (t=35) => { const e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012
|
||||
- `__yamid_new` → `_yamid_new_generate32()`(UUID-v1 时间戳复刻)
|
||||
- `game_did` → `_game_did_generate()`(35 位 63 字符集)
|
||||
- `_yasids` → 与 `__yamid_new` 同源同刻生成
|
||||
- `_qimei_uuid42` → `1a` 前缀 + 42hex
|
||||
- `_qimei_uuid42` → `_qimei_uuid42_generate()`(14 位时间前缀 + CRC32 替换段 + 20 位随机半字节 + CRC32 尾段)
|
||||
- `guid`(无会话值回退)→ `0a` + 10hex + `966a` + 16hex 结构
|
||||
|
||||
## 七、逆向生成器端到端验证(2026-09-01 晚,账号 18397482576 重新登录后)
|
||||
@@ -138,7 +145,7 @@ B = (t=35) => { const e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012
|
||||
新版生成器(web_cookie_fields.py commit 8fef04d)产出字段:
|
||||
- guid=`0a43b01a366c966a7fe26a281e1d3c88`(0a 前缀 + 966a 固定段)
|
||||
- __yamid_new=`CBCC65D6C5200001F176114BCF181E25`(UUIDv1 时间戳)
|
||||
- _qimei_uuid42=`1a552b4b...`(1a 前缀)
|
||||
- _qimei_uuid42=42 位小写十六进制(SDK VM 时间/CRC32 结构)
|
||||
- game_did=35 位
|
||||
- _yasids 与 yamid 同源(CBCC65D6C5 前缀一致)
|
||||
|
||||
|
||||
@@ -53,8 +53,8 @@ Cookie 缺少网页设备态(udb_deviceid, udb_guiddata, udb_anobiztoken),已
|
||||
```
|
||||
|
||||
`guid`/`game_did`/`_qimei_uuid42`/`__yamid_new` 四个脚本字段无统一服务端签发接口;
|
||||
当前登录链已接入 `guid` 会话值、`__yamid_new`、`game_did` 和 fingerprint 算法,
|
||||
`_qimei_uuid42` 仍使用结构化回退,WSS 判定不要求脚本字段全部来自浏览器。
|
||||
当前登录链已接入 `guid` 会话值、`__yamid_new`、`game_did`、fingerprint 和
|
||||
`_qimei_uuid42` 的 SDK 算法,WSS 判定不要求脚本字段全部来自浏览器。
|
||||
|
||||
- WSS 握手、`wsLaunch`、`getConfig` 或业务 RPC 任一步失败:任务直接失败并记录具体阶段,便于修复 Cookie 或协议参数。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user