Files
live-hub-py/scripts/json_plain.py
T
yml2213 49c5c36c05 docs(huya): 模拟器存活闪退诊断报告与 Frida 探测脚本证据
- 诊断报告: attach 主进程静默退出/EGL 崩溃, 仅约 4s 窗口可抓帧
- scripts: attach/spawn/hook/emu 系列 Frida 脚本与抓帧/验证工具
- evidence: identity/reqchain/frame/inputbuf/magic_buf/propedge 抓取样本,
  emu_* 存活对比, diag_* 策略实验, baseline 裸测基准
2026-08-27 17:58:32 +08:00

67 lines
2.7 KiB
Python

#!/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()