6.9 KiB
6.9 KiB
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,可铸造)
{"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≠ 静态 t1865a...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)
四、下一步行动(按优先级)
- 读 IDA 反编译确认加密:重点
decompile/1107CC.c(引用 0x5718!)及其调用者链 0xa6a3c → 找 keystream 生成函数(输入时间戳/随机种子 + 固定 key,输出 3974B 流) - hook 加密函数:定位后 hook,抓 (明文输入, key/种子, 密文输出) 三元组 → 直接复现纯 Python 加密
- 验证 keystream 种子假设:比对 5 组 keystream 的 Δ 与 wire 时间戳 Δ(3-6s 间隔,keystream 差异是否对应计数/时间)→ 若种子=时间戳,纯代码可复现
- patch 明文实验修复:上次改明文崩溃可能因 datadiv 重解码或时序;改用 hook 加密函数输入 buffer 后直接改明文再放行,避免物理内存写
- 最终目标:纯 Python 生成 dfpReport 请求体 = 构造明文 JSON(改 hdid/deviceId/appkey 铸造新设备) + 魔数 + 复现 keystream 加密 → 重放得到全新 t1/t5
五、账号/数据资产
- 账号
hy_300026595/aa778899(老 refhy_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 时间戳差 → 判断种子是否时间戳/计数器。