# dfpReport 破解进度总结 (待破解#2) > **当前状态**:加密算法已确定为**逐字节 XOR keystream**(非 XXTEA),明文 JSON 已全部拿到。 > 剩余关键问题:**keystream 每会话动态生成**,需找到其生成函数/种子。 > IDA 已导出两个 so 的完整反编译+反汇编:`/Users/yml/Downloads/so/{libhydeviceid,libudbauthunify}.so_export_for_ai` --- ## 一、已确定的结论(铁证) ### 1. dfpReport 加密 = 逐字节 XOR keystream(不是 XXTEA!) **证据链**: - 同会话 5 次 dfpReport(wire 间隔 3-6s),密文两两 XOR 非零位置 3947/3984 → keystream 每会话动态 - 但**密文前 10B 魔数恒定** `57 18 82 cf 66 4b b3 94 01 ee`(跨天、跨会话)→ 魔数是**明文头 XOR 固定值**或者**固定前缀** - 8.23 各样本位置 11-22 部分相同 → 是明文固定字段,不是 keystream 泄漏 - 若为 XXTEA(hyudbxxt),则密文任何字节变化会扩散到全部 → 但实测前 10B 不动 → 排除 XXTEA ### 2. tag2 密文结构(3984B) ``` tag2 = [魔数 10B][XOR密文 3974B?] ``` - 明文 ≈ JSON(554B) + 采集二进制(3420B) ≈ 3974B,与"密文长度-魔数"吻合 - 但注意:3954B 对齐实验(偏移 0..9 all ~1% 相同率)未找到明文精确起点 → **加密输入可能不是纯 JSON,JSON 只是其中一部分**(pa 结构待最终确认) ### 3. 明文 JSON 完整捕获(554B,可铸造) ```json {"appId":"5008","appVer":"13.4.22","appkey":"865a4924a40897ac1fcfe6b4c2cbb0e3", "channel":"xiaomi","deviceId":"02df398797432eadefcc12767119ad5e80999389", "deviceName":"M2102J2SC","hdid":"7c5387e0539c023c31c4ff0e807e7256117385ee", "heightPixels":"2120","isCloud":0,"isForbidLog":1,"isHome":0,"isPre":0,"openAppId":"", "savePath":"/data/user/0/com.duowan.kiwi/files/huyaudb","sdkVer":"1.0.80138", "servantName":"huyaudbwebui","shareAppDataPath":"/data/user/0/com.duowan.kiwi/files/huyaudb", "systemInfo":"android","systemVer":"M2102J2SC,30,11","terminalType":1,"testEnv":0,"widthPixels":"1080"} ``` - **hdid 字段 = 服务端返回的 device_id (t5)** `7c5387...` → 服务端回显本地明文,本地可完全控制设备身份! - appkey `865a...cbb0e3` ≠ 静态 t1 `865a...cbb045` → appkey 来自运行时配置 ### 4. 响应回显验证(t1/t5 本地可铸造) - 重放任意 wire body → HTTP 200,344B 响应,同一 t1+t5,全新 t2 - t1(`865a4924a40897ac1fcfe6b4c2cbb045`) 静态埋于 libhydeviceid .data(0x3bb190, 0x3bb230, 0x3e0e50),datadiv 加载时解密 - **patch 明文实验**:改明文 JSON 的 hdid/appkey/deviceId(等长替换)后 app 崩溃 → 说明有校验或时序问题,但方向正确(见下"待办") ### 5. keystream 前 24B(从 5 组同步 pair 恢复) ``` # 修正对齐 off=0 (密文[10:] XOR 明文[0:]): t=1379: 07 f8 60 f9 b8 bc 30 bf 76 4e d4 8d a8 f6 54 21 31 fa 47 53 72 63 ef 29 t=7268: 17 f9 70 e5 b8 3c 6c be 77 e6 ac cb c3 2a 6a 8c ef aa cd ce eb e5 67 a7 t=3695: 17 f9 70 f9 b1 3c 4c be 77 74 14 ee 5e 7c e0 88 3a e2 c3 2c 72 63 8c 10 ... ``` 各会话 keystream 不同 → **动态生成**,极可能种子 = 时间戳或会话随机 + 固定密钥 --- ## 二、IDA 导出可用资源(用户新提供,重点!) ``` /Users/yml/Downloads/so/libhydeviceid.so_export_for_ai/ decompile/ # 3895 个 C 反编译 disassembly/ # 逐函数汇编 exports.txt # 1832 个导出 (含 70 个 .datadiv_decode) function_index.txt, strings.txt, memory/... /Users/yml/Downloads/so/libudbauthunify.so_export_for_ai/ decompile/252700.c # hyudbxxt::xxtea_encrypt 标准 XXTEA (dfp 无关,登录用) ``` **优先排查的加密函数**: - `decompile/1107CC.c` 引用 `0x5718` 魔数常量 ×3!(sub_1107CC,调用者 0xa6a3c)← **最可疑是真加密/解密函数** - `decompile/1D52C8.c`、`1D5844.c`、`294FB0.c`、`7BF8C.c` 也含 0x5718 - 大 XOR 循环候选:17F75C, 212B04, 21F98C, 2332D4, 23755C, 23C534, 26D7B0, 274BBC, B5A18 --- ## 三、动态 hook 关键资产 ### 抓同步 (明文, 密文) 对 —— 已成功! `scripts/capture_pair_sync.py`:spawn+bp3 绕过 → SSL_write 命中 dfpReport 时 80ms 后全内存扫描 `{"appId":"5008"` → 同时刻明文。5 组同步 pair 在 `evidence/dfp_pair_sync.json` ### 环境 - RE repo venv: `/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0/.venv/bin/python -u` - 远程 frida: `adb forward tcp:31877 tcp:31877` + `frida.get_device_manager().add_remote_device("127.0.0.1:31877")` - 绕过:spawn 后先 `bypass_msaoaid_maps_art_callsite.js` + `mask_frida_maps_only.js` → resume → 11s 后 `patch_guard_block_termination.js` - **hook 规则**:后台任务 + tail 实时看 + 命中即 pkill(见 `docs/Hook脚本运行与捕获约定.md`) --- ## 四、下一步行动(按优先级) 1. **读 IDA 反编译确认加密**:重点 `decompile/1107CC.c`(引用 0x5718!)及其调用者链 0xa6a3c → 找 keystream 生成函数(输入时间戳/随机种子 + 固定 key,输出 3974B 流) 2. **hook 加密函数**:定位后 hook,抓 (明文输入, key/种子, 密文输出) 三元组 → 直接复现纯 Python 加密 3. **验证 keystream 种子假设**:比对 5 组 keystream 的 Δ 与 wire 时间戳 Δ(3-6s 间隔,keystream 差异是否对应计数/时间)→ 若种子=时间戳,纯代码可复现 4. **patch 明文实验修复**:上次改明文崩溃可能因 datadiv 重解码或时序;改用 hook 加密函数输入 buffer 后直接改明文再放行,避免物理内存写 5. **最终目标**:纯 Python 生成 dfpReport 请求体 = 构造明文 JSON(改 hdid/deviceId/appkey 铸造新设备) + 魔数 + 复现 keystream 加密 → 重放得到全新 t1/t5 --- ## 五、账号/数据资产 - 账号 `hy_300026595` / `aa778899`(老 ref `hy_300024708`) - HAR:`/Users/yml/Desktop/抓包/hy/8.23/登录-{1,2,3,5}.har`(6 个 dfpReport wire,t2 len 3408-4237) - 同一设备(小米 M2102J2SC, Android 11, 快照 `5dd8c93f`)所有 wire 魔数头相同 - 关键回显:hdid `7c5387e0539c023c31c4ff0e807e7256117385ee` = 明文 hdid = 响应 t5 ## 六、关键文件索引 | 文件 | 内容 | |---|---| | `evidence/dfp_pair_sync.json` | **5 组同步 (密文+明文) pair**(最新最有价值) | | `evidence/dfp_pair.json` | 早期 3 组 pair(wire len 4278/4397/4413) | | `evidence/dfp_wire_stack.json` | 8 事件 5 dfpReport wire HEX | | `evidence/dfp_plain_big.json` | 187 个堆命中(明文 JSON @0x7814096d19 等) | | `evidence/dfp_datadiv_full.json` | .data 7895 个已解码字符串(t1 所在) | | `scripts/capture_pair_sync.py` | 同步 pair 抓取脚本(可复用) | | `/Users/yml/Downloads/so/libhydeviceid.so_export_for_ai/` | **IDA 反编译(新!)** | ## 七、新会话起点(最重要的下一步) **IDA 反编译确认加密**:`/Users/yml/Downloads/so/libhydeviceid.so_export_for_ai/decompile/1107CC.c` - 引用 `0x5718` 魔数 ×3,调用者 `0xa6a3c` → 极可能是 dfpReport 加解密核心 - 同时看:1D52C8.c, 1D5844.c, 294FB0.c, 7BF8C.c(均含 0x5718) - 反汇编对应文件在 `disassembly/`.asm **验证 keystream 种子**:evidence/dfp_pair_sync.json 有 5 组同步 pair, 两组 keystream 差 vs 时间戳差 → 判断种子是否时间戳/计数器。