docs(huya): 模拟器存活闪退诊断报告与 Frida 探测脚本证据
- 诊断报告: attach 主进程静默退出/EGL 崩溃, 仅约 4s 窗口可抓帧 - scripts: attach/spawn/hook/emu 系列 Frida 脚本与抓帧/验证工具 - evidence: identity/reqchain/frame/inputbuf/magic_buf/propedge 抓取样本, emu_* 存活对比, diag_* 策略实验, baseline 裸测基准
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user