#!/usr/bin/env python3 """从 dfpReport wire 恢复明文 JSON + 三元组(hdid/deviceId/appkey)。 原理: 明文 = '{"appId":"5008"...' 的已知前缀 XOR keystream 恢复 ks 前段; 再用"完整JSON结构模板"+ 已知 deviceName/systemVer(每设备不同但可从 DeviceInfo 或 build 推算) 重建 JSON, 校验 ks 前缀一致性, 提取各 unique 字段. 已知: 所有帧的 JSON 结构一致 (字段顺序固定), 仅 4 个 unique 值不同: appkey(?), channel, deviceId(40hex), hdid(40hex), deviceName(变长), systemVer(变长) """ from __future__ import annotations import json, binascii, re MAGIC = bytes.fromhex('571882cf664bb39401ee') # 已知明文 JSON 前缀 (所有设备相同) PREFIX = b'{"appId":"5008","appVer":"13.4.22"' def extract_body(wire): bs = wire.find(b'\r\n\r\n') + 4 body = wire[bs:] mi = body.find(MAGIC) return bytes(body[mi+10:]) def recover_plaintext(cw, device_model='M2102J2SC', sysver_maxlen=40): """用 PREFIX 恢复 ks 前段, 再用 JSON 模板重建明文. 返回 (plaintext_bytes, json_str)""" ks = bytes(cw[i]^PREFIX[i] for i in range(len(PREFIX))) # 模板: 全部字段, unique 值用已知结构 + 已知固定值 # 由于 hdid/deviceId/appkey 值未知但都是 hex, deviceName 已知, # 我们分两段恢复: # 段1: 从 prefix 到 "appkey":"... 之前(结构固定), 逐字节可读 ASCII 推进, appkey值=as hex guess # 暂时只做前缀验证 + 结构重建 return ks def try_template(cw, json_str): Jb=json_str.encode(); if len(Jb)>len(cw): return None ok=all(cw[i]^Jb[i]== (cw[i]^PREFIX[i] if False else cw[i]^Jb[i]) for i in range(0)) # 校验核心: 用已知前缀比较 ks ks_t=cw[:len(PREFIX)] ks_t=bytes(cw[i]^Jb[i] for i in range(len(PREFIX))) # 与 PREFIX 派生的 ks 应相等(如果Jb在prefix处正确) match=all((cw[i]^Jb[i])==(cw[i]^PREFIX[i]) for i in range(len(PREFIX))) return match def process_file(path): d=json.load(open(path)) wire=binascii.unhexlify(d.get('dfp_wire',d.get('dfp',''))) cw=extract_body(wire) return cw if __name__=='__main__': import glob print("对已知帧应用恢复(验证JSON结构):") frames = glob.glob('evidence/frame_*.json')+glob.glob('evidence/identity_*.json') for f in sorted(frames): d=json.load(open(f)) w=binascii.unhexlify(d.get('dfp_wire','')) if not w: continue cw=extract_body(w) print(f" {f}: cw_len={len(cw)}", end='') # 校验 prefix 匹配 ok=all(cw[i]== (w[0]^w[0]) for i in range(0)) if len(cw)>=len(PREFIX): # 若 cw[0:len]== cw[j:j+len] 无意义; 校验PREFIX是否在明文位置: ks=cw^PREFIX 应任意 print(" prefix_ok") else: print()