Files
live-hub-py/docs/dfpReport破解进度.md
T

6.9 KiB
Raw Blame History

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 ≠ 静态 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.c1D5844.c294FB0.c7BF8C.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 时间戳差 → 判断种子是否时间戳/计数器。