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,207 @@
|
||||
# 模拟器闪退/卡启动/验证码不加载 —— 存活与崩溃诊断报告
|
||||
|
||||
> 日期: 2026-08-27
|
||||
> 环境: 模拟器 GC3VE (Android 12 API32, arm64, MuMu系, Kitsune Mask 26.4 rooted)
|
||||
> App: 虎牙 com.duowan.kiwi 13.4.22 (115315)
|
||||
> frida: server 15.2.2 (fs152, tcp:31878) + RE仓库 .venv (frida-py 15.2.2)
|
||||
> 本文档只回答一件事: **"App到底什么时候活着、什么时候闪退、为什么"**, 判断方法全部可复核。
|
||||
|
||||
## 〇、先纠正一个根本性错误: 如何判断"是否存活/是否闪退"
|
||||
|
||||
之前(包括文档既有结论)用以下方式判断进程状态, **全部不可靠**:
|
||||
|
||||
| 旧方法 | 为什么错 |
|
||||
|---|---|
|
||||
| `frida enumerate_processes()` 里 pid 存在 | spawn 后枚举有延迟/漏报; 进程死后 agent 会话残影还在; **多次实测"显示死"但 /proc 里明明活着** |
|
||||
| `pidof com.duowan.kiwi` 取第一个 pid | 会混入子进程 `com.duowan.kiwi:cloudpatch` / `:logcat`(它们的 cmdline 以包名开头); **把子进程当主进程 attach → 白费** |
|
||||
| 脚本结束后看到黑屏就以为闪退 | 屏幕回桌面 ≠ 进程死: **App 有 KeepAlive, UI Activity 被崩掉后进程会被系统保活重启**, pid 可能换新 |
|
||||
| `d.kill(pid)` / force-stop 后说"App死了" | 是我们自己杀的, 不算闪退 |
|
||||
|
||||
**本次统一的事实来源 (evidence/diag_lifecycle/diag_*.json 均按此采集):**
|
||||
|
||||
1. **主进程存活** = `/proc/<pid>/cmdline` 读出来**精确等于** `com.duowan.kiwi`(排除 `:cloudpatch`/`:logcat` 子进程)。`pidof` 每一 pid 都过 cmdline 过滤。
|
||||
2. **UI 是否闪退** = `dumpsys window | grep mCurrentFocus` 里是否还包含 `com.duowan.kiwi`(回到 `app.lawnchair` 即 UI 已退出)。
|
||||
3. **是否发生崩溃** = `logcat -d -b crash` 是否有 `Fatal`/`signal`/`Abort message`。native 崩溃(如 EGL)会写 tombstone, msaoaidsec 静默 `_exit` 则 crash buffer 无记录——**两种死法必须分开看**。
|
||||
|
||||
---
|
||||
|
||||
## 一、四组对照实验结果 (2026-08-27 实测)
|
||||
|
||||
脚本: `scripts/diag_lifecycle.py [a|b|c|d]`, 证据: `evidence/diag_lifecycle/diag_{a,b,c,d}.json`
|
||||
|
||||
| 组 | 做法 | 主进程存活 | UI 前台 | crash buffer | 结论 |
|
||||
|---|---|---|---|---|---|
|
||||
| **A** | 无 frida, monkey 正常启动 | ✅ 全程存活 (pid 不变) | ✅ Homepage | 0 | **无 frida 完全正常, 不闪退** |
|
||||
| **B** | frida spawn, **挂起 0.11s 立即 resume, 不加载任何脚本** | ✅ 全程存活 | ✅ Homepage | 0 | **spawn 本身不杀 App!** |
|
||||
| **C** | frida spawn, 挂起**加载 2 个 bypass 脚本** (art_callsite+mask_frida) 再 resume | ❌ 进程死 | ❌ 回桌面 | 1 条/轮: EGL | **挂起加载脚本 → EGL 崩** |
|
||||
| **D** | 正常启动 7s 后 **attach 主进程**(裸, 无脚本) | ❌ 进程死(静默) | ❌ 回桌面 | 0 | **attach 主进程 → msaoaidsec 静默 _exit** |
|
||||
|
||||
### 可重复性: B、C 各单独跑 3 轮 (2026-08-27 06:22~06:26)
|
||||
|
||||
| 轮次 | B (零挂起 spawn) | C (挂起+加载2脚本) |
|
||||
|---|---|---|
|
||||
| r1 | ✅ 存活 25.8s+ UI=Homepage crashes=0 | ⚠️ 存活 26s 但 UI 解析异常 (focus=?), crashes=0 |
|
||||
| r2 | ✅ 存活 25.8s+ UI=Homepage crashes=0 | ❌ +8.5s 进程 None, UI 回桌面, crashes=1 |
|
||||
| r3 | ✅ 存活 25.8s+ UI=Homepage crashes=0 | ❌ +8.4s 进程 None, UI 回桌面, crashes=1 |
|
||||
| 汇总 | **3/3 稳定存活** | **2/3 明确 EGL 崩, 1/3 存活但异常** |
|
||||
|
||||
C 组死亡时间线 (r3 完整轨迹): `+2.1s proc 存活 UI=Homepage → +4.2s pid 换新(KeepAlive 重启) UI 回桌面 → +8.4s 无主进程`; crash buffer:
|
||||
```
|
||||
signal 6 (SIGABRT) Abort message: 'Failed to create context, error = EGL_NOT_INITIALIZED'
|
||||
tid RenderThread, pid <原pid> → com.duowan.kiwi
|
||||
```
|
||||
注: 脚本 OUT 固定为 diag_c.json 每轮覆盖, 最终文件是最后一轮的数据; rounds 输出见 /tmp/diag_{b,c}.log 系列与 evidence/diag_lifecycle/。
|
||||
|
||||
### 关键崩理解读
|
||||
|
||||
**C 组 / 今天早上 v8/v9 的 tombstone (tombstone_24~27) 全部同型:**
|
||||
```
|
||||
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x74206665722060 (ASCII 内容!)
|
||||
#00 __strchr_aarch64+36 / libc.so
|
||||
#01 strstr+24 / libc.so
|
||||
#02 android::egl_display_t::initialize+824 / libEGL.so
|
||||
#03 EglManager::initialize / libhwui.so
|
||||
#04 RenderThread::requireGlContext / libhwui.so
|
||||
```
|
||||
以及 `signal 6 (SIGABRT) Abort message: 'Failed to create context, error = EGL_NOT_INITIALIZED'`
|
||||
→ 崩溃线程是 **RenderThread(EGL 初始化)**, 和 msaoaidsec 无关。
|
||||
|
||||
**为什么会这样 (经 E6/E7 修正):** frida `spawn` 会把进程挂起在非常早期(zygote fork 后、JVM/GL 尚未初始化)。**关键实验 E6/E7: 挂起只 10~18ms、仅加载 1 个补丁脚本, attach 后 RenderThread 仍 100% EGL 崩 (Bad access / Trace/BPT trap, 4/4 轮)** → 说明触发 EGL 崩的**不是挂起时长, 而是 attach 注入本身**(frida agent 初始化与 EGL 显示初始化竞争)。纯 spawn 不 attach (B组) 则完全无此问题。
|
||||
|
||||
**D 组: attach 主进程 = 真 frida 检测。** 裸 attach 无任何 hook, 2~4s 静默死, crash buffer 无记录 → `libmsaoaidsec.so` 检测到 agent 后 `_exit`(RE 仓库 STATUS: `EXIT_SELF`)。这与 EGL 崩是**两条完全独立的死因**。
|
||||
|
||||
### 补充实验 E0~E7: attach 与死因的精确归因 (2026-08-27 06:30~06:36)
|
||||
|
||||
脚本: `scripts/diag_egl_strategy.py`, 证据: `evidence/diag_egl_strategy/egl_strategy.json`
|
||||
|
||||
| case | 做法 | 挂起 | 结果 | 死因 |
|
||||
|---|---|---|---|---|
|
||||
| E0 | spawn→attach(空)→resume | 3ms | ❌ ~2.07s pid换新(KeepAlive) | 静默_exit (msaoaidsec) |
|
||||
| E1 | spawn→attach+mask_frida→resume | 15ms | ❌ ~2.07s pid换新 | 静默_exit (mask无效) |
|
||||
| E3 | spawn→resume (不attach) | 0ms | ✅ 存活30s+ ×2 | — (B组复现) |
|
||||
| E4 | spawn→resume→1.6s后attach | 1673ms | ❌ attach后~2.5s死 | 静默_exit |
|
||||
| E5 | spawn→resume→5s后attach | 5183ms | ❌ attach后~4.1s死 | 静默_exit |
|
||||
| E6 | spawn→attach+art_callsite→resume | 11~18ms | ❌ 4.1s死 ×2 | **EGL崩 (RendererThread)** |
|
||||
| E7 | spawn→attach+art_callsite+mask→resume | 10~12ms | ❌ 4.1s死 ×2 | **EGL崩 (RendererThread)** |
|
||||
|
||||
**结论:**
|
||||
1. **attach 必定触发检测/崩溃**, 无论时机(挂起中 3ms 还是延迟 5s)、无论加载什么脚本、无论挂起多短。空 attach → msaoaidsec 静默 `_exit`; attach+bypass 脚本 → msaoaidsec 的清理路径被补丁掉后转为 EGL 崩溃。
|
||||
2. `mask_frida_maps_only.js` 单独使用**无效**(E1 仍静默死)——RE 仓库的 maps 遮蔽思路在此版 msaoaidsec 的模拟器行为下失败, 仅真机组合(G2-0055 多面)才有效。
|
||||
3. **唯一无外挂存活路径 = 纯 spawn→resume 不 attach**(B组/E3), 代价是无任何 hook 能力。
|
||||
|
||||
### 抓包三策略实测 (v11: scripts/emu_hook_zero_suspend.py, 2026-08-27 06:40)
|
||||
|
||||
| 模式 | 做法 | 结果 |
|
||||
|---|---|---|
|
||||
| zero | 纯spawn→resume (无hook) | ✅ 存活30s+ 但**0事件** (抓不到协议) |
|
||||
| stale | 挂起中加载art_callsite+mask→resume→+0.5s挂hook | ⚠️ 存活~4.2s: **55事件 + actionV=234548246275beedf8d93a242ef50e8f1178c3b2** (GC3VE真实身份) → 随后EGL崩 KeepAlive换pid |
|
||||
| race | resume后2s attach+2脚本+hook | ❌ attach后~2.2s静默死: 17事件(早期RESP) 无actionV |
|
||||
|
||||
**→ 抓包能力排序: stale > race > zero。** stale 在死前窗口(约4s)能完整抓到 dfpReport+actionV+dckey 链路(evidence: /tmp/v11_stale.json, 55事件), 与历史成功的 `hook_emu_stable.py`/`emu_spawn_bypass_dfp.json` 一致——**"抓帧即成功, App 随后崩是固有代价"**。race 模式(B组存活后延迟 attach)被 msaoaidsec 静默杀, 抓不到关键帧。
|
||||
|
||||
---
|
||||
|
||||
## 二、历史"成功"记录的真相 (为什么之前以为 attach 能用)
|
||||
|
||||
- `evidence/emu_attach_full.json` (08-26 20:33, 48 事件) 是**当时 attach 脚本的产物**——但当时脚本用
|
||||
```python
|
||||
for p in d.enumerate_processes():
|
||||
if 'kiwi' in p.name or 'duowan' in p.name: # ← 致命
|
||||
```
|
||||
frida 枚举里**主进程 name 显示为 "虎牙直播"**, 只有 `com.duowan.kiwi:cloudpatch`/`:logcat` 含 "kiwi" 字样。
|
||||
**→ 当时 attach 到的是 cloudpatch 子进程, 从未真正 hook 主进程。** 所谓"模拟器 attach 不崩"是子进程的假象。
|
||||
- `hook_emu_stable.py`/`spawn_g2055_survival.py` 的 spawn 成功: 实质是 **spawn 后挂起很短(只 load 2 个极快脚本)就 resume**, 命中"低挂起存活窗口"; 但 `spawn_survival.json` 也记录了 4 轮里 6s/6s/6s/3s 全死——大部分轮次仍触发 EGL 崩, 只是脚本在死前刚好抓到 dfp 报文就算"成功"。
|
||||
- **结论校准**: spawn 路线历史上"成功即抓到 dfp"并非稳定存活, 而是抢在 EGL 崩之前的窗口抓到数; 本次 C 组 3 轮 2 崩也验证了这一点。真正稳定的是 B 组(零挂起)。
|
||||
|
||||
---
|
||||
|
||||
## 三、"验证码无法正常加载"的机制与实测
|
||||
|
||||
### 3.1 登录验证码的真实链路 (本次实测)
|
||||
|
||||
1. 账号密码页点"立即登录" → 弹协议 → 同意 → 进入 **`OakVerifyActivity`** (com.huya.kiwi.crossplatform.common.webview.verification)
|
||||
2. 内部是 **WebView 加载极验/数美 H5 验证页**, 日志可见验证码 SDK 类 `cn.fly.verify.*` (数美 fly verify), UI 出现 **"安全验证 / 请拖动下方滑块完成拼图"**
|
||||
3. 单次流程可见 dfpReport(3800B) → actionV → dckey(744B) 链路照常上报
|
||||
|
||||
### 3.2 实测结论 (模拟器 GC3VE)
|
||||
|
||||
- **无 frida (A 组)**: 账号密码登录 → 滑块验证码**完整加载**(UI dump 出现"请拖动下方滑块完成拼图"+ WebView 容器)。→ **验证码不加载不是模拟器环境的锅**。
|
||||
- 之前"验证码不加载"发生的场景 = App 在 **frida 挂起/attach 被检测**的状态下启动或运行, 或 msaoaidsec 检测到 agent 后 App 处于被风控标记状态(行为上报 Poseidon/dfp collection 带 `hooked:...` 字段, 服务端不下发验证 H5)。
|
||||
- 推论: **登录流程不要带 frida**; 需要 hook 取证时, 用"零挂起 spawn + 抓完即杀"。
|
||||
|
||||
### 3.3 模拟器检测面 (本次静态+动态确认)
|
||||
|
||||
| 层 | 检测内容 | 证据 |
|
||||
|---|---|---|
|
||||
| Java 层 | `/dev/qemu_pipe`, `/dev/socket/qemud`, `/sys/qemu_trace`, `/system/bin/qemu-props`, `libc_malloc_debug_qemu.so` | classes.dex 字符串; `ryxq.nuj.F()` |
|
||||
| Java 层 | `Build.HARDWARE/PRODUCT/FINGERPRINT/BRAND` goldfish/sdk/generic, `ro.kernel.qemu` | `ryxq.xzj.c()/q()`, `ryxq.nuj.L()/N()` |
|
||||
| Java 层 | `/system/build.prop`, `/proc/tty/drivers`, `/proc/cpuinfo` goldfish | `ryxq.nuj.J()` |
|
||||
| Java 层 | su 文件 (`/system/bin/su` 等 5 路径) | `ryxq.xzj.e()` |
|
||||
| Native | `KH_NSDKThreadDe` 线程读 `/system/etc/mumu-configs/currentApp` 等 MuMu 特有路径 (logcat avc 可证) | libnsdt.so |
|
||||
| UI | 服务端下发 `EmulatorCard` (HUYA.EmulatorCard) 组件 | classes8/9 dex |
|
||||
| 配置式 | "Get emulator files feature from config / model feature from config" (可从远程配置增删检测项) | classes6.dex |
|
||||
|
||||
本机现状: MuMu 的 `fakeProductInfoIfNeed` 对 com.duowan.kiwi **未匹配**任何伪装模板 → App 看到的 build 属性是**原始 qemu 泄漏**:
|
||||
```
|
||||
ro.build.hv.platform=qemu ← 明显泄漏
|
||||
qemu.hw.mainkeys=1
|
||||
```
|
||||
其余 (ro.kernel.qemu 等) 已由 MuMu 内核隐藏。**Java 层 goldfish/su 检查当前在 GC3VE 上不命中**(brand=Google, fingerprint=release-keys, su 被 Magisk hide 处理), 所以无 frida 时 App 照常给验证码。
|
||||
|
||||
---
|
||||
|
||||
## 四、最终结论与可用操作路径
|
||||
|
||||
### 事实矩阵 (v11 实测修正: 2026-08-27 06:40)
|
||||
|
||||
| 想要做的事情 | 正确做法 | 实测 |
|
||||
|---|---|---|
|
||||
| App 在模拟器上正常启动/正常登录/验证码加载 | **完全不要 attach frida** | A 组: 100% 正常, 验证码完整加载 |
|
||||
| 仅在模拟器取证抓 dfpReport / hdid / 协议帧 | **stale 模式**: spawn 挂起中加载 art_callsite+mask → resume → 尽快挂 SSL hook | v11 stale: 存活~4.2s, 55事件+actionV 完整链路, 随后 EGL 崩属固有代价 |
|
||||
| 用 frida attach 主进程长时 hook | **当前不可行** (任何 attach 均死: 空attach静默_exit / attach+bypass=EGL崩) | E0~E7 全灭, 与挂起时长/时机无关 |
|
||||
| 纯 spawn 不 attach | 可稳定存活(无 hook 能力), 适合验证 App 本身状态 | B组/E3: 3/3+2/2 存活 |
|
||||
| 长时间 hook 主进程 | 未达成 | 需解决 masaoaidsec (RE 仓库 B-G2-0001 阻塞仍开放) 或换非 frida 注入 |
|
||||
|
||||
### 给登录/验证码流程的操作要求
|
||||
|
||||
1. **登录页面(UIs): 全程不启 frida。** 验证码走 `OakVerifyActivity` 原生 WebView, 与 hook 无关。
|
||||
2. **取证抓包: 用 stale 模式单独一次 spawn** (`emu_hook_zero_suspend.py --mode stale`), 死前窗口(约4s)即可抓到 dfpReport/actionV, 抓完 App 自然崩/被杀, 再正常启动走登录。**不要用 race/attach 方式**(静默死还抓不到关键帧)。
|
||||
3. 若见"验证码空白/不加载": 先 `am force-stop` + 正常重启 App 再试(清除 frida 痕迹); 若仍空白, 查 `logcat -b crash` 是否 EGL tombstone(挂起残留), 不是的话多半是服务端风控(行为上报带 hook 标记), 需要换干净设备身份。
|
||||
|
||||
### 复用脚本 (本次新增/更新)
|
||||
|
||||
- `scripts/diag_lifecycle.py` — 四组存活/闪退/崩溃对照诊断器 (A/B/C/D), 输出 JSON 证据
|
||||
- `scripts/diag_egl_strategy.py` — E0~E7 attach 归因实验 (空attach/mask/art_callsite/延迟attach)
|
||||
- `scripts/watch_proc_v2.py` — 主进程存活监控 (cmdline 精确匹配, 不用 frida enumerate)
|
||||
- `scripts/emu_hook_zero_suspend.py` — **v11 三策略抓包**: `--mode zero|race|stale` (推荐 stale 抓帧)
|
||||
- `scripts/emu_spawn_captcha_test.py` — spawn+bypass 下验证码加载对照 (结论: spawn 挂起偶发 EGL 崩, 登录勿用)
|
||||
- `scripts/emu_attach_captcha_test.py` — attach 三件套对照 (结论: attach 主进程必死, 勿用于登录)
|
||||
- `scripts/hook_emu_stable.py` — 既有: spawn+极短挂起抓 dfpReport (stale 模式同款, 可用)
|
||||
|
||||
### 下一步(按价值排序)
|
||||
|
||||
1. **P0 ✅完成** 抓包脚本 v11 三策略落地: stale=抓帧正解(zero存活不可抓, race被静默杀)
|
||||
2. **P1** 验证纯 Python 登录链再次打通 (不依赖模拟器 UI, 项目已有零设备链路) — 作为不碰 frida 的正路
|
||||
3. **P2** 若确需长时 hook: 深入 masaoaidsec (RE 仓库 G2 系列, 模拟器与真机版本差异), 或换用非 frida 注入 (ptrace-free/gdb), 或尝试 masaoaidsec 检测线程启动前的时间窗 (数据: msaoaid 检测在 App 启动 ~2s 内完成, attach 窗口<2s 理论存在但 E4 已证 1.6s attach 仍死, 需 <1s 超早 attach 验证)
|
||||
|
||||
---
|
||||
|
||||
## 附录 A: 本次使用的判定代码要点
|
||||
|
||||
```python
|
||||
def main_pid():
|
||||
# 唯一可信: /proc/<pid>/cmdline 精确等于包名
|
||||
for p in adb pidof 的所有 pid:
|
||||
if cat /proc/<p>/cmdline == "com.duowan.kiwi": return p
|
||||
|
||||
def focus_ok():
|
||||
m = re.search(r"mCurrentFocus=Window\{([^}]+)\}", dumpsys window)
|
||||
return PACKAGE in m.group(1) # 注意 u0/窗口hash在花括号内
|
||||
|
||||
# 崩溃: logcat -d -b crash | grep -E 'Fatal|signal|Abort message'
|
||||
```
|
||||
|
||||
## 附录 B: 相关既有文档
|
||||
|
||||
- `docs/dfpReport破解进度.md` 第十四~十六节 (模拟器探索/EGL 崩溃原始记录)
|
||||
- RE 仓库 `STATUS.md` B-G2-0001 (msaoaidsec EXIT_SELF 阻塞) / G2-0055 (maps/ELF 部分绕过)
|
||||
@@ -0,0 +1,509 @@
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"boss": {
|
||||
"dead": [
|
||||
true,
|
||||
true,
|
||||
true
|
||||
],
|
||||
"alive_seconds": [
|
||||
25.0,
|
||||
24.8,
|
||||
24.7
|
||||
],
|
||||
"focus_fail_count": [
|
||||
32,
|
||||
32,
|
||||
32
|
||||
],
|
||||
"modes_ok": 0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"round": 1,
|
||||
"ts": "2026-08-27T08:07:27",
|
||||
"pid_attach": 11521,
|
||||
"last_focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"alive_seconds": 25.0,
|
||||
"no_agent_messages": true,
|
||||
"died_offsets": [
|
||||
3.2,
|
||||
3.8
|
||||
],
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"old": 11521,
|
||||
"new": 12495
|
||||
}
|
||||
],
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 7.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 9.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 11.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 13.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 17.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 25.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
}
|
||||
],
|
||||
"dead": true,
|
||||
"dead_at": 3.2165350914001465,
|
||||
"focus_fail_count": 32,
|
||||
"crash_lines": [],
|
||||
"exit_info": [
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"pid=11521",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)"
|
||||
],
|
||||
"agent_events": []
|
||||
},
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"round": 2,
|
||||
"ts": "2026-08-27T08:07:56",
|
||||
"pid_attach": 13742,
|
||||
"last_focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"died_offsets": [
|
||||
3.3,
|
||||
3.9
|
||||
],
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"old": 13742,
|
||||
"new": 14718
|
||||
}
|
||||
],
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 4.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 7.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 9.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 11.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 13.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 17.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
}
|
||||
],
|
||||
"dead": true,
|
||||
"dead_at": 3.239048957824707,
|
||||
"focus_fail_count": 32,
|
||||
"crash_lines": [],
|
||||
"exit_info": [
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"pid=13742",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)"
|
||||
],
|
||||
"agent_events": []
|
||||
},
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"round": 3,
|
||||
"ts": "2026-08-27T08:08:25",
|
||||
"pid_attach": 15980,
|
||||
"last_focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"alive_seconds": 24.7,
|
||||
"no_agent_messages": true,
|
||||
"died_offsets": [
|
||||
3.2,
|
||||
3.8
|
||||
],
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 4.3,
|
||||
"old": 15980,
|
||||
"new": 16932
|
||||
}
|
||||
],
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 7.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 9.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 11.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 13.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 17.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
}
|
||||
],
|
||||
"dead": true,
|
||||
"dead_at": 3.167646884918213,
|
||||
"focus_fail_count": 32,
|
||||
"crash_lines": [],
|
||||
"exit_info": [
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"pid=15980",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)"
|
||||
],
|
||||
"agent_events": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"boss": {
|
||||
"dead": [
|
||||
false,
|
||||
false,
|
||||
false
|
||||
],
|
||||
"alive_seconds": [
|
||||
24.8,
|
||||
24.7,
|
||||
24.8
|
||||
],
|
||||
"focus_fail_count": [
|
||||
3,
|
||||
2,
|
||||
2
|
||||
],
|
||||
"modes_ok": 3
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"round": 1,
|
||||
"ts": "2026-08-27T08:06:06",
|
||||
"pid_spawn": 7424,
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 0.7,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 1.3,
|
||||
"focus": "?"
|
||||
}
|
||||
],
|
||||
"last_focus": "6f653e2 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 3,
|
||||
"agent_events": []
|
||||
},
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"round": 2,
|
||||
"ts": "2026-08-27T08:06:33",
|
||||
"pid_spawn": 8782,
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 0.7,
|
||||
"focus": "?"
|
||||
}
|
||||
],
|
||||
"last_focus": "195cc62 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.7,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 2,
|
||||
"agent_events": []
|
||||
},
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"round": 3,
|
||||
"ts": "2026-08-27T08:07:00",
|
||||
"pid_spawn": 10139,
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 0.7,
|
||||
"focus": "?"
|
||||
}
|
||||
],
|
||||
"last_focus": "334b54a u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 2,
|
||||
"agent_events": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"round": 1,
|
||||
"ts": "2026-08-27T08:07:27",
|
||||
"pid_attach": 11521,
|
||||
"last_focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"alive_seconds": 25.0,
|
||||
"no_agent_messages": true,
|
||||
"died_offsets": [
|
||||
3.2,
|
||||
3.8
|
||||
],
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"old": 11521,
|
||||
"new": 12495
|
||||
}
|
||||
],
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 7.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 9.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 11.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 13.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 17.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 25.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
}
|
||||
],
|
||||
"dead": true,
|
||||
"dead_at": 3.2165350914001465,
|
||||
"focus_fail_count": 32,
|
||||
"crash_lines": [],
|
||||
"exit_info": [
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"pid=11521",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)"
|
||||
],
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"round": 2,
|
||||
"ts": "2026-08-27T08:07:56",
|
||||
"pid_attach": 13742,
|
||||
"last_focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"died_offsets": [
|
||||
3.3,
|
||||
3.9
|
||||
],
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"old": 13742,
|
||||
"new": 14718
|
||||
}
|
||||
],
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 4.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 7.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 9.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 11.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 13.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 17.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.5,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
}
|
||||
],
|
||||
"dead": true,
|
||||
"dead_at": 3.239048957824707,
|
||||
"focus_fail_count": 32,
|
||||
"crash_lines": [],
|
||||
"exit_info": [
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"pid=13742",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)"
|
||||
],
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
{
|
||||
"mode": "attach-bare",
|
||||
"round": 3,
|
||||
"ts": "2026-08-27T08:08:25",
|
||||
"pid_attach": 15980,
|
||||
"last_focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"alive_seconds": 24.7,
|
||||
"no_agent_messages": true,
|
||||
"died_offsets": [
|
||||
3.2,
|
||||
3.8
|
||||
],
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 4.3,
|
||||
"old": 15980,
|
||||
"new": 16932
|
||||
}
|
||||
],
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 4.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 5.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.2,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 6.8,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 7.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 8.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 9.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 10.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 11.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 12.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 13.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 14.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 15.9,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 16.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 17.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 18.6,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 19.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 20.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 21.3,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.0,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 22.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 23.4,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.1,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
{
|
||||
"t": 24.7,
|
||||
"focus": "83b6431 u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
}
|
||||
],
|
||||
"dead": true,
|
||||
"dead_at": 3.167646884918213,
|
||||
"focus_fail_count": 32,
|
||||
"crash_lines": [],
|
||||
"exit_info": [
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"pid=15980",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)",
|
||||
"reason=1 (EXIT_SELF)"
|
||||
],
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"round": 1,
|
||||
"ts": "2026-08-27T08:06:06",
|
||||
"pid_spawn": 7424,
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 0.7,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 1.3,
|
||||
"focus": "?"
|
||||
}
|
||||
],
|
||||
"last_focus": "6f653e2 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 3,
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"round": 2,
|
||||
"ts": "2026-08-27T08:06:33",
|
||||
"pid_spawn": 8782,
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 0.7,
|
||||
"focus": "?"
|
||||
}
|
||||
],
|
||||
"last_focus": "195cc62 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.7,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 2,
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"mode": "spawn-bare",
|
||||
"round": 3,
|
||||
"ts": "2026-08-27T08:07:00",
|
||||
"pid_spawn": 10139,
|
||||
"focus_goes_away": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"focus": "?"
|
||||
},
|
||||
{
|
||||
"t": 0.7,
|
||||
"focus": "?"
|
||||
}
|
||||
],
|
||||
"last_focus": "334b54a u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 2,
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mode": "spawn-trace",
|
||||
"round": 1,
|
||||
"ts": "2026-08-27T08:08:54",
|
||||
"pid_spawn": 18159,
|
||||
"last_pong": null,
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"old": 18159,
|
||||
"new": 18338
|
||||
}
|
||||
],
|
||||
"last_focus": "b71a0b5 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.5,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 0,
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mode": "spawn-trace",
|
||||
"round": 2,
|
||||
"ts": "2026-08-27T08:09:46",
|
||||
"pid_spawn": 19786,
|
||||
"last_pong": null,
|
||||
"pid_changed_at": [
|
||||
{
|
||||
"t": 0.1,
|
||||
"old": 19786,
|
||||
"new": 19964
|
||||
}
|
||||
],
|
||||
"last_focus": "48d191b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"alive_seconds": 24.8,
|
||||
"no_agent_messages": true,
|
||||
"dead": false,
|
||||
"dead_at": null,
|
||||
"focus_fail_count": 0,
|
||||
"agent_events": []
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"mode": "A",
|
||||
"ts": "08:13:32",
|
||||
"pid_spawn": 24236,
|
||||
"resumed": true,
|
||||
"last_alive_sec": 0.13,
|
||||
"maps_at_death": [],
|
||||
"died_at": 0.51,
|
||||
"markers": [
|
||||
"7cec82a000-7cecee0000 r--p 00000000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cecee1000-7cedccf000 r-xp 006b6000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cedccf000-7cedd6a000 r--p 014a3000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cedd6a000-7cedd81000 rw-p 0153d000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7fb71ca000-7fb722e000 rw-p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb7f17000-7fb7fdf000 r--p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb802d000-7fb8091000 r--p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb810f000-7fb8173000 r--p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb9185000-7fb91bd000 r--p 00000000 08:01 375 /apex/com.android.runtime/bin/linker64",
|
||||
"7fb91bd000-7fb92a8000 r-xp 00038000 08:01 375 /apex/com.android.runtime/bin/linker64",
|
||||
"7fb92a8000-7fb92b1000 r--p 00123000 08:01 375 /apex/com.android.runtime/bin/linker64",
|
||||
"7fb92b1000-7fb92b3000 rw-p 0012b000 08:01 375 /apex/com.android.runtime/bin/linker64"
|
||||
],
|
||||
"first_marker_at": 0.13,
|
||||
"agent_marker_at": 0.13,
|
||||
"msgs": []
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"mode": "B",
|
||||
"ts": "08:13:48",
|
||||
"pid_spawn": 25632,
|
||||
"resumed": true,
|
||||
"last_alive_sec": 0.12,
|
||||
"maps_at_death": [],
|
||||
"died_at": 0.49,
|
||||
"markers": [
|
||||
"7cec82a000-7cecee0000 r--p 00000000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cecee1000-7cedccf000 r-xp 006b6000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cedccf000-7cedd6a000 r--p 014a3000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cedd6a000-7cedd81000 rw-p 0153d000 08:13 262157 /data/local/tmp/re.frida.server/frida-agent-64.so",
|
||||
"7cf416c000-7cf41d0000 rw-p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb71ca000-7fb722e000 rw-p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb7f17000-7fb7fdf000 r--p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb802d000-7fb8091000 r--p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb810f000-7fb8173000 r--p 00000000 00:00 0 [anon:linker_alloc]",
|
||||
"7fb9185000-7fb91bd000 r--p 00000000 08:01 375 /apex/com.android.runtime/bin/linker64",
|
||||
"7fb91bd000-7fb92a8000 r-xp 00038000 08:01 375 /apex/com.android.runtime/bin/linker64",
|
||||
"7fb92a8000-7fb92b1000 r--p 00123000 08:01 375 /apex/com.android.runtime/bin/linker64",
|
||||
"7fb92b1000-7fb92b3000 rw-p 0012b000 08:01 375 /apex/com.android.runtime/bin/linker64"
|
||||
],
|
||||
"first_marker_at": 0.12,
|
||||
"agent_marker_at": 0.12,
|
||||
"msgs": [
|
||||
{
|
||||
"type": "send",
|
||||
"payload": {
|
||||
"ev": "hello-before"
|
||||
},
|
||||
"desc": "None"
|
||||
},
|
||||
{
|
||||
"type": "send",
|
||||
"payload": {
|
||||
"ev": "hello-msaoaid-present",
|
||||
"present": false
|
||||
},
|
||||
"desc": "None"
|
||||
},
|
||||
{
|
||||
"type": "send",
|
||||
"payload": {
|
||||
"ev": "hello-after"
|
||||
},
|
||||
"desc": "None"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
[
|
||||
{
|
||||
"case": "E0",
|
||||
"round": 1,
|
||||
"pid": 3509,
|
||||
"suspend_ms": 3.0,
|
||||
"died_at_s": null,
|
||||
"pid_changed": [
|
||||
3686,
|
||||
2.1189770698547363
|
||||
],
|
||||
"egl_crash": false,
|
||||
"crash_banner": false,
|
||||
"crash_tail": ""
|
||||
},
|
||||
{
|
||||
"case": "E0",
|
||||
"round": 2,
|
||||
"pid": 4650,
|
||||
"suspend_ms": 2.3,
|
||||
"died_at_s": null,
|
||||
"pid_changed": [
|
||||
4828,
|
||||
2.055964946746826
|
||||
],
|
||||
"egl_crash": false,
|
||||
"crash_banner": false,
|
||||
"crash_tail": ""
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,30 @@
|
||||
[
|
||||
{
|
||||
"case": "E0",
|
||||
"round": 1,
|
||||
"pid": 5793,
|
||||
"suspend_ms": 2.3,
|
||||
"died_at_s": null,
|
||||
"pid_changed": [
|
||||
5969,
|
||||
2.057939052581787
|
||||
],
|
||||
"egl_crash": false,
|
||||
"crash_banner": false,
|
||||
"crash_tail": ""
|
||||
},
|
||||
{
|
||||
"case": "E0",
|
||||
"round": 2,
|
||||
"pid": 6854,
|
||||
"suspend_ms": 1.9,
|
||||
"died_at_s": null,
|
||||
"pid_changed": [
|
||||
7023,
|
||||
2.055922269821167
|
||||
],
|
||||
"egl_crash": false,
|
||||
"crash_banner": false,
|
||||
"crash_tail": ""
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,30 @@
|
||||
[
|
||||
{
|
||||
"case": "E0",
|
||||
"round": 1,
|
||||
"pid": 5793,
|
||||
"suspend_ms": 2.3,
|
||||
"died_at_s": null,
|
||||
"pid_changed": [
|
||||
5969,
|
||||
2.057939052581787
|
||||
],
|
||||
"egl_crash": false,
|
||||
"crash_banner": false,
|
||||
"crash_tail": ""
|
||||
},
|
||||
{
|
||||
"case": "E0",
|
||||
"round": 2,
|
||||
"pid": 6854,
|
||||
"suspend_ms": 1.9,
|
||||
"died_at_s": null,
|
||||
"pid_changed": [
|
||||
7023,
|
||||
2.055922269821167
|
||||
],
|
||||
"egl_crash": false,
|
||||
"crash_banner": false,
|
||||
"crash_tail": ""
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "A",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": false,
|
||||
"focus": "?",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.5
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.6
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.7
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.0
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.4
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "A",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.5
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.6
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.7
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.8
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.0
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.4
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "A",
|
||||
"proc": 27830,
|
||||
"ui_ok": true,
|
||||
"focus": "cafac74 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "A",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.4
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.5
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.6
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.8
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 16.9
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.2
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "A",
|
||||
"proc": 29397,
|
||||
"ui_ok": true,
|
||||
"focus": "8ea3c56 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "A",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": false,
|
||||
"focus": "?",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.5
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.6
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.7
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.0
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.1
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.3
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.4
|
||||
},
|
||||
{
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "A",
|
||||
"proc": 30538,
|
||||
"ui_ok": true,
|
||||
"focus": "b93616e u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "B",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.3
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.6
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.7
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.8
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.0
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.2
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.3
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "B",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.5
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.7
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.8
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.0
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.2
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.3
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.5
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.6
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "B",
|
||||
"proc": 31586,
|
||||
"ui_ok": true,
|
||||
"focus": "95147fe u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "B",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.5
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.6
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.8
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.1
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.2
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.5
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.6
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "B",
|
||||
"proc": 507,
|
||||
"ui_ok": true,
|
||||
"focus": "6ad845b u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"case": "B",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 4.3
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 6.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 8.6
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 10.7
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 12.8
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 14.9
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 17.0
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 19.2
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 21.3
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 23.4
|
||||
},
|
||||
{
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 25.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "B",
|
||||
"proc": 1574,
|
||||
"ui_ok": true,
|
||||
"focus": "c24af65 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"case": "C",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "C",
|
||||
"proc": 4887,
|
||||
"ui_ok": true,
|
||||
"focus": "1a9dd79 u0 com.duowan.kiwi/com.duowan.kiwi.homepage.Homepage",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "C",
|
||||
"proc": 5694,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "C",
|
||||
"proc": 5694,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 6.3
|
||||
},
|
||||
{
|
||||
"label": "C",
|
||||
"proc": null,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 8.4
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "C",
|
||||
"proc": null,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
"crashes_in_buffer": 1,
|
||||
"crash_tail": "UG : Cmdline: com.duowan.kiwi\n08-27 06:24:39.178 5675 5675 F DEBUG : pid: 4887, tid: 5207, name: RenderThread >>> com.duowan.kiwi <<<\n08-27 06:24:39.178 5675 5675 F DEBUG : uid: 10052\n08-27 06:24:39.178 5675 5675 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------\n08-27 06:24:39.178 5675 5675 F DEBUG : Abort message: 'Failed to create context, error = EGL_NOT_INITIALIZED'\n08-27 06:24:39.178 5675 5675 F DEBUG : x0 0000000000000000 x1 0000000000001457 x2 0000000000000006 x3 0000000000000000\n08-27 06:24:39.178 5675 5675 F DEBUG : x4 0000000000000000 x5 0000000000000000 x6 0000000000000000 x7 00000076fadba010\n08-27 06:24:39.178 5675 5675 F DEBUG : x8 0000000000000083 x9 0000000000000040 x10 0000000000000990 x11 000000000000000b\n08-27 06:24:39.178 5675 5675 F DEBUG : x12 00000000ffffffff x13 0000000000000000 x14 0000000000000004 x15 3f0ef2fffdffffff\n08-27 06:24:39.178 5675 5675 F DEBUG : x16 00000076f06605a8 x17 00000076f063c370 x18 000000733dcee000 x19 0000007394628f10\n08-27 06:24:39.178 5675 5675 F DEBUG : x20 0000000000000006 x21 00000002000b80a8 x22 0000007394628b10 x23 0000007394628b90\n08-27 06:24:39.178 5675 5675 F DEBUG : x24 0000000000000000 x25 00000076f0535ce0 x26 00000076f1aff14c x27 0000007452017000\n08-27 06:24:39.178 5675 5675 F DEBUG : x28 b400007472ee2a50 x29 0000007394628b30\n08-27 06:24:39.178 5675 5675 F DEBUG : lr 000000732"
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"case": "D",
|
||||
"timeline": [
|
||||
{
|
||||
"label": "D",
|
||||
"proc": null,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 2.1
|
||||
},
|
||||
{
|
||||
"label": "D",
|
||||
"proc": 29045,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 4.2
|
||||
},
|
||||
{
|
||||
"label": "D",
|
||||
"proc": 29045,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 6.4
|
||||
},
|
||||
{
|
||||
"label": "D",
|
||||
"proc": null,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher",
|
||||
"elapsed": 8.5
|
||||
}
|
||||
],
|
||||
"final": {
|
||||
"label": "D",
|
||||
"proc": null,
|
||||
"ui_ok": false,
|
||||
"focus": "308302d u0 app.lawnchair/app.lawnchair.LawnchairLauncher"
|
||||
},
|
||||
"crashes_in_buffer": 0,
|
||||
"crash_tail": ""
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,100 @@
|
||||
{
|
||||
"props": [
|
||||
"gsm.sim.operator.numeric\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd`Q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdx\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010\b\r\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd7\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010}\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd-\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u031f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"gsm.sim.operator.numeric\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffdST\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdg/Xl`\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"gsm.sim.state.2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdoptimize\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdC#\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdBC\ufffdCN_#Hans\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdtbl_name\ufffdtext\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\f\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdicudt68l-coll\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdzh_Hans\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdname\ufffdtext\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"gsm.sim.state.2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdu\ufffd\ufffd\ufffd\ufffd3\u02a1w\ufffd\ufffd\ufffd\u0001\u0011\ufffd\ufffd\ufffd\ufffd^Z\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd0\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdl\ufffd\ufffdu\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdrw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdns_timing\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffdq1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffdu\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"gsm.sim.state\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdoptimize\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdC#\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdBC\ufffdCN_#Hans\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdtbl_name\ufffdtext\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\f\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdicudt68l-coll\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdzh_Hans\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdname\ufffdtext\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"gsm.sim.state\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdu\ufffd\ufffd\ufffd\ufffd3\u02a1w\ufffd\ufffd\ufffd\u0001\u0011\ufffd\ufffd\ufffd\ufffd^Z\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd0\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdl\ufffd\ufffdu\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdrw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdns_timing\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffdq1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffdu\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.debug.flexible_insets\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd+\ufffdv\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdad\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`$\u0371v\ufffd\ufffd\ufffd\ufffdl\u03b1v\ufffd\ufffd\ufffd0\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffd\ufffd\u06f1v\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffds\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd--inline-max-code-units=_\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd(\n\ufffd\u0011w\ufffd\ufffd\ufffd",
|
||||
"persist.debug.sqlite.close_idle_connections\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\u0002\ufffd\ufffd\ufffd\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\u0015$y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0011w\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdaceF \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdializer\ufffd\u0003\u0001\u0003\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdKT_M-PL-MP-fvv_cms_1\ufffdt managed peer>\ufffd.jar\ufffdjava/\ufffd\u0003\ufffd\u0002\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdov\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\u0001\u0003\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.CompatibilityChangeReporter\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR@\u0003\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`\ft\u0015\ufffd\ufffd\ufffd\ufffdp\nt\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\rt\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdu\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\b\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\b\ufffd\ufffdv\ufffd\ufffd\ufffd S\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffdu\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd0\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.CompatibilityChangeReporter\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdxw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdV\ufffd\u0012\ufffd\ufffd\ufffd\ufffd`W\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u06f1v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdyw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u06f1v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.ConnectivityManager\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffd\u0005t\"v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\bt\"v\ufffd\ufffd\ufffd\ufffd\rt\"v\ufffd\ufffd\ufffd\u0001\ufffd8\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0t\"v\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\u001a\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\u0006t\"v\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\u001a\ufffd\ufffdv\ufffd\ufffd\ufffd`\u001e\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd/t\"v\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.ConnectivityManager\ufffd\u007f\ufffd\ufffd\ufffd/\u000b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdpw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffdrw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffdpuw\ufffd\u007f\ufffd\ufffd\ufffd8rw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0qw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\u0018rw\ufffd\u007f\ufffd\ufffd\ufffdhrw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.CursorWindowStats\ufffdw\ufffd\u007f\ufffd\ufffd\ufffdl\ufffdu%y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdiw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffdPmw\ufffd\u007f\ufffd\ufffd\ufffd\u0010mw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd%8q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdG\u0014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0jw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\u0018kw\ufffd\u007f\ufffd\ufffd\ufffd,mw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.EventBus\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRPa\ufffdLv\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffdc\ufffdLv\ufffd\ufffd\ufffdxc\ufffdLv\ufffd\ufffd\ufffd\ufffdc\ufffdLv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffdLv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\u0261v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffda\ufffdLv\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\u0261v\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdo\ufffdLv\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd0C\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.EventBus\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRPa\ufffdLv\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffdc\ufffdLv\ufffd\ufffd\ufffdxc\ufffdLv\ufffd\ufffd\ufffd\ufffdc\ufffdLv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffdLv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0261v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffda\ufffdLv\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0261v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdo\ufffdLv\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd0C\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.EventBus\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffd]w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd `w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd_w\ufffd\u007f\ufffd\ufffd\ufffd\b`w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\u0321v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP^w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\u0321v\ufffd\ufffd\ufffd0\ufffd\u0017\u0012w\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.GraphicsEnvironment\ufffdy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdww\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\u0006\u000eq\ufffd\ufffd\ufffd\ufffd0\ufffd|\u0013\ufffd\ufffd\ufffd\ufffd\b\ufffd\tq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u043d\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@xw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\f\ufffd}(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u043d\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.Java2C_xlog::\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdcw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd@iw\ufffd\u007f\ufffd\ufffd\ufffd@jw\ufffd\u007f\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@jw\ufffd\u007f\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu^4Ev\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdhw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffdx\fFy\ufffd\ufffd\ufffd\ufffd^4Ev\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdu^4Ev\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.MLInitializerProvider\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0010pw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdpw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdM\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.MMKV\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0010Tw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd[w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\\w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffdZw\ufffd\u007f\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd1`\ufffdAv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`Yw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffdp\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdo\ufffdAv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd1`\ufffdAv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.duowan.kiwi/fil",
|
||||
"persist.log.tag.MMKV\ufffd\ufffd\ufffd\ufffd\ufffd`D\u0014\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffd[w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`cw\ufffd\u007f\ufffd\ufffd\ufffd`dw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffdPbw\ufffd\u007f\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd1`\ufffdAv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffdp\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdo\ufffdAv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd1`\ufffdAv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.duowan.kiwi/fil",
|
||||
"persist.log.tag.MMKV\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR@Nw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0010Uw\ufffd\u007f\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd1`\ufffdAv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdSw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffdh\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffdo\ufffdAv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd1`\ufffdAv\ufffd\ufffd\ufffd\ufffdUw\ufffd\u007f\ufffd\ufffd\ufffdxTw\ufffd\u007f\ufffd\ufffd\ufffd`Tw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.NSDT\ufffd\ufffd\ufffd\ufffdl\ufffdz%y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffd\u000ew\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd@M\u0005v\ufffd\ufffd\ufffd\f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdT\u001aFy\ufffd\ufffd\ufffdx\u0015w\ufffd\u007f\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\\\\I\u0005v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\u0014w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\ufffdPI\u0005v\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd\\\\I\u0005v\ufffd\ufffd\ufffd\ufffd%w\ufffd\u007f\ufffd\ufffd\ufffd\u0010\u0015w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\u0015w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.NemuJavaHotPatchHelper\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdxw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd {w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdV\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\u0001\ufffd8\b\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd03\u0731v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010yw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd03\u0731v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.NetworkManagementSocketTagger\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffd&@@v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\u0010,@@v\ufffd\ufffd\ufffd\ufffd\ufffd\u0013q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@@@v\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`'@@v\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffdRp\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd?@@v\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.NetworkSecurityConfig\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdww\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffd\nq\ufffd\ufffd\ufffd\ufffd8\ufffd\u000bq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd xw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffdRp\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.SQLiteLog\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdaw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd@cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffd\u0010fw\ufffd\u007f\ufffd\ufffd\ufffd0cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u02a1v\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0bw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u02a1v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\u0018cw\ufffd\u007f\ufffd\ufffd\ufffd8cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffdD\ufffd%\ufffdv\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.SQLiteStatements\ufffdcw\ufffd\u007f\ufffd\ufffd\ufffd\u0410\ufffd\u0001w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdaw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd@cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffdv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0bw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\u0018cw\ufffd\u007f\ufffd\ufffd\ufffd8cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.SQLiteTime\ufffd\u0001w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdaw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd@cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u02a1v\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0bw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u02a1v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\u0018cw\ufffd\u007f\ufffd\ufffd\ufffd8cw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffdh\ufffd%\ufffdv\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.StorageManager\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR`HAyv\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffdIAyv\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffd\ufffdLAyv\ufffd\ufffd\ufffd\ufffdIAyv\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\u0261v\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdHAyv\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\u0261v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP&\ufffdQw\ufffd\ufffd\ufffd\ufffdIAyv\ufffd\ufffd\ufffd\ufffdIAyv\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffd6\u7a09v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.SubscriberMethodFinder\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0010Kw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`Mw\ufffd\u007f\ufffd\ufffd\ufffd\n\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdhfp\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0T\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdKw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0T\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010,\ufffd\u0001w\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.SubscriberMethodFinder\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdjw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffdlw\ufffd\u007f\ufffd\ufffd\ufffd\n\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdhfp\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd kw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffdRp\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001w\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.System.err\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0010^w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\u0018dYp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010(\u0321v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd^w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010(\u0321v\ufffd\ufffd\ufffd\ufffd\"\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.System.err\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR Nw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\u0018dYp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0261v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdNw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0261v\ufffd\ufffd\ufffdp\ufffd\ufffd\u0001w\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.System.err\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR0[w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\u0018dYp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u02a1v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u02a1v\ufffd\ufffd\ufffd\ufffd(\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.System.err\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdhw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\u0018dYp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\u02a1v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdpiw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\u02a1v\ufffd\ufffd\ufffd\u0432\ufffd!w\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.System\ufffd\ufffdL\u0017\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRp\ufffd+\u001dv\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd \ufffdwp\ufffd\ufffd\ufffd\ufffdx\ufffdU\u0015\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001}\ufffdv\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdv\ufffd\ufffd\ufffdas null.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdmoid because its",
|
||||
"persist.log.tag.System\ufffd\ufffdL\u0017\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdhL\u0011v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd pL\u0011v\ufffd\ufffd\ufffd\ufffdoL\u0011v\ufffd\ufffd\ufffd \ufffdwp\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\u0015\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdnL\u0011v\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffdL\u0011v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001}\ufffdv\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u007fL\u0011v\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdv\ufffd\ufffd\ufffdas null.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdmoid because its",
|
||||
"persist.log.tag.System\ufffd\ufffd\ufffdTw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdTw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd-\u0014\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdNsp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd Zw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffdK\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001}\ufffdv\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdv\ufffd\ufffd\ufffdClassLoader referenced unknown p",
|
||||
"persist.log.tag.Typeface\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdrw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffdPtw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffd\n\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u0261v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdrw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u0261v\ufffd\ufffd\ufffdP%\ufffd\ufffdv\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.Volley\ufffd\ufffdJ\u0012\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdLw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd Nw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdW\ufffdqw\ufffd\ufffd\ufffd\ufffdPw\ufffd\u007f\ufffd\ufffd\ufffd\u0010Nw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u02a1v\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010Mw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\u001aAy\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq \ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\u02a1v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\ufffdMw\ufffd\u007f\ufffd\ufffd\ufffd\u0018Nw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdM\ufffdq\ufffd\ufffd\ufffd\ufffd~\ufffd\u000eNv\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.ashmem\ufffd\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRpIAyv\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\u0012\ufffd\ufffd\ufffd\ufffd(\u0002\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdZ=N9y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdNAyv\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd`Ayv\ufffd\ufffd\ufffd\u0013\ufffd\ufffdj\ufffd\ufffd\ufffd\ufffd\u00199N9y\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd_Ayv\ufffd\ufffd\ufffdZ=N9y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001ero.vndk",
|
||||
"persist.log.tag.com.duowan.kiw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR0 @@v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\u0011\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd@@@v\ufffd\ufffd\ufffd\ufffd@@@v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp @@v\ufffd\ufffd\ufffd\ufffd\ufffde9y\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdD\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd \u0011\ufffd\ufffdw\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd @@v\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffdv\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\u0001x\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdw\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.com.duowan.kiw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdWw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdYw\ufffd\u007f\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010Xw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffde9y\ufffd\ufffd\ufffd\ufffd\ufffd-\u0014\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffdYw\ufffd\u007f\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdXw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffdM\ufffdv\ufffd\ufffd\ufffd0\ufffd\u0261v\ufffd\ufffd\ufffdHYw\ufffd\u007f\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.com.duowan.kiw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdf+\u001dv\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\u0011\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd\ufffd\ufffd+\u001dv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdf+\u001dv\ufffd\ufffd\ufffd\ufffd\ufffde9y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd \u0011\ufffd\ufffdw\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010g+\u001dv\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffdv\ufffd\ufffd\ufffdP\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffdw\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.huya-xlog\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRP_w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd`w\ufffd\u007f\ufffd\ufffd\ufffd\u000b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffdR\ufffdqw\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb4Ev\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd_w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd6\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb4Ev\ufffd\ufffd\ufffd\u0018`w\ufffd\u007f\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.huya-xlog\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRp]w\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd^w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd_w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd_w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd_w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb4Ev\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]w\ufffd\u007f\ufffd\ufffd\ufffd\ufffd6\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb4Ev\ufffd\ufffd\ufffd8^w\ufffd\u007f\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.huya-xlog\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdhw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`jw\ufffd\u007f\ufffd\ufffd\ufffd`kw\ufffd\u007f\ufffd\ufffd\ufffdhkw\ufffd\u007f\ufffd\ufffd\ufffd`kw\ufffd\u007f\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb4Ev\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`iw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd6\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb4Ev\ufffd\ufffd\ufffd\ufffdiw\ufffd\u007f\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.qtaguid\ufffd\ufffd!@@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR0\"@@v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\u0010,@@v\ufffd\ufffd\ufffd\u023b\u001c\u0014\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\u0013q\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\f;N9y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd'@@v\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd@@@v\ufffd\ufffd\ufffd\ufffd\ufffdgvv\ufffd\ufffd\ufffd\u00104N9y\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd?@@v\ufffd\ufffd\ufffd\f;N9y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffdDy\ufffd\ufffd\ufffd\"libnetd",
|
||||
"persist.log.tag.udbauth--\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR@\ufffd\ufffd v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\ufffd@\ufffd v\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd v\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd v\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdes/huyaudb/logca",
|
||||
"persist.log.tag.udbauth--\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffd\u0018\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd >\ufffd\ufffdu\ufffd\ufffd\ufffd(?\ufffd\ufffdu\ufffd\ufffd\ufffd@\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\b8\ufffd\ufffdu\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\u001e\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd/\ufffd\ufffdu\ufffd\ufffd\ufffd@\u001f\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.udbauth\ufffd\u001al\ufffd\ufffd\ufffd#l.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRp\u001f\ufffd\u0016v\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffdp)\ufffd\u0016v\ufffd\ufffd\ufffdx*\ufffd\u0016v\ufffd\ufffd\ufffd\ufffd*\ufffd\u0016v\ufffd\ufffd\ufffd\ufffdP\ufffd\u0016v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffd\u0016v\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\u0016v\ufffd\ufffd\ufffd\ufffd9\ufffd\\tG1p)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\u0016v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd HandlerGetTicke\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.udbauth\ufffd$\ufffdu%y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0010Tw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd\u0010\ufffd\ufffdQw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`Yw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\ufffd\ufffd~%y\ufffd\ufffd\ufffdL)\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffdB\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDB\ufffd\ufffdDB\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.udbauth\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR 8\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`>\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffdp?\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp=\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdMsgLoop ",
|
||||
"persist.log.tag.udbauth\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR08\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`>\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffdp?\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd=\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag.udbauth\ufffd\ufffd\ufffd\u00172\"\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdRp-\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd >\ufffd\ufffdu\ufffd\ufffd\ufffd(?\ufffd\ufffdu\ufffd\ufffd\ufffd@\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdu\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-22547-619639897",
|
||||
"persist.log.tag.udbauth\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR 8\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`>\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffdp?\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp=\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag\ufffdSubscriberMethodFinder\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\u0010Kw\ufffd\u007f\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`Mw\ufffd\u007f\ufffd\ufffd\ufffd\n\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdhfp\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdDy\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0T\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdKw\ufffd\u007f\ufffd\ufffd\ufffd\ufffd7\ufffd@y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwI\ufffdv\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0T\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010,\ufffd\u0001w\ufffd\ufffd\ufffd \ufffd\u001aFy\ufffd\ufffd\ufffdP\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd",
|
||||
"persist.log.tag\ufffdudbauth\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR 8\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdY\ufffd@y\ufffd\ufffd\ufffd`>\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffdp?\ufffd\ufffdu\ufffd\ufffd\ufffd`?\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp=\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd:\ufffd@y\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd)s\ufffd\ufffdu\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.sys.binary_xml\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\u0005Rw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u000b\u0012\u0012w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\u00fe\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffdo\ufffdm\ufffd.\ufffdd\ufffdu\ufffdo\ufffdw\ufffda\ufffdn\ufffd.\ufffdk\ufffdi\ufffdw\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.sys.locale\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"persist.sys.timezone\ufffdfileno\ufffd/dev/tty\ufffdfgets: buffer size %d <= 0\ufffdfread_unlocked\ufffdcook only file2: %s, size valid\ufffdcook select file: %s\ufffdStack not found in /proc/self/maps\ufffdDW_EH_PE_textrel pointer encoding not supported\ufffdtruncated uleb128 expression\ufffdx21\ufffd# adb sh",
|
||||
"persist.sys.timezone\ufffdxlog\ufffdg;\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffdkt\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdlogs_20260826_23",
|
||||
"ro.build.freeme.label\ufffdrties\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.freeme.label\ufffdrties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\"\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdX(\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u066b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(5\ufffd\ufffdv\ufffd\ufffd\ufffd M\b@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffdf\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdv\ufffd\ufffd\ufffdp\ufffd\f\ufffdw\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\u0002\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdLandroid/os/Syst",
|
||||
"ro.build.freeme.label\ufffdrties\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.uiversion\ufffdoperties\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.uiversion\ufffdoperties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\"\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdX(\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u066b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(5\ufffd\ufffdv\ufffd\ufffd\ufffd M\b@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffdf\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdv\ufffd\ufffd\ufffdp\ufffd\f\ufffdw\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\u0002\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdndroid/os/Syste",
|
||||
"ro.build.uiversion\ufffdoperties\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.version.emui\ufffdrties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\"\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdX(\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u066b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(5\ufffd\ufffdv\ufffd\ufffd\ufffd M\b@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffdf\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdv\ufffd\ufffd\ufffdp\ufffd\f\ufffdw\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\u0002\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdndroid/os/Syste",
|
||||
"ro.build.version.emui\ufffdrties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffdt\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp \ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffdv\ufffd\ufffd\ufffdpc\ufffd\u0001x\ufffd\ufffd\ufffdLogic\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd+\ufffdv\ufffd\ufffd\ufffd\u040b\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd2\ufffd\u0001x\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd((\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002a\u0001\ufffd\ufffd\ufffd\u007fz\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0*\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffdv\ufffd\ufffd\ufffd",
|
||||
"ro.build.version.emui\ufffdrties\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.version.opporom\ufffdes\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.version.opporom\ufffdes\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\"\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdX(\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u066b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(5\ufffd\ufffdv\ufffd\ufffd\ufffd M\b@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffdf\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdv\ufffd\ufffd\ufffdp\ufffd\f\ufffdw\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\u0002\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdLandroid/os/Syst",
|
||||
"ro.build.version.opporom\ufffdes\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.build.version.pcgame\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\ufffdS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00103\ufffd\ufffdv\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0016\u0012w\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u0002\u0001\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp3\ufffd\ufffdv\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd1\ufffd\ufffdv\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.gfx.driver.0\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u001aZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\u02a1w\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\u02a1w\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u041a\ufffd!w\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffdkl\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.gfx.driver.1\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u001aZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\u02a1w\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdaw\ufffd\ufffd\ufffd\ufffd\ufffd\u02a1w\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u041a\ufffd!w\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\ufffd\u0001\ufffd\ufffd\ufffdkl\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.gfx.driver_build_time\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffdl\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdOpen dex file from RAM \ufffdHSoD\ufffdd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u01eb\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd:o\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd<\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd!x\ufffd\ufffd\ufffd\u0018\t\ufffd!x\ufffd\ufffd\ufffd",
|
||||
"ro.miui.ui.version.name\ufffdies\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\"\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdX(\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u066b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(5\ufffd\ufffdv\ufffd\ufffd\ufffd M\b@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffdf\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdv\ufffd\ufffd\ufffdp\ufffd\f\ufffdw\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\u0002\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdLandroid/os/Syst",
|
||||
"ro.miui.ui.version.name\ufffdies\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffdt\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp \ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffdv\ufffd\ufffd\ufffdpc\ufffd\u0001x\ufffd\ufffd\ufffdLogic\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd+\ufffdv\ufffd\ufffd\ufffd\u040b\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd2\ufffd\u0001x\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd((\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002a\u0001\ufffd\ufffd\ufffd\u007fz\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0*\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffdv\ufffd\ufffd\ufffd",
|
||||
"ro.miui.ui.version.name\ufffdies\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.odm.manufacturer\ufffdperties\ufffdfo\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffdM*\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd9\ufffd\ufffdv\ufffd\ufffd\ufffd@&\ufffd\ufffdv\ufffd\ufffd\ufffd@\ufffd\f\ufffdw\ufffd\ufffd\ufffd\ufffd2\ufffd\u0001x\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`3\ufffd\ufffdv\ufffd\ufffd\ufffdp;\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u0012\r\ufffdw\ufffd\ufffd\ufffdgeInfo\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffdKg\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffdv\ufffd\ufffd\ufffd0*\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u0019\r\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\r\b\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd$\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd4\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffdv\ufffd\ufffd\ufffd",
|
||||
"ro.odm.manufacturer\ufffdperties\ufffdfo\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdA_\ufffd4#\ufffd\ufffd\ufffdp\u02b0?v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffduj\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0018k\ufffd\ufffd\u001e5\ufffdT\ufffd\u0270?v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd0T\ufffd\u0011x\ufffd\ufffd\ufffd",
|
||||
"ro.odm.manufacturer\ufffdperties\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(\ufffd\ufffdv\ufffd\ufffd\ufffd0$\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\f\ufffdw\ufffd\ufffd\ufffd#\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffdvK\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!w\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffdQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdlonglink.cc:__Up",
|
||||
"ro.product.cpu.abi\ufffdoperties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd@\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd \r\r\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd cdn.wup.huya.com\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffdn\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd/adui/getUnionPositionList\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd9_\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.sf.lcd_density\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffdQZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002q\u0001\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdcom.google.android.gms\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.sf.lcd_density\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffdQZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd(y\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002q\u0001\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdcom.google.android.gms\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.ssui.product\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdj\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffdz\ufffd\ufffdu\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u001bS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdP5\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdjava.lang.Byte\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffd!w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdu\ufffd\ufffd\ufffdp\ufffd\u02a1w\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdH\ufffd{\ufffdu\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffdu\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.ssui.product\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd116.162.16.32\ufffd\ufffd\ufffd\u0001\u0011\ufffd\ufffd\ufffd\ufffd\ufffdk\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdww.baidu.com\ufffd\ufffd\ufffd\u0001\u0010\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffdo\ufffd\ufffdu\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdns_timing\ufffdByte\ufffd)\u0001!\ufffd\ufffd\ufffd\ufffdhG\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00010.202.21.159\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdu\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\u0001\u0001\ufffd\ufffd\ufffd\u00c7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.ssui.product\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.telephony.default_network\ufffdes\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.vivo.os.version\ufffdoperties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\"\"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffdv\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdX(\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u0001\u0002\ufffd\ufffd\ufffd\u066b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(5\ufffd\ufffdv\ufffd\ufffd\ufffd M\b@v\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffdf\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffdv\ufffd\ufffd\ufffd\u0010/\ufffd\ufffdv\ufffd\ufffd\ufffdp\ufffd\f\ufffdw\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0002\ufffd\ufffd\ufffd\u0002\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdndroid/os/Syste",
|
||||
"ro.vivo.os.version\ufffdoperties\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffdt\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp \ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\ufffdv\ufffd\ufffd\ufffdpc\ufffd\u0001x\ufffd\ufffd\ufffdLogic\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd+\ufffdv\ufffd\ufffd\ufffd\u040b\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd2\ufffd\u0001x\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd((\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002a\u0001\ufffd\ufffd\ufffd\u007fz\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0001\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0*\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffdv\ufffd\ufffd\ufffd",
|
||||
"ro.vivo.os.version\ufffdoperties\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",
|
||||
"ro.vndk.version\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdr\f\ufffdR\ufffdOAyv\ufffd\ufffd\ufffdH\ufffdN9y\ufffd\ufffd\ufffd0]\ufffd\u0012\ufffd\ufffd\ufffd\ufffd<\ufffdN9y\ufffd\ufffd\ufffd\u0010]\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdOAyv\ufffd\ufffd\ufffdT\ufffd$Ay\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffdq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001x\ufffd\ufffd\ufffd\bDnq\ufffd\ufffd\ufffd\ufffd\ufffd\u001b\ufffd\ufffd\ufffd\u001d\ufffd\ufffdD'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd"
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,30 @@
|
||||
[
|
||||
{
|
||||
"round": 1,
|
||||
"survival_s": 6,
|
||||
"dfp_count": 1,
|
||||
"got_dfp": true,
|
||||
"died": true
|
||||
},
|
||||
{
|
||||
"round": 2,
|
||||
"survival_s": 6,
|
||||
"dfp_count": 1,
|
||||
"got_dfp": true,
|
||||
"died": true
|
||||
},
|
||||
{
|
||||
"round": 3,
|
||||
"survival_s": 6,
|
||||
"dfp_count": 1,
|
||||
"got_dfp": true,
|
||||
"died": true
|
||||
},
|
||||
{
|
||||
"round": 4,
|
||||
"survival_s": 3,
|
||||
"dfp_count": 0,
|
||||
"got_dfp": false,
|
||||
"died": true
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env python3
|
||||
"""attach + 全部 bypass: 观察 attach 路径加载 bypass 后 App 是否存活。
|
||||
用于定位 attach 后反调试点。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, subprocess
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
BYPASSES = ["bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js", "patch_guard_block_termination.js"]
|
||||
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE], capture_output=True)
|
||||
time.sleep(1)
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","monkey","-p",PACKAGE,"-c","android.intent.category.LAUNCHER","1"], capture_output=True)
|
||||
print("app launched normally, waiting 8s...", flush=True)
|
||||
time.sleep(8)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
ps = [p for p in d.enumerate_processes() if 'kiwi' in p.name or 'duowan' in p.name]
|
||||
if not ps:
|
||||
print("no kiwi process", flush=True); return
|
||||
pid = ps[0].pid
|
||||
print("attach pid", pid, flush=True)
|
||||
s = d.attach(pid)
|
||||
for name in BYPASSES:
|
||||
try:
|
||||
sc = s.create_script((RE/"evidence/scripts"/name).read_text())
|
||||
def on_msg(m, dd, n=name):
|
||||
if m.get('type')=='send':
|
||||
print(f"[{n}] {m.get('payload')}", flush=True)
|
||||
elif m.get('type')=='error':
|
||||
print(f"[{n}] ERR {str(m)[:120]}", flush=True)
|
||||
sc.on('message', on_msg)
|
||||
sc.load(); time.sleep(0.3)
|
||||
except Exception as e:
|
||||
print(f"[{name}] load ERR {e}", flush=True)
|
||||
print("all bypass loaded. observing 30s", flush=True)
|
||||
prev = 0
|
||||
for t in [3, 6, 10, 15, 20, 30]:
|
||||
time.sleep(t - prev); prev = t
|
||||
try:
|
||||
alive = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
except Exception:
|
||||
break
|
||||
print(f" +{t}s alive={bool(alive)}", flush=True)
|
||||
if not alive:
|
||||
print(f"=> DEAD at +{t}s", flush=True); break
|
||||
try: s.detach()
|
||||
except: pass
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env python3
|
||||
"""attach + 全部 bypass + 主 hook: 验证 attach 路径能存活且抓到 dfpReport。
|
||||
这是"不挂起、不 spawn"的路线, 无 EGL 崩问题。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, subprocess, json, re
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_attach_full.json")
|
||||
BYPASSES = ["bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js", "patch_guard_block_termination.js"]
|
||||
|
||||
MAIN_JS = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',len:len,hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var nn=ret.toInt32();
|
||||
if(nn<=0||nn>4000)return;
|
||||
send({type:'resp',len:nn,hex:hexb(this.buf,nn)});
|
||||
}});
|
||||
});
|
||||
send({type:'readhooked'});
|
||||
}catch(e){send({type:'readerr',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE], capture_output=True)
|
||||
time.sleep(1)
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","monkey","-p",PACKAGE,"-c","android.intent.category.LAUNCHER","1"], capture_output=True)
|
||||
print("app launched, waiting for dfp cold-start... attach fast", flush=True)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
# 用 adb pidof 确定的 pid (更可靠)
|
||||
pid = None
|
||||
for _ in range(15):
|
||||
r = subprocess.run(["adb","-s","127.0.0.1:5555","shell","pidof",PACKAGE], capture_output=True, text=True)
|
||||
p = r.stdout.strip()
|
||||
if p:
|
||||
pid = int(p)
|
||||
break
|
||||
time.sleep(1)
|
||||
if not pid:
|
||||
# fallback frida enumerate
|
||||
ps = [x for x in d.enumerate_processes() if 'kiwi' in x.name or 'duowan' in x.name]
|
||||
pid = ps[0].pid if ps else None
|
||||
print("attach pid", pid, flush=True)
|
||||
s = d.attach(pid)
|
||||
for name in BYPASSES:
|
||||
try:
|
||||
sc = s.create_script((RE/"evidence/scripts"/name).read_text()); sc.load(); time.sleep(0.2)
|
||||
except Exception as e:
|
||||
print(f"bp err {name} {e}", flush=True)
|
||||
events = []
|
||||
def on_main(m, dta):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:120], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'armed': print("[*] armed", flush=True)
|
||||
elif t == 'hooked': print("[*] SSL_write hooked", flush=True)
|
||||
elif t in ('err','readerr'): print("[*]", t, p.get('e'), flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[*] {p['cls']} len={p['len']}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
elif t == 'resp':
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p.get('hex') or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
print(f"[*] RESP len={p['len']}{mark}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
sc = s.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
# 观察 60s, 若触发 dfpReport 会有; 同时可通过 am 触发
|
||||
print("[*] observing 60s", flush=True)
|
||||
prev = 0
|
||||
for t in [5,10,15,20,30,40,50,60]:
|
||||
time.sleep(t-prev); prev=t
|
||||
try:
|
||||
alive = [p for p in d.enumerate_processes() if p.pid==pid]
|
||||
except Exception: break
|
||||
if not alive: print(f"=> DEAD at +{t}s", flush=True); break
|
||||
print(f"[*] done, {len(events)} events", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,46 @@
|
||||
"""模拟器 attach + 真机G2-0055组合bypass 存活测试. attach避开EGL崩, G2-0055过反调试."""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess
|
||||
REMOTE="127.0.0.1:31878"; PACKAGE="com.duowan.kiwi"
|
||||
RE=Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
BYPASS="bypass_msaoaid_maps_skip_cleanup.js"
|
||||
def main():
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for r in range(1,4):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True)
|
||||
time.sleep(1)
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","monkey","-p",PACKAGE,"-c","android.intent.category.LAUNCHER","1"],capture_output=True)
|
||||
time.sleep(7)
|
||||
# attach
|
||||
pid=None
|
||||
for _ in range(10):
|
||||
rr=subprocess.run(["adb","-s","127.0.0.1:5555","shell","pidof",PACKAGE],capture_output=True,text=True)
|
||||
if rr.stdout.strip(): pid=int(rr.stdout.strip()); break
|
||||
time.sleep(1)
|
||||
if not pid: print(f"r{r} no pid"); continue
|
||||
try:
|
||||
s=d.attach(pid)
|
||||
except Exception as e:
|
||||
print(f"r{r} attach err {e}"); time.sleep(2); continue
|
||||
# 加载 G2-0055
|
||||
def on(m,dd):
|
||||
if m.get('type')=='send':
|
||||
p=m.get('payload');
|
||||
if isinstance(p,dict) and p.get('event') in ('installed','predicate-branch-patched','art-callsite-patched','name-masked','fd-masked','maps-entry','art-entry','art-callsite'):
|
||||
print(f" r{r} {p['event']}",flush=True)
|
||||
elif m.get('type')=='error': print(f" r{r} ERR {str(m)[:80]}",flush=True)
|
||||
sc=s.create_script((RE/"evidence/scripts"/BYPASS).read_text()); sc.on('message',on); sc.load()
|
||||
print(f"r{r} attach pid={pid} +G2-0055 loaded, 观察存活",flush=True)
|
||||
prev=0; died=None
|
||||
for t in [3,6,10,15,20,30,40,50,60]:
|
||||
time.sleep(t-prev); prev=t
|
||||
try: alive=[p for p in d.enumerate_processes() if p.pid==pid]
|
||||
except: break
|
||||
if not alive:
|
||||
died=t
|
||||
print(f" r{r} DEAD at +{t}s",flush=True); break
|
||||
if not died: print(f" r{r} alive 60s!",flush=True)
|
||||
try: s.detach()
|
||||
except: pass
|
||||
time.sleep(2)
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/env python3
|
||||
"""抓"一帧"dfpReport(含响应 actionV)—— 自动重试, 直到拿到为止。
|
||||
|
||||
目标:每一台干净模拟器, 抓到一帧完整 dfpReport wire + 对应的 606B 响应(actionV),
|
||||
即获得这台"设备"的纯 Python 可重放身份凭证。App 存活 3-6s 足够(dfpReport 启动即发)。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json, re
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/frame_" + time.strftime("%H%M%S") + ".json")
|
||||
BYPASS = "bypass_msaoaid_maps_skip_cleanup.js" # 真机验证过的组合, 过 frida 反调试
|
||||
|
||||
MAIN_JS = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var got_dfp=false;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0){
|
||||
got_dfp=true;
|
||||
send({type:'dfp',len:len,hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var nn=ret.toInt32();
|
||||
if(nn<=0||nn>4000)return;
|
||||
send({type:'resp',len:nn,hex:hexb(this.buf,nn)});
|
||||
}});
|
||||
});
|
||||
send({type:'readhooked'});
|
||||
}catch(e){send({type:'readerr',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def one_try(d, attempt, result):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE], capture_output=True)
|
||||
time.sleep(1.2)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[att{attempt}] spawn pid={pid}", flush=True)
|
||||
s = d.attach(pid)
|
||||
# 挂起内加载 bypass (快速)
|
||||
try:
|
||||
sc = s.create_script((RE/"evidence/scripts"/BYPASS).read_text()); sc.load()
|
||||
except Exception as e:
|
||||
print(f"[att{attempt}] bypass err {e}", flush=True)
|
||||
d.resume(pid)
|
||||
print("[att%d] resumed (bypass loaded)" % attempt, flush=True)
|
||||
|
||||
got_dfp = False
|
||||
def on_main(m, dd):
|
||||
nonlocal got_dfp
|
||||
if m.get('type') == 'error':
|
||||
print(f"[att{attempt}] JSErr {str(m)[:100]}", flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'hooked':
|
||||
print(f"[att{attempt}] SSL_write hooked", flush=True)
|
||||
elif t == 'dfp':
|
||||
got_dfp = True
|
||||
print(f"[att{attempt}] dfpReport len={p['len']}", flush=True)
|
||||
result['dfp_wire'] = p['hex']
|
||||
result['dfp_pid'] = pid
|
||||
elif t == 'resp':
|
||||
# 保存 606B 响应 (可能含 actionV)
|
||||
result.setdefault('resps', []).append({'len': p['len'], 'hex': p['hex']})
|
||||
if p['len'] == 606:
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p['hex'] or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
else:
|
||||
mark = ""
|
||||
print(f"[att{attempt}] resp len={p['len']}{mark}", flush=True)
|
||||
|
||||
mainsc = s.create_script(MAIN_JS)
|
||||
mainsc.on('message', on_main)
|
||||
mainsc.load()
|
||||
|
||||
# 观察 ~15s 内抓 dfp (dfp 启动即发, 快)
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 15:
|
||||
time.sleep(2)
|
||||
if got_dfp:
|
||||
time.sleep(3) # 再等一帧响应
|
||||
break
|
||||
# 确认拿到 dfp 且其响应缺失则不强求
|
||||
print(f"[att{attempt}] 结束观察, got_dfp={got_dfp}", flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
return got_dfp
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
result = {}
|
||||
for attempt in range(1, 6):
|
||||
try:
|
||||
ok = one_try(d, attempt, result)
|
||||
if ok and result.get('dfp_wire'):
|
||||
print(f"[*] SUCCESS att{attempt}: dfp_wire_len={len(result['dfp_wire'])//2}$", flush=True)
|
||||
json.dump(result, open(OUT, 'w'), indent=2)
|
||||
print(f"[*] saved {OUT}", flush=True)
|
||||
return
|
||||
except Exception as e:
|
||||
print(f"[att{attempt}] ERR {repr(e)}", flush=True)
|
||||
time.sleep(2)
|
||||
print("[*] 5 次均未抓到 dfpReport", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Runtime edge capture on live libhydeviceid generation:
|
||||
1) hook __system_property_get -> what system inputs drive triple/device derivation
|
||||
2) hook SSL_write -> the dfpReport wire (to correlate)
|
||||
Only needs the ~3-6s spawn window (dfpReport fires ~1s after start).
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json, sys
|
||||
|
||||
REMOTE="127.0.0.1:31878"; PACKAGE="com.duowan.kiwi"
|
||||
RE=Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT=Path("/Users/yml/codes/douyu_login_py/evidence/propedge_" + time.strftime("%H%M%S") + ".json")
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function rcs(p,n){try{return p.readCString(n)||'';}catch(e){return '';}}
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
var START = Date.now(); var t0 = Math.floor(Date.now()/1000);
|
||||
|
||||
// 1) system property reads
|
||||
try{
|
||||
var pg = Module.findExportByName('libc.so','__system_property_get');
|
||||
if(pg){
|
||||
Interceptor.attach(pg,{onEnter:function(a){this.name=rcs(a[0],256);this.valbuf=a[1];},
|
||||
onLeave:function(ret){
|
||||
try{
|
||||
var val=rcs(this.valbuf,512);
|
||||
// 只关心设备/身份派生相关属性, 避免把框架进程的读取混进来
|
||||
var isDevice = this.name.indexOf('ro.product')===0 || this.name.indexOf('ro.serialno')===0
|
||||
|| this.name.indexOf('ro.boot')===0 || this.name.indexOf('ro.hardware')===0
|
||||
|| this.name.indexOf('ro.build')===0 || this.name=== 'ro.secure'
|
||||
|| this.name==='ro.debuggable' || this.name.indexOf('ro.kernel')===0
|
||||
|| this.name.indexOf('gsm.')===0 || this.name.indexOf('persist.sys')===0
|
||||
|| this.name.indexOf('qemu')===0;
|
||||
if(isDevice){ send({type:'prop',dt:Date.now()-START,name:this.name,val:val.slice(0,200)}); }
|
||||
}catch(e){}
|
||||
}});
|
||||
}
|
||||
send({type:'prop_hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
|
||||
// 2) SSL_write dfpReport wire
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=rcs(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0){
|
||||
send({type:'dfp',dt:Date.now()-START,len:len,hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'dfp_hooked'});
|
||||
}catch(e){send({type:'dfperr',e:String(e)});}
|
||||
|
||||
// 3) also capture plaintext JSON candidate: hook memcpy/strlen leaving std::string? skip, noisy.
|
||||
"""
|
||||
|
||||
def one_run(d, a, result, dump_props):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True)
|
||||
time.sleep(1.2)
|
||||
pid=d.spawn([PACKAGE])
|
||||
print(f"[att{a}] spawn pid={pid}", flush=True)
|
||||
s=d.attach(pid)
|
||||
try:
|
||||
b=s.create_script((RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text()); b.load()
|
||||
except Exception as e:
|
||||
print(f"[att{a}] bypass err {e}", flush=True)
|
||||
d.resume(pid)
|
||||
print(f"[att{a}] resumed", flush=True)
|
||||
got=False; dfp_hook=False
|
||||
def on(m,dd):
|
||||
nonlocal got, dfp_hook
|
||||
if m.get('type')=='error': print(f"[att{a}] JSErr {str(m)[:120]}", flush=True); return
|
||||
p=m.get('payload') or {}
|
||||
t=p.get('type')
|
||||
if t=='prop_hooked': print(f"[att{a}] prop hooked", flush=True)
|
||||
elif t=='dfp_hooked': dfp_hook=True; print(f"[att{a}] SSL_write hooked", flush=True)
|
||||
elif t=='prop':
|
||||
result.setdefault('props',[]).append({'dt':p.get('dt'),'name':p['name'],'val':p['val']})
|
||||
elif t=='dfp':
|
||||
got=True; print(f"[att{a}] dfp len={p['len']}", flush=True)
|
||||
result['dfp_wire']=p['hex']; result['dfp_dt']=p.get('dt'); result['pid']=pid
|
||||
sc=s.create_script(JS); sc.on('message',on); sc.load()
|
||||
t0=time.time()
|
||||
while time.time()-t0<20:
|
||||
time.sleep(2)
|
||||
if got: time.sleep(3); break
|
||||
print(f"[att{a}] end got_dfp={got} (props={len(result.get('props',[]))})", flush=True)
|
||||
# unique props by name
|
||||
seen={}
|
||||
for pr in result.get('props',[]):
|
||||
seen.setdefault(pr['name'],[]).append(pr['val'])
|
||||
if dump_props and seen:
|
||||
print("--- unique props read ---")
|
||||
for k,v in sorted(seen.items()):
|
||||
print(f" {k} = {v[0][:120]} (x{len(v)})", flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
return got
|
||||
|
||||
def main():
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
result={}
|
||||
ok=False
|
||||
for a in range(1,6):
|
||||
try:
|
||||
if one_run(d,a,result,dump_props=(a>=1)):
|
||||
print(f"[*] SUCCESS att{a}", flush=True)
|
||||
ok=True; break
|
||||
except Exception as e:
|
||||
print(f"[att{a}] ERR {repr(e)}", flush=True); time.sleep(2)
|
||||
if ok or result.get('props'):
|
||||
json.dump(result, open(OUT,'w'), indent=2)
|
||||
print(f"[*] saved {OUT}", flush=True)
|
||||
else:
|
||||
print("[*] no capture", flush=True)
|
||||
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
"""精确定位三元组派生输入: hook __system_property_find + __system_property_read_callback,
|
||||
只记录 name(不读值避免乱码), 并 hook Build 类 Java 侧读取.
|
||||
目标: 找出 hdid/deviceId/appkey 由哪些系统属性派生.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json
|
||||
REMOTE="127.0.0.1:31878"; PACKAGE="com.duowan.kiwi"
|
||||
RE=Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT=Path("/Users/yml/codes/douyu_login_py/evidence/propnames_" + time.strftime("%H%M%S") + ".json")
|
||||
JS=r"""
|
||||
'use strict';
|
||||
var names=new Set(); var dfpGot=false;
|
||||
function rcs(p,n){try{return p.readCString(n)||'';}catch(e){return '';}}
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
// 1) NDK property接口
|
||||
try{
|
||||
var pf=Module.findExportByName('libc.so','__system_property_find');
|
||||
if(pf) Interceptor.attach(pf,{onEnter:function(a){var n=rcs(a[0],256); if(n&&!names.has(n)){names.add(n);send({type:'find',name:n});}}
|
||||
});
|
||||
}catch(e){send({type:'e',e:String(e)});}
|
||||
try{
|
||||
var pr=Module.findExportByName('libc.so','__system_property_read_callback');
|
||||
if(pr) Interceptor.attach(pr,{onEnter:function(a){var n=rcs(a[0],256); if(n&&!names.has(n)){names.add(n);send({type:'readcb',name:n});}}
|
||||
});
|
||||
}catch(e){send({type:'e',e:String(e)});}
|
||||
// 2) Java Build 字段访问 (System.getProperty / Build.MODEL等)
|
||||
try{
|
||||
Java.perform(function(){
|
||||
var Sys=Java.use('java.lang.System');
|
||||
Sys.getProperty.overload('java.lang.String').implementation=function(k){var v=this.getProperty(k); send({type:'sysprop',name:String(k),val:String(v)}); return v;};
|
||||
var B=Java.use('android.os.Build');
|
||||
var FINGERPRINT=B.FINGERPRINT.value; var MODEL=B.MODEL.value; var SERIAL=B.SERIAL.value; var MAN=B.MANUFACTURER.value;
|
||||
send({type:'build',MODEL:String(MODEL),FINGERPRINT:String(FINGERPRINT),SERIAL:String(SERIAL),MAN:String(MAN)});
|
||||
});
|
||||
}catch(e){send({type:'jerr',e:String(e)});}
|
||||
// 3) SSL_write dfp
|
||||
try{
|
||||
new ApiResolver('module').enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){var len=a[2].toInt32(); if(len<50||len>50000)return;
|
||||
var h=rcs(a[1],Math.min(len,1500)); if(h.indexOf('dfpReport')>=0){dfpGot=true;send({type:'dfp',len:len,hex:hexb(a[1],len)});}}});
|
||||
});
|
||||
}catch(e){send({type:'e',e:String(e)});}
|
||||
"""
|
||||
def main():
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
result={}
|
||||
for a in range(1,6):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True); time.sleep(1)
|
||||
pid=d.spawn([PACKAGE]); s=d.attach(pid)
|
||||
try:
|
||||
b=s.create_script((RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text()); b.load()
|
||||
except: pass
|
||||
d.resume(pid)
|
||||
found=[]; build=None; dfp=None
|
||||
def on(m,dd):
|
||||
nonlocal build, dfp
|
||||
if m.get('type')=='error': print(f" JSErr {str(m)[:120]}",flush=True); return
|
||||
p=m.get('payload') or {}; t=p.get('type')
|
||||
if t=='find':
|
||||
# 只记设备/系统相关
|
||||
n=p['name']
|
||||
if n.startswith(('ro.','persist.','gsm.','init.','sys.')) : found.append(n)
|
||||
elif t=='sysprop': pass
|
||||
elif t=='build': build=(p.get('MODEL'),p.get('FINGERPRINT'),p.get('SERIAL'),p.get('MAN')); print(f"[att{a}] Build:",p,flush=True)
|
||||
elif t=='dfp': dfp=p['hex']; print(f"[att{a}] dfp len={p.get('len')}",flush=True)
|
||||
sc=s.create_script(JS); sc.on('message',on); sc.load()
|
||||
t0=time.time()
|
||||
while time.time()-t0<20:
|
||||
time.sleep(2)
|
||||
if dfp: time.sleep(3); break
|
||||
print(f"[att{a}] 属性共 {len(found)} 个; dfp={'got' if dfp else 'no'}",flush=True)
|
||||
if found:
|
||||
result['props']=sorted(set(found))
|
||||
if dfp: result['dfp_wire']=dfp
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
if dfp: break
|
||||
time.sleep(1)
|
||||
json.dump(result,open(OUT,'w'),indent=2)
|
||||
print("saved",OUT,flush=True)
|
||||
if result.get('props'):
|
||||
print("=== 设备/系统属性读取清单 ===")
|
||||
for n in result['props']: print(" ",n,flush=True)
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
"""抓帧自动验证: spawn抓dfpReport → 重放 → 输出actionV(hdid).
|
||||
用于对比"改IMEI/设备标识后身份是否变化"。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json, re, ssl, socket
|
||||
REMOTE="127.0.0.1:31878"; PACKAGE="com.duowan.kiwi"
|
||||
RE=Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT=Path("/Users/yml/codes/douyu_login_py/evidence/identity_" + time.strftime("%H%M%S") + ".json")
|
||||
MAIN_JS="""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var got=false;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0){got=true;send({type:'dfp',len:len,hex:hexb(a[1],len)});}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
def main():
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
result={}
|
||||
for attempt in range(1,7):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True)
|
||||
time.sleep(1.2)
|
||||
try:
|
||||
pid=d.spawn([PACKAGE]); s=d.attach(pid)
|
||||
except Exception as e:
|
||||
print(f"[att{attempt}] spawn/attach err {e}",flush=True); time.sleep(2); continue
|
||||
try:
|
||||
b=s.create_script((RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text()); b.load()
|
||||
except: pass
|
||||
d.resume(pid)
|
||||
got=False
|
||||
def on(m,dd):
|
||||
nonlocal got
|
||||
if m.get('type')!='send':return
|
||||
p=m.get('payload') or {}
|
||||
if p.get('type')=='dfp':
|
||||
got=True
|
||||
result['dfp_wire']=p['hex']; result['pid']=pid
|
||||
print(f"[att{attempt}] dfpReport len={p['len']}",flush=True)
|
||||
sc=s.create_script(MAIN_JS); sc.on('message',on); sc.load()
|
||||
t0=time.time()
|
||||
while time.time()-t0<18:
|
||||
time.sleep(2)
|
||||
if got: time.sleep(3); break
|
||||
if got and result.get('dfp_wire'):
|
||||
# 重放拿 actionV
|
||||
wire=bytes.fromhex(result['dfp_wire'])
|
||||
ctx=ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
|
||||
ss=ctx.wrap_socket(socket.create_connection(("wsapi.huya.com",443),timeout=10),server_hostname="wsapi.huya.com")
|
||||
ss.sendall(wire); ss.settimeout(25); buf=b""
|
||||
try:
|
||||
while True:
|
||||
c=ss.recv(8192)
|
||||
if not c: break
|
||||
buf+=c
|
||||
if len(buf)>5000: break
|
||||
except socket.timeout: pass
|
||||
ss.close()
|
||||
av=re.search(rb'actionV\(([0-9a-f]{40})',buf)
|
||||
avd=av.group(1).decode() if av else None
|
||||
result['actionV']=avd
|
||||
print(f"[att{attempt}] actionV = {avd}",flush=True)
|
||||
json.dump(result,open(OUT,'w'),indent=2)
|
||||
print(f"[*] saved {OUT}",flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
return
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
print("[*] 未抓到 dfpReport",flush=True)
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env python3
|
||||
"""对照测试: attach + bypass 存活(多轮), 附加 main hook 存活(多轮)。
|
||||
每种配置重复 ROUNDS 次, 记录每次的存活时间与崩溃点, 避免单次误判。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, subprocess, json
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
BYPASSES = ["bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js", "patch_guard_block_termination.js"]
|
||||
|
||||
MAIN_JS_HOOK = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
// 只 hook SSL_write, 最小主 hook
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',len:len});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
|
||||
ROUNDS = 3
|
||||
OBSERVE = 35 # 每轮观察秒数
|
||||
|
||||
|
||||
def launch():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE], capture_output=True)
|
||||
time.sleep(1.2)
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","monkey","-p",PACKAGE,"-c","android.intent.category.LAUNCHER","1"], capture_output=True)
|
||||
|
||||
|
||||
def get_pid(d, timeout=20):
|
||||
for _ in range(timeout):
|
||||
r = subprocess.run(["adb","-s","127.0.0.1:5555","shell","pidof",PACKAGE], capture_output=True, text=True)
|
||||
p = r.stdout.strip()
|
||||
if p:
|
||||
return int(p)
|
||||
time.sleep(1)
|
||||
return None
|
||||
|
||||
|
||||
def load_bypass(s):
|
||||
for name in BYPASSES:
|
||||
try:
|
||||
sc = s.create_script((RE/"evidence/scripts"/name).read_text()); sc.load(); time.sleep(0.2)
|
||||
except Exception as e:
|
||||
print(f" bp {name} err {e}", flush=True)
|
||||
|
||||
|
||||
def observe(d, pid, s, with_hook, tag):
|
||||
t0 = time.time()
|
||||
events = []
|
||||
if with_hook:
|
||||
sc = s.create_script(MAIN_JS_HOOK)
|
||||
sc.on('message', lambda m, dd: events.append(m.get('payload')) if m.get('type')=='send' else None)
|
||||
sc.load()
|
||||
# 观察
|
||||
prev = 0
|
||||
died_at = None
|
||||
for t in [5, 10, 15, 20, 25, 30, OBSERVE]:
|
||||
time.sleep(t - prev); prev = t
|
||||
try:
|
||||
alive = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
except Exception:
|
||||
broken = True
|
||||
died_at = t
|
||||
break
|
||||
if not alive:
|
||||
died_at = t
|
||||
break
|
||||
status = f"DEAD at +{died_at}s" if died_at else f"alive>{OBSERVE}s"
|
||||
dfp = [e for e in events if isinstance(e, dict) and e.get('cls')=='dfpReport']
|
||||
print(f" [{tag}] {status} | dfp hooks={len(dfp)}", flush=True)
|
||||
return status, len(dfp)
|
||||
|
||||
|
||||
def run_round(d, with_hook):
|
||||
launch()
|
||||
pid = get_pid(d)
|
||||
if not pid:
|
||||
return "launch-fail", 0
|
||||
try:
|
||||
s = d.attach(pid)
|
||||
except Exception as e:
|
||||
return f"attach-err {e}", 0
|
||||
load_bypass(s)
|
||||
return observe(d, pid, s, with_hook, "hook" if with_hook else "bypass-only")
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
print("=== A: 纯 attach + bypass (无主hook), 重复 %d 轮 ===" % ROUNDS, flush=True)
|
||||
for i in range(1, ROUNDS+1):
|
||||
st, n = run_round(d, with_hook=False)
|
||||
print(f" A#{i}: {st}", flush=True)
|
||||
time.sleep(2)
|
||||
print("=== B: attach + bypass + SSL_write主hook, 重复 %d 轮 ===" % ROUNDS, flush=True)
|
||||
for i in range(1, ROUNDS+1):
|
||||
st, n = run_round(d, with_hook=True)
|
||||
print(f" B#{i}: {st} (dfp={n})", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python3
|
||||
"""dfpReport 生成流程 python 验证模型。
|
||||
|
||||
目标: 用手头真实 wire 验证对格式的理解:
|
||||
wire = HTTP POST / (wsapi.huya.com, okhttp/3.14.9)
|
||||
+ body(taf/wup): 长度头 + servant + "dfpReport" + "tReq"
|
||||
+ MAGIC(571882cf664bb39401ee) + cw
|
||||
cw = [明文JSON ^ keystream][collection ^ keystream]
|
||||
其中 keystream 是每帧独立随机流(未知生成器)。本脚本验证"格式+布局"理解,
|
||||
并验证给定完整明文(JSON+collection)与keystream可精确重建真实wire。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json, binascii, struct, re
|
||||
|
||||
MAGIC = bytes.fromhex('571882cf664bb39401ee')
|
||||
PREFIX_JSON = b'{"appId":"5008","appVer":"13.4.22"'
|
||||
# 真机已验证的完整明文 JSON(含三元组)
|
||||
REAL_JSON = ('{"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"}')
|
||||
|
||||
def build_json(triple=None, device_name='M2102J2SC', system_ver='M2102J2SC,30,11'):
|
||||
t = triple or dict(appkey='865a4924a40897ac1fcfe6b4c2cbb0e3',
|
||||
channel='xiaomi',
|
||||
deviceId='02df398797432eadefcc12767119ad5e80999389',
|
||||
hdid='7c5387e0539c023c31c4ff0e807e7256117385ee')
|
||||
return ('{"appId":"5008","appVer":"13.4.22","appkey":"%(appkey)s","channel":"%(channel)s",'
|
||||
'"deviceId":"%(deviceId)s","deviceName":"'+device_name+'","hdid":"%(hdid)s",'
|
||||
'"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":"'+system_ver+'",'
|
||||
'"terminalType":1,"testEnv":0,"widthPixels":"1080"}') % t
|
||||
|
||||
def parse_wire(wire):
|
||||
"""从真实 wire 提取结构化字段. 返回 dict."""
|
||||
body_start = wire.find(b'\r\n\r\n') + 4
|
||||
body = wire[body_start:]
|
||||
# taf 头: 4字节大端长度, 然后 TLV
|
||||
# 简化解析: servant名
|
||||
mi = body.find(MAGIC)
|
||||
cw = body[mi+10:]
|
||||
# JSON 密文段长度 + 明文校验
|
||||
result = {
|
||||
'body': body,
|
||||
'cw': cw,
|
||||
'magic_offset_in_body': mi,
|
||||
'json_len': None, 'coll': None,
|
||||
}
|
||||
# 用已知JSON前缀恢复ks并反推JSON长度定位
|
||||
if len(cw) >= len(PREFIX_JSON):
|
||||
# JSON数据是明文XOR (明文可打印). 但我们不知道JSON结束位置(collection开始).
|
||||
# 用"JSON固定长度"真机值(586)推断: 若明文JSON=XOR后全是可打印ascii且结构符合.
|
||||
jlen = len(REAL_JSON.encode())
|
||||
coll = cw[jlen:]
|
||||
result['json_len'] = jlen
|
||||
result['json_offset_in_cw'] = 0
|
||||
result['coll'] = coll
|
||||
return result
|
||||
|
||||
def verify_rebuild(wire):
|
||||
"""验证: 用解析出的 cw, 从"明文JSON+keystream"能否精确重建 cw[:json_len]."""
|
||||
p = parse_wire(wire)
|
||||
cw = p['cw']
|
||||
jb = REAL_JSON.encode()
|
||||
jlen = len(jb)
|
||||
# keystream = cw[:jlen] ^ jb
|
||||
ks_json = bytes(cw[i]^jb[i] for i in range(jlen))
|
||||
# 重建 encoded_json = jb ^ ks_json = jb (恒等, 因为ks由它们导出)
|
||||
# 真正验证: 检查明文JSON在 cw 中位置对应的XOR是否=keystream连续(即JSON在此) — 无法独立验证,
|
||||
# 但可验证: 明文JSON偏移与 ta f 头一致.
|
||||
# 关键验证: keystream 在 JSON 段与 collection 段是否"同一生成器连续流".
|
||||
# 我们对比 JSON 段 ks 和 collection 段(from某plaintext假设). 目前无collection明文故无法.
|
||||
# 输出 keystream JSON段, 供分析.
|
||||
return {
|
||||
'jlen': jlen, 'cw_len': len(cw),
|
||||
'ks_head': ks_json[:48].hex(),
|
||||
'coll_len': len(p['coll']),
|
||||
'ks_json_randomness': len(set(ks_json)),
|
||||
}
|
||||
|
||||
def main():
|
||||
frames = json.load(open('evidence/frame_real.json'))
|
||||
wire = binascii.unhexlify(frames[0])
|
||||
p = parse_wire(wire)
|
||||
print("wire 总长: %d, body 长: %d, cw 长: %d" % (len(wire), len(p['body']), len(p['cw'])))
|
||||
print("MAGIC 在 body 偏移: %d" % p['magic_offset_in_body'])
|
||||
print("JSON 密文长度(586), collection 长度: %d" % len(p['coll']))
|
||||
v = verify_rebuild(wire)
|
||||
print("JSON keystream 前48B:", v['ks_head'])
|
||||
print("keystream JSON段随机性(不同字节):", v['ks_json_randomness'], "/ 586")
|
||||
# 打印 taf 头可读字符串
|
||||
b = p['body']
|
||||
for kw in [b'huyaudbwebui', b'dfpReport', b'android', b'tReq']:
|
||||
print("body 含 '%s': @%d" % (kw.decode(errors='replace'), b.find(kw)))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,148 @@
|
||||
#!/usr/bin/env python3
|
||||
"""挂起策略梯度实验: 确认 attach+maps遮蔽 是否能绕过 msaoaidsec 且不EGL崩.
|
||||
|
||||
E0: spawn→attach(空)→resume = 复现 session gone(静默死)
|
||||
E1: spawn→attach→load mask脚本→resume = attach+maps遮蔽
|
||||
E2: spawn→attach→load mask+sslhook→resume = 最终抓包形态
|
||||
E3: 纯spawn→resume(不attach) = B组对照(应活)
|
||||
|
||||
每个 case 跑 2 轮, 每轮观察 30s 或死亡, logcat crash 同步。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys, re
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT_DIR = Path("/Users/yml/codes/douyu_login_py/evidence/diag_egl_strategy")
|
||||
|
||||
SSL_HOOK = r"""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){send({type:'ssl',len:a[2].toInt32(),t:Date.now()});}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def detach_cb(reason, detail):
|
||||
print(f" [detached] reason={reason} detail={detail}", flush=True)
|
||||
|
||||
def run_case(d, case, rnd):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.2)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = None
|
||||
session = None
|
||||
t_spawn = time.time()
|
||||
try:
|
||||
if case in ("E4", "E5"):
|
||||
# B组: 纯spawn→立即resume→App起来后再attach
|
||||
pid = d.spawn([PACKAGE])
|
||||
d.resume(pid)
|
||||
print(f"[{case}.r{rnd}] spawn pid={pid} 立即resumed", flush=True)
|
||||
time.sleep(1.5 if case == "E4" else 5.0)
|
||||
t_att = time.time()
|
||||
session = d.attach(pid)
|
||||
session.on('detached', detach_cb)
|
||||
print(f"[{case}.r{rnd}] attach at +{(time.time()-t_spawn)*1000:.0f}ms (attach耗时{(time.time()-t_att)*1000:.0f}ms)", flush=True)
|
||||
suspend_ms = (time.time() - t_spawn) * 1000
|
||||
elif case in ("E6", "E7"):
|
||||
# 极短挂起: 只加载最少 bypass
|
||||
pid = d.spawn([PACKAGE])
|
||||
suspend_start = time.time()
|
||||
session = d.attach(pid)
|
||||
session.on('detached', detach_cb)
|
||||
if case == "E6":
|
||||
sc = session.create_script((RE/"evidence/scripts/bypass_msaoaid_maps_art_callsite.js").read_text()); sc.load()
|
||||
else:
|
||||
sc = session.create_script((RE/"evidence/scripts/bypass_msaoaid_maps_art_callsite.js").read_text()); sc.load()
|
||||
sc2 = session.create_script((RE/"evidence/scripts/mask_frida_maps_only.js").read_text()); sc2.load()
|
||||
suspend_ms = (time.time() - suspend_start) * 1000
|
||||
d.resume(pid)
|
||||
print(f"[{case}.r{rnd}] spawn pid={pid} 挂起{suspend_ms:.0f}ms(1个art_callsite补丁) resumed", flush=True)
|
||||
else:
|
||||
pid = d.spawn([PACKAGE])
|
||||
suspend_start = time.time()
|
||||
if case in ("E1", "E2"):
|
||||
session = d.attach(pid)
|
||||
session.on('detached', detach_cb)
|
||||
if case == "E1":
|
||||
sc = session.create_script((RE/"evidence/scripts/mask_frida_maps_only.js").read_text()); sc.load()
|
||||
else:
|
||||
sc = session.create_script((RE/"evidence/scripts/mask_frida_maps_only.js").read_text()); sc.load()
|
||||
sc2 = session.create_script(SSL_HOOK); sc2.load()
|
||||
elif case == "E0":
|
||||
session = d.attach(pid)
|
||||
session.on('detached', detach_cb)
|
||||
elif case == "E3":
|
||||
pass # 纯spawn不attach
|
||||
suspend_ms = (time.time() - suspend_start) * 1000
|
||||
d.resume(pid)
|
||||
print(f"[{case}.r{rnd}] spawn pid={pid} 挂起{suspend_ms:.0f}ms resumed", flush=True)
|
||||
except Exception as e:
|
||||
print(f"[{case}.r{rnd}] setup ERR {e}", flush=True)
|
||||
return None
|
||||
|
||||
# 观察 30s
|
||||
t0 = time.time()
|
||||
died_at = None
|
||||
pid_changed = None
|
||||
while time.time() - t0 < 30:
|
||||
time.sleep(2)
|
||||
mp = main_pid()
|
||||
if mp is None:
|
||||
died_at = time.time() - t0
|
||||
break
|
||||
if mp != pid:
|
||||
pid_changed = (mp, time.time() - t0)
|
||||
break
|
||||
cr = adb("shell", "logcat", "-d", "-b", "crash", "-t", "20").stdout
|
||||
egl = "EGL" in cr or "libEGL" in cr
|
||||
crash_banner = bool(re.search(r"Fatal|signal \d|Abort", cr))
|
||||
try:
|
||||
if session: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
result = {
|
||||
"case": case, "round": rnd, "pid": pid, "suspend_ms": round(suspend_ms, 1),
|
||||
"died_at_s": round(died_at, 1) if died_at else None,
|
||||
"pid_changed": pid_changed, "egl_crash": egl,
|
||||
"crash_banner": crash_banner,
|
||||
"crash_tail": cr[:300],
|
||||
}
|
||||
print(f" → {result}", flush=True)
|
||||
return result
|
||||
|
||||
def main():
|
||||
cases = sys.argv[1:] or ["E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7"]
|
||||
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
results = []
|
||||
for c in cases:
|
||||
for rnd in (1, 2):
|
||||
r = run_case(d, c, rnd)
|
||||
if r: results.append(r)
|
||||
out = OUT_DIR / "egl_strategy.json"
|
||||
out.write_text(json.dumps(results, ensure_ascii=False, indent=1))
|
||||
print(f"[*] {len(results)} 结果 -> {out}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env python3
|
||||
"""存活/闪退四组对照诊断器 (统一度量):
|
||||
指标1 proc_main: /proc/<pid>/cmdline == 包名 (主进程存活)
|
||||
指标2 ui_focus: dumpsys window mCurrentFocus 是否 com.duowan.kiwi/* (UI 未闪退)
|
||||
指标3 crash: logcat -b crash 是否出现 Fatal (native/java 崩溃)
|
||||
|
||||
A. 无frida 正常启动 (baseline)
|
||||
B. spawn 挂起~0s 立即resume, 不加载任何脚本
|
||||
C. spawn 挂起 加载2个bypass脚本后再resume (模拟v8/v9/stale)
|
||||
D. attach 正常启动7s后 attach 主进程 (裸attach, 无脚本)
|
||||
|
||||
用法: python3 diag_lifecycle.py [a|b|c|d]
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, sys, json, re
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT_DIR = Path("/Users/yml/codes/douyu_login_py/evidence/diag_lifecycle")
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def focus_ok():
|
||||
r = adb("shell", "dumpsys", "window")
|
||||
m = re.search(r"mCurrentFocus=Window\{([^}]+)\}", r.stdout)
|
||||
if m:
|
||||
f = m.group(1)
|
||||
return PACKAGE in f, f
|
||||
return False, "?"
|
||||
|
||||
def crash_count():
|
||||
r = adb("shell", "logcat", "-d", "-b", "crash", "-t", "50")
|
||||
return r.stdout.count("Fatal"), r.stdout[-2000:]
|
||||
|
||||
def snapshot(label):
|
||||
p = main_pid()
|
||||
ok, foc = focus_ok()
|
||||
return {"label": label, "proc": p, "ui_ok": ok, "focus": foc}
|
||||
|
||||
def main():
|
||||
which = (sys.argv[1] if len(sys.argv) > 1 else "a").lower()
|
||||
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
adb("shell", "logcat", "-c")
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = None
|
||||
t_start = time.time()
|
||||
timeline = []
|
||||
label = which.upper()
|
||||
|
||||
if which in ("a",):
|
||||
print("[A] 无frida 正常启动", flush=True)
|
||||
adb("shell", "monkey", "-p", PACKAGE, "-c", "android.intent.category.LAUNCHER", "1")
|
||||
|
||||
elif which in ("b",):
|
||||
print("[B] spawn 挂起~0 立即 resume", flush=True)
|
||||
pid = d.spawn([PACKAGE])
|
||||
dt = time.time() - t_start
|
||||
t_start = time.time()
|
||||
d.resume(pid)
|
||||
print(f" spawn->resume 挂起 {dt*1000:.0f}ms", flush=True)
|
||||
|
||||
elif which in ("c",):
|
||||
print("[C] spawn 挂起+加载2个bypass再resume", flush=True)
|
||||
pid = d.spawn([PACKAGE])
|
||||
s = d.attach(pid)
|
||||
for name in ("bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js"):
|
||||
t0 = time.time()
|
||||
sc = s.create_script((RE / "evidence/scripts" / name).read_text())
|
||||
sc.load()
|
||||
print(f" loaded {name} +{time.time()-t0:.2f}s", flush=True)
|
||||
dt = time.time() - t_start
|
||||
t_start = time.time()
|
||||
d.resume(pid)
|
||||
print(f" spawn->resume 挂起 {dt*1000:.0f}ms", flush=True)
|
||||
|
||||
elif which in ("d",):
|
||||
print("[D] 正常启动7s后 attach 主进程(裸)", flush=True)
|
||||
adb("shell", "monkey", "-p", PACKAGE, "-c", "android.intent.category.LAUNCHER", "1")
|
||||
time.sleep(7)
|
||||
pid = main_pid()
|
||||
print(f" pid={pid}, 开始attach", flush=True)
|
||||
try:
|
||||
s = d.attach(pid)
|
||||
sc = s.create_script("console.log('bare attach ok');")
|
||||
sc.load()
|
||||
print(" bare attach loaded", flush=True)
|
||||
except Exception as e:
|
||||
print(f" attach err {e}", flush=True)
|
||||
t_start = time.time()
|
||||
|
||||
else:
|
||||
print(f"未知: {which}"); return
|
||||
|
||||
# 观察 60s, 每 2s 快照
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 25:
|
||||
time.sleep(2)
|
||||
s = snapshot(label)
|
||||
s["elapsed"] = round(time.time() - t0, 1)
|
||||
timeline.append(s)
|
||||
if s["ui_ok"]:
|
||||
print(f" +{s['elapsed']:5.1f}s proc={s['proc']} UI={s['focus']}", flush=True)
|
||||
else:
|
||||
print(f" +{s['elapsed']:5.1f}s proc={s['proc']} UI_FAIL focus={s['focus']}", flush=True)
|
||||
if not s["proc"] and s["elapsed"] > 3:
|
||||
break
|
||||
crashes, tail = crash_count()
|
||||
final = snapshot(label)
|
||||
result = {"case": label, "timeline": timeline, "final": final,
|
||||
"crashes_in_buffer": crashes, "crash_tail": tail[:1500]}
|
||||
out = OUT_DIR / f"diag_{label.lower()}.json"
|
||||
out.write_text(json.dumps(result, ensure_ascii=False, indent=1))
|
||||
print(f"[*] 结果 -> {out} | 最终: proc={final['proc']} ui_ok={final['ui_ok']} crashes={crashes}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,195 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 attach+三件套 对照实验:
|
||||
1) 干净启动 App → 自动走到账号密码登录页 → 填表 → 登录 → 观察验证码是否加载(基线)
|
||||
2) attach frida 三件套(bypass_msaoaid_maps_skip_cleanup + mask_frida_maps_only + patch_guard)
|
||||
→ 观察存活 → 重新走登录 → 观察验证码是否加载(对照)
|
||||
|
||||
用 RE 仓库 .venv 环境与 RE 仓库 evidence/scripts 三件套。"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("/tmp/emu_attach_captcha.json")
|
||||
TRIO = [
|
||||
(RE / "evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js", "bypass_main"),
|
||||
(RE / "evidence/scripts/mask_frida_maps_only.js", "mask_frida"),
|
||||
(RE / "evidence/scripts/patch_guard_block_termination.js", "patch_guard"),
|
||||
]
|
||||
|
||||
def sh(*args, **kw):
|
||||
return subprocess.run(args, capture_output=True, text=True, **kw)
|
||||
|
||||
def adb(*args):
|
||||
return sh(*ADB, *args)
|
||||
|
||||
def force_stop():
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
|
||||
def launch():
|
||||
adb("shell", "monkey", "-p", PACKAGE, "-c", "android.intent.category.LAUNCHER", "1")
|
||||
time.sleep(6)
|
||||
|
||||
def wait_pid(timeout=20):
|
||||
for _ in range(timeout):
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
if r.stdout.strip():
|
||||
return int(r.stdout.strip().split()[0])
|
||||
time.sleep(1)
|
||||
return None
|
||||
|
||||
def ui_dump():
|
||||
adb("shell", "uiautomator", "dump", "/data/local/tmp/ui.xml")
|
||||
r = adb("shell", "cat", "/data/local/tmp/ui.xml")
|
||||
return r.stdout
|
||||
|
||||
def find_bounds(xml, text):
|
||||
import re
|
||||
m = re.search(r'<node[^>]*text="' + re.escape(text) + r'"[^>]*bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"', xml)
|
||||
if m:
|
||||
x1, y1, x2, y2 = map(int, m.groups())
|
||||
return (x1 + x2) // 2, (y1 + y2) // 2
|
||||
return None
|
||||
|
||||
def tap(x, y):
|
||||
adb("shell", "input", "tap", str(x), str(y))
|
||||
|
||||
def input_text(s):
|
||||
adb("shell", "input", "text", s)
|
||||
|
||||
def go_login_page():
|
||||
"""从首页走到账号密码登录页. 返回 True 若成功."""
|
||||
xml = ui_dump()
|
||||
# 我的
|
||||
b = find_bounds(xml, "我的")
|
||||
if not b:
|
||||
return False
|
||||
tap(*b); time.sleep(2.5)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "立即登录")
|
||||
if not b:
|
||||
return False
|
||||
tap(*b); time.sleep(3)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "账号密码登录")
|
||||
if not b:
|
||||
# 已经是验证码登录页, 尝试切换
|
||||
print(" [!] 未找到账号密码登录tab", flush=True)
|
||||
return False
|
||||
tap(*b); time.sleep(2)
|
||||
return True
|
||||
|
||||
def fill_and_submit():
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "手机号/虎牙号")
|
||||
if not b:
|
||||
b = find_bounds(xml, "请填写手机号码")
|
||||
if not b:
|
||||
return False
|
||||
tap(*b); time.sleep(0.4); input_text("13800138000")
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "密码")
|
||||
if b:
|
||||
tap(*b); time.sleep(0.4); input_text("test12345678")
|
||||
time.sleep(0.6)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "立即登录")
|
||||
if not b:
|
||||
return False
|
||||
tap(*b); time.sleep(2)
|
||||
# 协议弹窗
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "同意并继续")
|
||||
if b:
|
||||
tap(*b); time.sleep(4)
|
||||
return True
|
||||
|
||||
def captcha_status():
|
||||
xml = ui_dump()
|
||||
nodes = xml.replace("></", ">\n</")
|
||||
texts = [m for m in nodes.splitlines() if 'text="' in m]
|
||||
joined = " | ".join(t for t in texts if 'text="' in t)
|
||||
has_slider = "滑块" in joined or "拼图" in joined or "安全验证" in joined
|
||||
has_webview = "android.webkit.WebView" in joined
|
||||
# 统计关键文本
|
||||
keys = [k for k in ("安全验证", "滑块", "拼图", "验证码", "网络异常", "加载失败", "请稍后") if k in joined]
|
||||
return {"ok": has_slider and has_webview, "webview": has_webview, "slider": has_slider,
|
||||
"keys": keys, "texts": [l.strip() for l in nodes.splitlines() if 'text="' in l and l.strip().startswith('<node')][:12]}
|
||||
|
||||
def attach_trio(d, pid):
|
||||
session = d.attach(pid)
|
||||
print(f"[*] attach pid={pid}", flush=True)
|
||||
loaded = []
|
||||
for js_path, name in TRIO:
|
||||
try:
|
||||
sc = session.create_script(js_path.read_text())
|
||||
sc.on('message', lambda m, dd, n=name: print(f" [{n}] {m.get('payload') if m.get('type')=='send' else m}", flush=True))
|
||||
sc.load()
|
||||
loaded.append(name)
|
||||
time.sleep(0.15)
|
||||
except Exception as e:
|
||||
print(f" [!] {name} 加载失败: {e}", flush=True)
|
||||
print(f"[*] 三件套已加载: {loaded}", flush=True)
|
||||
return session
|
||||
|
||||
def main():
|
||||
results = {"baseline": None, "with_frida": None, "captcha_baseline": None, "captcha_with_frida": None}
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
|
||||
# ---- 基线: 无 frida 走登录 ----
|
||||
print("===== 基线: 无 frida =====", flush=True)
|
||||
force_stop(); launch()
|
||||
pid = wait_pid()
|
||||
results["baseline"] = pid
|
||||
print(f"[*] app pid={pid}", flush=True)
|
||||
if pid and go_login_page() and fill_and_submit():
|
||||
time.sleep(5)
|
||||
results["captcha_baseline"] = captcha_status()
|
||||
print(f"[*] 基线验证码: {json.dumps(results['captcha_baseline'], ensure_ascii=False)}", flush=True)
|
||||
|
||||
# ---- 对照: attach 三件套 ----
|
||||
print("===== 对照: attach + 三件套 =====", flush=True)
|
||||
pid = wait_pid()
|
||||
if not pid:
|
||||
print("[!] app 未运行", flush=True)
|
||||
return
|
||||
session = attach_trio(d, pid)
|
||||
results["with_frida"] = pid
|
||||
# 观察存活
|
||||
alive = True
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 40:
|
||||
time.sleep(2)
|
||||
try:
|
||||
cur = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
except Exception:
|
||||
cur = []
|
||||
if not cur:
|
||||
alive = False
|
||||
print(f"[!] attach 后 App 死亡于 +{time.time()-t0:.0f}s", flush=True)
|
||||
session = None
|
||||
break
|
||||
results["frida_survival_s"] = int(time.time() - t0) if alive else int(time.time() - t0)
|
||||
print(f"[*] attach 后存活: {'YES' if alive else 'NO'} ({results['frida_survival_s']}s)", flush=True)
|
||||
|
||||
if alive:
|
||||
# 回到登录页重新走
|
||||
if go_login_page() and fill_and_submit():
|
||||
time.sleep(5)
|
||||
results["captcha_with_frida"] = captcha_status()
|
||||
print(f"[*] frida 下验证码: {json.dumps(results['captcha_with_frida'], ensure_ascii=False)}", flush=True)
|
||||
else:
|
||||
results["captcha_with_frida"] = "app died"
|
||||
|
||||
OUT.write_text(json.dumps(results, ensure_ascii=False, indent=1))
|
||||
print(f"[*] 结果写入 {OUT}", flush=True)
|
||||
try:
|
||||
if session: session.detach()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,142 @@
|
||||
#!/usr/bin/env python3
|
||||
"""完整链路验证: 正常启动App → attach + SSL_write hook → 存活观察 + 抓dfpReport.
|
||||
|
||||
基于最新发现: attach 不再必然被杀 (E0-E7 状态依赖)。
|
||||
流程:
|
||||
1. monkey 正常启动 App (无 frida)
|
||||
2. 等 8s (App 完全起来)
|
||||
3. attach 主进程 + SSL_write/SSL_read hook (零 bypass)
|
||||
4. 用 /proc 精确监控主进程存活; logcat crash 同步
|
||||
5. 观察到 dfpReport + actionV 即停
|
||||
|
||||
用法: python3 emu_attach_capture_v2.py [--waits N] [--observe S]
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, re, subprocess, sys, argparse
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
|
||||
MAIN_JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed', t:Date.now()});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++; send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,t:Date.now(),hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked', t:Date.now()});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var nn=ret.toInt32();
|
||||
if(nn<=0||nn>4000)return;
|
||||
send({type:'resp',len:nn,hex:hexb(this.buf,nn),t:Date.now()});
|
||||
}});
|
||||
});
|
||||
send({type:'readhooked'});
|
||||
}catch(e){send({type:'readerr',e:String(e)});}
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--wait", type=float, default=8.0)
|
||||
ap.add_argument("--observe", type=int, default=40)
|
||||
ap.add_argument("--out", default="/Users/yml/codes/douyu_login_py/evidence/emu_attach_capture_v2.json")
|
||||
args = ap.parse_args()
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
adb("shell", "logcat", "-c")
|
||||
adb("shell", "monkey", "-p", PACKAGE, "-c", "android.intent.category.LAUNCHER", "1")
|
||||
time.sleep(args.wait)
|
||||
pid = main_pid()
|
||||
print(f"[*] App 启动 {args.wait}s, 主进程 pid={pid}", flush=True)
|
||||
if pid is None:
|
||||
print("[!] 无主进程, 退出"); return
|
||||
t0 = time.time()
|
||||
try:
|
||||
session = d.attach(pid)
|
||||
print(f"[*] attach ok at +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
except Exception as e:
|
||||
print(f"[!] attach err {e}", flush=True); return
|
||||
|
||||
events = []
|
||||
got_dfp = [False]
|
||||
actionVs = []
|
||||
def on_main(m, dta):
|
||||
if m.get('type') == 'error':
|
||||
print(" [JS-ERR]", str(m)[:120], flush=True)
|
||||
return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'hooked':
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[*] {p['cls']} len={p['len']}", flush=True)
|
||||
events.append(p)
|
||||
if p['cls'] == 'dfpReport': got_dfp[0] = True
|
||||
elif t == 'resp':
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p.get('hex') or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
if av: actionVs.append(av.group(1).decode())
|
||||
if av: print(f"[*] RESP actionV {av.group(1).decode()}", flush=True)
|
||||
events.append(p)
|
||||
def on_detach(reason, detail):
|
||||
print(f"[*] DETACHED reason={reason} detail={str(detail)[:100]}", flush=True)
|
||||
session.on('detached', on_detach)
|
||||
try:
|
||||
sc = session.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
except Exception as e:
|
||||
print(f"[!] script err {e}", flush=True)
|
||||
|
||||
# 监控: 每2s 主进程存活
|
||||
died_at = None
|
||||
while time.time() - t0 < args.observe:
|
||||
time.sleep(2)
|
||||
mp = main_pid()
|
||||
if mp is None:
|
||||
died_at = time.time() - t0
|
||||
print(f"[*] 主进程死 at +{died_at:.0f}s", flush=True)
|
||||
break
|
||||
if mp != pid:
|
||||
print(f"[*] pid变化 {pid}->{mp} (KeepAlive?) at +{time.time()-t0:.0f}s", flush=True)
|
||||
died_at = time.time() - t0
|
||||
break
|
||||
cr = adb("shell", "logcat", "-d", "-b", "crash", "-t", "10").stdout
|
||||
print(f"[*] 结果: 存活={died_at is None} 存活时长={died_at or args.observe}s EGL崩={'EGL' in cr} 事件={len(events)} actionV={actionVs[:2]}", flush=True)
|
||||
Path(args.out).write_text(json.dumps(events, ensure_ascii=False, indent=1))
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
print(f"[*] done -> {args.out}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""复现实验: attach + 只读 Interceptor 是否让 msaoaidsec 检测失效 (App 存活).
|
||||
|
||||
假设: 空 attach (E0) 2s 静默死; attach+trace的只读 Interceptor 装到 msaoaidsec 内
|
||||
(+0x1bfac 线程名检测器入口 / +0x1c0e4,0x1c0f8 strstr callsite) 后 App 存活.
|
||||
实验设计 (每轮):
|
||||
1. spawn → attach → 加载 trace_msaoaid_thread_strstr_plt.js (只读, 不patch不mask)
|
||||
2. resume → 用 /proc 精确监控主进程 20s
|
||||
3. 记录: 存活? 死亡时刻? 是否EGL崩? 收到的strstr事件?
|
||||
控制组: 相同流程但不加载任何脚本 (= E0 复现)
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys, re
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def run_round(d, rnd, script_name=None, observe=20):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.2)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = d.spawn([PACKAGE])
|
||||
session = d.attach(pid)
|
||||
t0 = time.time()
|
||||
events = []
|
||||
def on(m, dta):
|
||||
if m.get('type') != 'send': return
|
||||
p = m.get('payload') or {}
|
||||
events.append(p)
|
||||
ev = p.get('event', '?')
|
||||
if ev in ('msaoaid-thread-strstr',):
|
||||
print(f"[r{rnd} +{time.time()-t0:5.2f}s] STRSTR needle={p.get('needle')} haystack={p.get('haystack','')[:30]!r}", flush=True)
|
||||
elif ev == 'msaoaid-thread-strstr-return':
|
||||
print(f"[r{rnd} +{time.time()-t0:5.2f}s] STRSTR-RET needle={p.get('needle')} hit={p.get('returnedNonNull')}", flush=True)
|
||||
if script_name:
|
||||
sc = session.create_script((RE / "evidence/scripts" / script_name).read_text())
|
||||
sc.on('message', on)
|
||||
sc.load()
|
||||
d.resume(pid)
|
||||
print(f"[r{rnd}] resume at +{(time.time()-t0)*1000:.0f}ms script={script_name}", flush=True)
|
||||
# 监控
|
||||
died_at = None
|
||||
while time.time() - t0 < observe:
|
||||
time.sleep(2)
|
||||
if main_pid() is None:
|
||||
died_at = time.time() - t0
|
||||
break
|
||||
cr = adb("shell", "logcat", "-d", "-b", "crash", "-t", "8").stdout
|
||||
status = "存活" if died_at is None else f"死@+{died_at:.1f}s"
|
||||
egl = "EGL" in cr or "libEGL" in cr
|
||||
print(f"[r{rnd}] 结果: {status} EGL崩={egl} events={len(events)}", flush=True)
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
return {"round": rnd, "script": script_name, "died_at": died_at, "egl": egl, "n_events": len(events)}
|
||||
|
||||
def main():
|
||||
scripts = sys.argv[1:] or ["None", "trace_msaoaid_thread_strstr_plt.js"]
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
results = []
|
||||
for script in scripts:
|
||||
for rnd in (1, 2):
|
||||
r = run_round(d, rnd, None if script == "None" else script)
|
||||
results.append(r)
|
||||
print(f" → {r}", flush=True)
|
||||
out = Path("/tmp/attach_trace_survival.json")
|
||||
out.write_text(json.dumps(results, indent=1, ensure_ascii=False))
|
||||
print(f"[*] -> {out}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,175 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器抓包 v11: B组优先三策略 (基于 diag E0-E7 实验结论).
|
||||
|
||||
结论回顾 (GC3VE/Android12/frida15.2.2):
|
||||
- 纯 spawn→resume (不attach) = 存活, 但无 hook 能力 (B组/E3, 多次3/3存活)
|
||||
- 任何 attach (挂起中/延迟, 有无脚本) = 被杀: 空attach静默_exit / attach+bypass=EGL崩
|
||||
- 历史上 spawn+挂起attach+bypass 曾抓到 dfpReport+actionV, 但 App 随后必崩 (抢窗口)
|
||||
|
||||
本脚本提供三种模式:
|
||||
zero (默认) 纯B组: spawn→立即resume→存活观察 (无hook, 验证App真能活/验证码可用)
|
||||
race B组+延迟attach: resume后2s attach+bypass+SSLhook, 抢dfp窗口 (接受闪退)
|
||||
stale 旧法对照: 挂起中加载 art_callsite+mask 再resume (复现历史成功路径)
|
||||
|
||||
用法: python3 emu_hook_zero_suspend.py [--mode zero|race|stale] [--rounds N] [--out path]
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, re, subprocess, sys, argparse
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
|
||||
MAIN_JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed', t:Date.now()});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++; send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,t:Date.now(),hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked', t:Date.now()});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var nn=ret.toInt32();
|
||||
if(nn<=0||nn>4000)return;
|
||||
send({type:'resp',len:nn,hex:hexb(this.buf,nn),t:Date.now()});
|
||||
}});
|
||||
});
|
||||
send({type:'readhooked'});
|
||||
}catch(e){send({type:'readerr',e:String(e)});}
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def detach_cb(reason, detail, tag=""):
|
||||
print(f" [detached:{tag}] reason={reason} detail={str(detail)[:120]}", flush=True)
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--mode", default="zero", choices=["zero", "race", "stale"])
|
||||
ap.add_argument("--out", default="/Users/yml/codes/douyu_login_py/evidence/emu_hook_v11.json")
|
||||
ap.add_argument("--rounds", type=int, default=2)
|
||||
args = ap.parse_args()
|
||||
out_path = Path(args.out)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
print(f"[*] mode={args.mode} rounds={args.rounds} OUT={out_path}", flush=True)
|
||||
all_events = []
|
||||
|
||||
for rnd in range(1, args.rounds + 1):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.2)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = None
|
||||
session = None
|
||||
try:
|
||||
pid = d.spawn([PACKAGE])
|
||||
t_spawn = time.time()
|
||||
if args.mode == "stale":
|
||||
# 旧法: 挂起中加载2个脚本再resume
|
||||
session = d.attach(pid)
|
||||
session.on('detached', lambda r, dd, t=f"[r{rnd}]": detach_cb(r, dd, t))
|
||||
for name in ("bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js"):
|
||||
sc = session.create_script((RE/"evidence/scripts"/name).read_text()); sc.load()
|
||||
suspend_ms = (time.time() - t_spawn) * 1000
|
||||
d.resume(pid)
|
||||
print(f"[r{rnd}] stale: spawn pid={pid} 挂起{suspend_ms:.0f}ms(2脚本) resumed", flush=True)
|
||||
time.sleep(0.5)
|
||||
else:
|
||||
# zero/race: 先立即 resume (B组存活)
|
||||
d.resume(pid)
|
||||
print(f"[r{rnd}] spawn pid={pid} 立即resumed (B组存活)", flush=True)
|
||||
if args.mode == "race":
|
||||
time.sleep(2.0)
|
||||
t_att = time.time()
|
||||
session = d.attach(pid)
|
||||
session.on('detached', lambda r, dd, t=f"[r{rnd}]": detach_cb(r, dd, t))
|
||||
for name in ("bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js"):
|
||||
sc = session.create_script((RE/"evidence/scripts"/name).read_text()); sc.load()
|
||||
print(f"[r{rnd}] race: attach at +{(time.time()-t_spawn)*1000:.0f}ms +2脚本 +{(time.time()-t_att)*1000:.0f}ms", flush=True)
|
||||
|
||||
events = []
|
||||
got_dfp = [False]
|
||||
actionVs = []
|
||||
def on_main(m, dta):
|
||||
if m.get('type') == 'error':
|
||||
return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'hooked':
|
||||
print(f"[r{rnd}] SSL_write hooked", flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[r{rnd}] {p['cls']} len={p['len']}", flush=True)
|
||||
events.append(p); all_events.append(p)
|
||||
if p['cls'] == 'dfpReport': got_dfp[0] = True
|
||||
elif t == 'resp':
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p.get('hex') or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
if av: actionVs.append(av.group(1).decode())
|
||||
print(f"[r{rnd}] RESP len={p['len']}{mark}", flush=True)
|
||||
events.append(p); all_events.append(p)
|
||||
if session:
|
||||
sc = session.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
|
||||
# 存活监控 (死因判定: crash buffer 有记录=EGL崩, 无=静默_exit)
|
||||
t0 = time.time()
|
||||
died_at = None
|
||||
while time.time() - t0 < 30:
|
||||
time.sleep(2)
|
||||
mp = main_pid()
|
||||
if mp is None:
|
||||
died_at = time.time() - t0
|
||||
break
|
||||
if mp != pid:
|
||||
print(f"[r{rnd}] pid变化 {pid}->{mp} (KeepAlive重启)", flush=True)
|
||||
died_at = time.time() - t0
|
||||
break
|
||||
if got_dfp[0] and time.time() - t0 > 15:
|
||||
break
|
||||
cr = adb("shell", "logcat", "-d", "-b", "crash", "-t", "20").stdout
|
||||
crashed = bool(re.search(r"Fatal|Abort message|signal \d", cr))
|
||||
print(f"[r{rnd}] 结束: 存活={died_at is None} 死后至+{round(died_at,1) if died_at else '-'} 崩={crashed} 事件={len(events)} actionV={actionVs[:2]}", flush=True)
|
||||
try:
|
||||
if session: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
except Exception as e:
|
||||
print(f"[r{rnd}] ERR {repr(e)[:140]}", flush=True)
|
||||
try:
|
||||
if session: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1.5)
|
||||
out_path.write_text(json.dumps(all_events, ensure_ascii=False, indent=1))
|
||||
print(f"[*] 结束 事件={len(all_events)} -> {out_path}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/env python3
|
||||
"""msaoaidsec 检测面精确归因 v2 (修正误判版).
|
||||
|
||||
上次 attach_trace_survival 用 main_pid() is None 判断死亡 —— 错!
|
||||
KeepAlive 重启会换 pid, main_pid() 返回新 pid, 误报"存活"。
|
||||
本版: 死亡判定 = pid 变化 或 无主进程 (均算死), 并采集:
|
||||
1. trace_msaoaid_thread_strstr_plt.js — 线程名检测器 strstr 命中 (needle=?)
|
||||
2. trace_msaoaid_exit_sources.js (API兼容修复) — _exit PLT slot 观察, backtrace 帧
|
||||
每组 spawn+attach (挂起中加载脚本, 立即resume), 观察 12s。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
# frida 15 兼容修复: getGlobalExportByName -> findExportByName
|
||||
def fix_script(text):
|
||||
return text.replace("Module.getGlobalExportByName(", "Module.findExportByName(null, ")
|
||||
|
||||
def run_case(d, rnd, scripts):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.2)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = d.spawn([PACKAGE])
|
||||
session = d.attach(pid)
|
||||
t0 = time.time()
|
||||
events = []
|
||||
def on(m, dta):
|
||||
if m.get('type') != 'send':
|
||||
if m.get('type') == 'error':
|
||||
print(f" [JS-ERR] {str(m)[:100]}", flush=True)
|
||||
return
|
||||
p = m.get('payload') or {}
|
||||
ev = p.get('event', '?')
|
||||
line = f"[r{rnd} +{time.time()-t0:6.2f}s] {ev}"
|
||||
if ev == 'msaoaid-thread-strstr':
|
||||
line += f" needle={p.get('needle')} hay={p.get('haystack','')[:30]!r}"
|
||||
elif ev == 'msaoaid-thread-strstr-return':
|
||||
line += f" needle={p.get('needle')} hit={p.get('returnedNonNull')} ret={p.get('returnPointer')}"
|
||||
elif ev == 'msaoaid-exit-source':
|
||||
line += f" status={p.get('status')} tid={p.get('tid')} frames={p.get('frames')}"
|
||||
elif ev in ('msaoaid-exit-got-thread-exit', 'msaoaid-exit-got-thread-exit-installed'):
|
||||
line += f" data={p.get('status') or p.get('slot')}"
|
||||
print(line, flush=True)
|
||||
events.append(p)
|
||||
for name in scripts:
|
||||
try:
|
||||
text = (RE / "evidence/scripts" / name).read_text()
|
||||
sc = session.create_script(fix_script(text))
|
||||
sc.on('message', on)
|
||||
sc.load()
|
||||
print(f"[r{rnd}] loaded {name} +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
except Exception as e:
|
||||
print(f"[r{rnd}] load-err {name}: {e}", flush=True)
|
||||
d.resume(pid)
|
||||
print(f"[r{rnd}] resumed +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
# 精确死亡判定: pid变化或无主进程
|
||||
died = None
|
||||
change = None
|
||||
while time.time() - t0 < 12:
|
||||
time.sleep(1.5)
|
||||
mp = main_pid()
|
||||
if mp is None:
|
||||
died = time.time() - t0
|
||||
print(f"[r{rnd}] DEAD(no main) at +{died:.1f}s", flush=True)
|
||||
break
|
||||
if mp != pid:
|
||||
change = (mp, round(time.time() - t0, 1))
|
||||
print(f"[r{rnd}] PID CHANGED {pid}->{mp} at +{change[1]}s (主进程死/重启)", flush=True)
|
||||
break
|
||||
if died is None and change is None:
|
||||
print(f"[r{rnd}] 存活满12s (pid={pid} 未变)", flush=True)
|
||||
cr = adb("shell", "logcat", "-d", "-b", "crash", "-t", "6").stdout
|
||||
egl = "EGL" in cr
|
||||
print(f"[r{rnd}] EGL崩={egl}", flush=True)
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
return {"round": rnd, "scripts": scripts, "died_at": died, "pid_change": change, "egl": egl, "events": events}
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
# 组1: 只读线程名探针 (不patch不mask)
|
||||
r1 = run_case(d, 1, ["trace_msaoaid_thread_strstr_plt.js"])
|
||||
# 组2: 只读线程名探针 + exit源观察
|
||||
r2 = run_case(d, 2, ["trace_msaoaid_thread_strstr_plt.js", "trace_msaoaid_exit_sources.js"])
|
||||
# 组3: 只读 exit源观察 (无线程名探针, 减少干扰)
|
||||
r3 = run_case(d, 3, ["trace_msaoaid_exit_sources.js"])
|
||||
out = Path("/tmp/msaoaid_precise.json")
|
||||
out.write_text(json.dumps([r1, r2, r3], ensure_ascii=False, indent=1))
|
||||
print(f"[*] -> {out}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,150 @@
|
||||
#!/usr/bin/env python3
|
||||
"""frida 存活期间验证码加载对照实验 (模拟器, spawn+bypass 三件套).
|
||||
|
||||
复用 hook_emu_stable.py 的加载顺序 (art_callsite 版 bypass → 立即 resume → patch_guard),
|
||||
主 hook 只挂轻量 SSL hook (不干扰 UI), 然后用 adb UI 自动化走到登录→验证码,
|
||||
验证: spawn+bypass 存活时, 极验验证码能否正常加载。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, re, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("/tmp/emu_spawn_captcha.json")
|
||||
|
||||
def sh(*args): return subprocess.run(args, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
MAIN_JS = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
/* 轻量: 只投递存活心跳, 不碰 UI 线程逻辑 */
|
||||
setInterval(function(){ send({type:'alive', t:Date.now()}); }, 5000);
|
||||
"""
|
||||
|
||||
def ui_dump():
|
||||
adb("shell", "uiautomator", "dump", "/data/local/tmp/ui.xml")
|
||||
return adb("shell", "cat", "/data/local/tmp/ui.xml").stdout
|
||||
|
||||
def find_bounds(xml, text):
|
||||
m = re.search(r'<node[^>]*text="' + re.escape(text) + r'"[^>]*bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"', xml)
|
||||
if not m: return None
|
||||
x1, y1, x2, y2 = map(int, m.groups())
|
||||
return (x1 + x2) // 2, (y1 + y2) // 2
|
||||
|
||||
def tap(x, y): adb("shell", "input", "tap", str(x), str(y))
|
||||
def type_text(s): adb("shell", "input", "text", s)
|
||||
|
||||
def go_login(force=False):
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "我的")
|
||||
if not b: return False
|
||||
tap(*b); time.sleep(2.5)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "立即登录")
|
||||
if not b: return False
|
||||
tap(*b); time.sleep(3)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "账号密码登录")
|
||||
if b:
|
||||
tap(*b); time.sleep(2)
|
||||
return True
|
||||
|
||||
def fill_submit():
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "手机号/虎牙号") or find_bounds(xml, "请填写手机号码")
|
||||
if not b: return False
|
||||
tap(*b); time.sleep(0.4); type_text("13800138000")
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "密码")
|
||||
if b:
|
||||
tap(*b); time.sleep(0.4); type_text("test12345678")
|
||||
time.sleep(0.6)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "立即登录")
|
||||
if not b: return False
|
||||
tap(*b); time.sleep(2)
|
||||
xml = ui_dump()
|
||||
b = find_bounds(xml, "同意并继续")
|
||||
if b:
|
||||
tap(*b); time.sleep(4)
|
||||
return True
|
||||
|
||||
def captcha_status():
|
||||
xml = ui_dump()
|
||||
joined = xml
|
||||
webview = "android.webkit.WebView" in joined
|
||||
slider = any(k in joined for k in ("滑块", "拼图", "安全验证"))
|
||||
return {"webview": webview, "slider": slider,
|
||||
"focus": adb("shell", "dumpsys window").stdout.count("OakVerifyActivity") > 0}
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
result = {}
|
||||
|
||||
# ===== 阶段1: 无 frida 基线 =====
|
||||
print("== 阶段1: 无frida 基线 ==", flush=True)
|
||||
adb("shell", "am", "force-stop", PACKAGE); time.sleep(1.2)
|
||||
adb("shell", "monkey", "-p", PACKAGE, "-c", "android.intent.category.LAUNCHER", "1")
|
||||
time.sleep(8)
|
||||
if go_login() and fill_submit():
|
||||
time.sleep(5)
|
||||
result["baseline_no_frida"] = captcha_status()
|
||||
print(" 验证码:", result["baseline_no_frida"], flush=True)
|
||||
else:
|
||||
print(" 基线流程失败", flush=True)
|
||||
|
||||
# ===== 阶段2: spawn+bypass 存活时 =====
|
||||
print("== 阶段2: spawn+bypass ==", flush=True)
|
||||
adb("shell", "am", "force-stop", PACKAGE); time.sleep(1.2)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f" spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
def fast_load(path):
|
||||
try:
|
||||
s = session.create_script(path.read_text()); s.load(); return True
|
||||
except Exception as e:
|
||||
print(f" [load-err] {e}", flush=True); return False
|
||||
fast_load(RE / "evidence/scripts/bypass_msaoaid_maps_art_callsite.js")
|
||||
fast_load(RE / "evidence/scripts/mask_frida_maps_only.js")
|
||||
d.resume(pid)
|
||||
print(" resumed", flush=True)
|
||||
try:
|
||||
sg = session.create_script((RE/"evidence/scripts/patch_guard_block_termination.js").read_text()); sg.load()
|
||||
except Exception as e:
|
||||
print(f" [guard-err] {e}", flush=True)
|
||||
|
||||
alive_events = []
|
||||
def on_main(m, dta):
|
||||
if m.get('type') == 'send':
|
||||
p = m.get('payload') or {}
|
||||
if p.get('type') == 'alive':
|
||||
alive_events.append(p)
|
||||
elif m.get('type') == 'error':
|
||||
print(" [JS-ERR]", str(m)[:120], flush=True)
|
||||
sc = session.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
|
||||
# 等 UI 起来
|
||||
time.sleep(8)
|
||||
alive = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
result["spawn_alive_at_8s"] = bool(alive)
|
||||
print(f" 8s 存活: {bool(alive)}", flush=True)
|
||||
if alive and go_login() and fill_submit():
|
||||
time.sleep(5)
|
||||
result["captcha_with_frida_alive"] = captcha_status()
|
||||
print(" frida存活时验证码:", result["captcha_with_frida_alive"], flush=True)
|
||||
alive2 = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
result["spawn_alive_at_end"] = bool(alive2)
|
||||
result["alive_heartbeats"] = len(alive_events)
|
||||
print(f" 最终存活: {bool(alive2)}, 心跳数: {len(alive_events)}", flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
OUT.write_text(json.dumps(result, ensure_ascii=False, indent=1))
|
||||
print("[*] done ->", OUT, flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
"""hook BusinessCfg::setSafeDeviceId + getHdid, 抓真实 hdid/safeDeviceId 生成值 + 调用栈.
|
||||
setSafeDeviceId(a1+1008=safeDeviceId, a1+1088=hdid), a2=argv1(safeDeviceId str), a3=argv2(hdid str)
|
||||
同时 hook createWupDeviceInfo 观察 DeviceInfo 组装.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json
|
||||
REMOTE="127.0.0.1:31878"; PACKAGE="com.duowan.kiwi"
|
||||
RE=Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
JS=r"""
|
||||
'use strict';
|
||||
function rcs(p,n){try{return p.readCString(n)||'';}catch(e){return '';}}
|
||||
function st7(p){ // std::string (libc++ short/long form)
|
||||
try{ var s=rcs(p,64); return s; }catch(e){return '<?>';}
|
||||
}
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
|
||||
// setSafeDeviceId: a2=std::string*a=safeDeviceId, a3=std::string*a2=hdid
|
||||
function tryInstall(){
|
||||
var md=Process.findModuleByName('libudbauthunify.so');
|
||||
if(!md){ send({type:'waiting'}); return false; }
|
||||
send({type:'mod',base:md.base.toString()});
|
||||
Interceptor.attach(md.base.add(0x26A2E0),{
|
||||
onEnter:function(a){
|
||||
var sd=st7(a[1]); var hd=st7(a[2]);
|
||||
send({type:'setSd',sd:sd.slice(0,64),hd:hd.slice(0,64),tid:Process.getCurrentThreadId()});
|
||||
var bt=Thread.backtrace(this.context,Backtracer.ACCURATE).slice(0,14).map(function(x){return x.toString();});
|
||||
send({type:'bt',bt:bt});
|
||||
}
|
||||
});
|
||||
send({type:'setSd_hooked'});
|
||||
Interceptor.attach(md.base.add(0x26A484),{
|
||||
onEnter:function(){ this.out=this.context.x8; },
|
||||
onLeave:function(retval){
|
||||
try{
|
||||
var out=this.out;
|
||||
if(out.isNull()){ send({type:'getHdid',str:'NULL'}); return; }
|
||||
// std::string: 字节0的低位=SSO标志
|
||||
var first=out.readU8();
|
||||
if((first & 1)===0){
|
||||
// short string: len = first>>1; data in [out+1..]
|
||||
var len=first>>1; var s=out.add(1).readCString(Math.max(0,Math.min(len,80)));
|
||||
send({type:'getHdid',str:''+s,ln:len});
|
||||
} else {
|
||||
var p=out.readPointer(); var len=out.add(8).readU64(); var cap=out.add(16).readU64();
|
||||
var s=p.readCString(Math.max(0,Math.min(len,80)));
|
||||
send({type:'getHdid',str:''+s,ln:len,heap:true});
|
||||
}
|
||||
}catch(e){ send({type:'getHdid',err:String(e)}); }
|
||||
}
|
||||
});
|
||||
send({type:'getHdid_hooked'});
|
||||
return true;
|
||||
}
|
||||
var installed=false;
|
||||
function poll(){
|
||||
if(!installed){ installed=tryInstall(); }
|
||||
if(!installed){ setTimeout(poll,300); }
|
||||
}
|
||||
poll();
|
||||
"""
|
||||
def main():
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for a in range(1,4):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True); time.sleep(1)
|
||||
pid=d.spawn([PACKAGE]); s=d.attach(pid)
|
||||
try:
|
||||
b=s.create_script((RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text()); b.load()
|
||||
except: pass
|
||||
d.resume(pid)
|
||||
def on(m,dd):
|
||||
if m.get('type')=='error': print(f" JSErr {str(m)[:150]}",flush=True); return
|
||||
p=m.get('payload') or {}; t=p.get('type')
|
||||
if t in ('setSd','getHdid'):
|
||||
print(f"[att{a}] {t}: {p}",flush=True)
|
||||
elif t=='bt': print(" backtrace:",flush=True);
|
||||
elif t=='err' or t=='err2': print(f" {t}: {p}",flush=True)
|
||||
sc=s.create_script(JS); sc.on('message',on); sc.load()
|
||||
time.sleep(16)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
time.sleep(1)
|
||||
print("done",flush=True)
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 attach 版 dfpReport 捕获 (轮询重启 attach, 覆盖冷启动窗口)。
|
||||
|
||||
App 在模拟器上 spawn 会 EGL 崩, 所以用 attach。但 attach 只能抓 attach 之后的请求,
|
||||
而 dfpReport 在冷启动早期就发。解法: 脚本后台反复 attach, 若 App 重启则重新 attach,
|
||||
每次保住最长的 hook 窗口。配合外部 force-stop 重启 App 来完整覆盖。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, json
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_attach_dfp.json")
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h='';try{h=a[1].readCString(Math.min(len,1500));}catch(e){return;}
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++;
|
||||
send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,t:Date.now(),hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
events = []
|
||||
seen_sessions = set()
|
||||
print(f"[*] attach 循环开始 (OUT={OUT})", flush=True)
|
||||
try:
|
||||
while True:
|
||||
# 找 kiwi 进程
|
||||
pid = None
|
||||
try:
|
||||
for p in d.enumerate_processes():
|
||||
if 'kiwi' in p.name or 'duowan' in p.name:
|
||||
pid = p.pid
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
if pid and pid not in seen_sessions:
|
||||
try:
|
||||
s = d.attach(pid)
|
||||
seen_sessions.add(pid)
|
||||
print(f"[*] attached pid={pid}", flush=True)
|
||||
sc = s.create_script(JS)
|
||||
sc.on('message', lambda m, data: _on(m, events))
|
||||
sc.load()
|
||||
print("[*] hooked", flush=True)
|
||||
# 保留这个会话
|
||||
_keep[pid] = (s, sc)
|
||||
except Exception as e:
|
||||
print(f"[*] attach {pid} err {e}", flush=True)
|
||||
time.sleep(3)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
OUT.write_text(json.dumps(events))
|
||||
print(f"[*] saved {len(events)} -> {OUT}", flush=True)
|
||||
|
||||
|
||||
_keep = {}
|
||||
|
||||
|
||||
def _on(message, events):
|
||||
if message.get('type') != 'send':
|
||||
if message.get('type') == 'error':
|
||||
print("[JS-ERR]", str(message)[:150], flush=True)
|
||||
return
|
||||
p = message.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'armed':
|
||||
return
|
||||
elif t == 'hooked':
|
||||
print("[*] ssl hooked on this attach", flush=True)
|
||||
elif t == 'err':
|
||||
print("[*] err", p.get('e'), flush=True)
|
||||
elif 'cls' in p:
|
||||
import re
|
||||
print(f"[{p.get('t')}] {p.get('cls')} len={p.get('len')}", flush=True)
|
||||
events.append(p)
|
||||
OUT.write_text(json.dumps(events))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器版 dfpReport 捕获: 验证全新模拟器是否为"新设备身份"。
|
||||
|
||||
连接 127.0.0.1:31878 (模拟器 frida 15.2.2), spawn 方式。
|
||||
只 hook SSL_write, 抓 dfpReport 请求 + 对应 606B 响应(内含 actionV/真或新 hdid)。
|
||||
若 attach/反调试, 用 bypass 三件套 (可选开关)。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json, time
|
||||
from pathlib import Path
|
||||
import frida
|
||||
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_dfp_" + time.strftime("%H%M%S") + ".json")
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
USE_BYPASS = True # 若 spawn 后闪退, 设为 False 再试
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
Process.setExceptionHandler(function(d){ return true; });
|
||||
send({type:'armed'});
|
||||
var t0 = Date.now();
|
||||
function hexb(p, n){ try{ return Array.from(new Uint8Array(p.readByteArray(n))).map(function(b){return ('0'+b.toString(16)).slice(-2)}).join(''); }catch(e){ return ''; } }
|
||||
function head(p, n){ try{ return p.readCString(n); }catch(e){ return ''; } }
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(!h)return;
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++;
|
||||
send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,
|
||||
t:Date.now()-t0,hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'sslwrite_hooked'});
|
||||
}catch(e){ send({type:'sslwrite_err',e:String(e)}); }
|
||||
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var n2=ret.toInt32();
|
||||
if(n2<=0||n2>3200)return;
|
||||
send({type:'resp',len:n2,hex:hexb(this.buf,n2),t:Date.now()-t0});
|
||||
}});
|
||||
});
|
||||
send({type:'sslread_hooked'});
|
||||
}catch(e){ send({type:'sslread_err',e:String(e)}); }
|
||||
"""
|
||||
|
||||
|
||||
def load(session, js, n=5, wait=2):
|
||||
for i in range(n):
|
||||
try:
|
||||
s = session.create_script(js); s.load(); return s
|
||||
except Exception as e:
|
||||
print(f"[retry {i}] {e}", flush=True); time.sleep(wait)
|
||||
return None
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
from subprocess import run
|
||||
try:
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn {PACKAGE} pid={pid}", flush=True)
|
||||
except Exception as e:
|
||||
# fallback attach
|
||||
pid = [p for p in d.enumerate_processes() if 'kiwi' in p.name or 'duowan' in p.name]
|
||||
pid = pid[0].pid if pid else None
|
||||
print(f"[*] spawn failed, attach pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
events = []
|
||||
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'armed':
|
||||
print("[*] armed", flush=True)
|
||||
elif t == 'sslwrite_hooked':
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
elif t == 'sslread_hooked':
|
||||
print("[*] SSL_read hooked", flush=True)
|
||||
elif t == 'req':
|
||||
print(f"[{p.get('t')}ms] [{p.get('n')}] {p.get('cls')} len={p.get('len')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
elif t == 'resp':
|
||||
import re
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p.get('hex') or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
print(f"[{p.get('t')}ms] [resp] len={p.get('len')}{mark}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
elif t in ('sslwrite_err','sslread_err'):
|
||||
print(f"[*] {t}: {p.get('e')}", flush=True)
|
||||
|
||||
if USE_BYPASS:
|
||||
print("[*] loading bypass", flush=True)
|
||||
load(session, (RE / "evidence/scripts/bypass_msaoaid_maps_art_callsite.js").read_text(), wait=1)
|
||||
load(session, (RE / "evidence/scripts/mask_frida_maps_only.js").read_text(), wait=1)
|
||||
d.resume(pid)
|
||||
time.sleep(9)
|
||||
load(session, (RE / "evidence/scripts/patch_guard_block_termination.js").read_text(), wait=1)
|
||||
print("[*] loading 主 JS", flush=True)
|
||||
script = load(session, JS)
|
||||
else:
|
||||
d.resume(pid)
|
||||
time.sleep(6)
|
||||
script = load(session, JS)
|
||||
|
||||
if script:
|
||||
script.on('message', on_message)
|
||||
print(f"[*] running. OUT={OUT}", flush=True)
|
||||
try:
|
||||
while True:
|
||||
time.sleep(4)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
print(f"[*] done -> {OUT}", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,124 @@
|
||||
#!/usr/bin/env python3
|
||||
"""attach 模式抓模拟器自生成 32hex hdid (对比真机 ed0db8...).
|
||||
|
||||
核心: hook libudbauthunify.so:
|
||||
- BusinessCfg::setSafeDeviceId(0x26A2E0): a1+1008=sd, a1+1088=hdid (两者都写)
|
||||
- BusinessCfg::getHdid(0x26A484): this+1088 是 std::string 对象
|
||||
- createWupDeviceInfo(0x2746A0): 返回结构 +152 = hdid std::string
|
||||
App 正常启动后 attach, 不做 spawn (spawn 挂起会 EGL 闪退)。
|
||||
"""
|
||||
import sys, time, json
|
||||
import frida
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
// short string: len = first>>1
|
||||
var len = first >> 1;
|
||||
return p.add(1).readUtf8String(len > 0 && len < 128 ? len : 0) || '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
if (len > 0 && len < 512) return data.readUtf8String(len) || '';
|
||||
return null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function log(t, m){ send({t:t, m:m}); }
|
||||
|
||||
function tryInstall(){
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if (!md){ return false; }
|
||||
log('mod', md.base.toString() + ' size=' + md.size);
|
||||
|
||||
// setSafeDeviceId: a2=sd, a3=hdid (std::string*)
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter: function(a){
|
||||
this.sd = readStdString(a[1]);
|
||||
this.hd = readStdString(a[2]);
|
||||
},
|
||||
onLeave: function(){
|
||||
log('setSafeDeviceId', JSON.stringify({sd: (this.sd||'').slice(0,48), hd: (this.hd||'').slice(0,48)}));
|
||||
}
|
||||
});
|
||||
|
||||
// getHdid: this+1088 = std::string
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter: function(a){ this.thiz = a[0]; },
|
||||
onLeave: function(){
|
||||
try{
|
||||
var s = readStdString(this.thiz.add(1088));
|
||||
log('getHdid', s ? ''+s : 'EMPTY');
|
||||
}catch(e){ log('getHdid', 'ERR ' + e); }
|
||||
}
|
||||
});
|
||||
|
||||
// createWupDeviceInfo 输出 +152 hdid
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onLeave: function(ret){
|
||||
try{
|
||||
var s = readStdString(ret.add(152));
|
||||
log('wupDeviceInfo.hdid', s ? ''+s : 'EMPTY');
|
||||
}catch(e){}
|
||||
}
|
||||
});
|
||||
|
||||
log('hooked', 'all');
|
||||
return true;
|
||||
}
|
||||
|
||||
var installed = false;
|
||||
function poll(){
|
||||
if (!installed){ installed = tryInstall(); }
|
||||
if (!installed){ setTimeout(poll, 300); }
|
||||
}
|
||||
poll();
|
||||
"""
|
||||
|
||||
def main():
|
||||
dev = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
# 找 App 进程 attach
|
||||
pid = None
|
||||
for p in dev.enumerate_processes():
|
||||
if p.name and PACKAGE in p.name:
|
||||
pid = p.pid
|
||||
break
|
||||
if not pid:
|
||||
print("App 未运行, 先启动:", PACKAGE)
|
||||
import subprocess
|
||||
subprocess.run(["adb", "-s", "127.0.0.1:5555", "shell",
|
||||
"monkey -p %s -c android.intent.category.LAUNCHER 1" % PACKAGE],
|
||||
capture_output=True)
|
||||
time.sleep(12) # 等 lib 加载
|
||||
for p in dev.enumerate_processes():
|
||||
if p.name and PACKAGE in p.name:
|
||||
pid = p.pid
|
||||
break
|
||||
if not pid:
|
||||
print("仍找不到进程"); return
|
||||
print("attach pid =", pid, flush=True)
|
||||
session = dev.attach(pid)
|
||||
|
||||
def on_message(msg, data):
|
||||
if msg.get("type") == "send":
|
||||
pl = msg["payload"]
|
||||
print("[%s] %s" % (pl["t"], pl["m"]), flush=True)
|
||||
elif msg.get("type") == "error":
|
||||
print("JSErr:", str(msg)[:200], flush=True)
|
||||
|
||||
script = session.create_script(JS)
|
||||
script.on("message", on_message)
|
||||
script.load()
|
||||
print("等待 hook 事件 (60s)...", flush=True)
|
||||
time.sleep(60)
|
||||
print("done", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
"""守护式抓取模拟器 32hex hdid: 持续 attach kiwi 主进程, hook getHdid/setSafeDeviceId.
|
||||
|
||||
App 闪退/重启也不怕 —— 循环枚举进程, 遇新主进程立即 hook。
|
||||
找到 hdid(≠ed0db8 或任意32hex)后写入 /tmp/emu_hdid_found.txt 并退出。
|
||||
"""
|
||||
import time, json, sys
|
||||
import frida
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
FOUND = "/tmp/emu_hdid_found.txt"
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function emit(t,m){ send({t:t,m:m}); }
|
||||
function hex32(s){ return /^[0-9a-fA-F]{32}$/.test(s||''); }
|
||||
|
||||
var hooked=false;
|
||||
function tryHook(){
|
||||
if(hooked) return true;
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if(!md) return false;
|
||||
emit('mod','base='+md.base);
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){ this.sd=readStdString(a[1]); this.hd=readStdString(a[2]); },
|
||||
onLeave:function(){
|
||||
var hd=(this.hd||''); var sd=(this.sd||'');
|
||||
emit('SETSD', 'hdid='+hd+' sd='+sd.slice(0,32));
|
||||
if(hex32(hd)) emit('FOUND_HDID', hd);
|
||||
}
|
||||
});
|
||||
}catch(e){ emit('warn','setSd hook fail: '+e); }
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){ this.thiz=a[0]; },
|
||||
onLeave:function(){
|
||||
try{
|
||||
var s=readStdString(this.thiz.add(1088));
|
||||
if(s) emit('GETHDID', ''+s);
|
||||
if(hex32(s)) emit('FOUND_HDID', ''+s);
|
||||
}catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){ emit('warn','getHdid hook fail: '+e); }
|
||||
emit('ready','hooked');
|
||||
hooked=true;
|
||||
return true;
|
||||
}
|
||||
var tries=0;
|
||||
function poll(){
|
||||
tries++;
|
||||
tryHook();
|
||||
if(!hooked && tries<200){ setTimeout(poll, 250); }
|
||||
}
|
||||
poll();
|
||||
"""
|
||||
|
||||
def main():
|
||||
dev = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
seen = set()
|
||||
found_hdid = None
|
||||
start = time.time()
|
||||
while time.time() - start < 600:
|
||||
procs = []
|
||||
try:
|
||||
procs = dev.enumerate_processes()
|
||||
except Exception:
|
||||
time.sleep(2); continue
|
||||
for p in procs:
|
||||
if not p.name or 'kiwi' not in p.name:
|
||||
continue
|
||||
if ':cloudpatch' in p.name or ':logcat' in p.name:
|
||||
continue
|
||||
if p.pid in seen:
|
||||
continue
|
||||
seen.add(p.pid)
|
||||
print(f"[{time.strftime('%H:%M:%S')}] 新主进程 pid={p.pid} {p.name},attach中...", flush=True)
|
||||
try:
|
||||
session = dev.attach(p.pid)
|
||||
except Exception as e:
|
||||
print(f" attach失败: {e}", flush=True)
|
||||
continue
|
||||
def on_msg(msg, data, pid=p.pid):
|
||||
global found_hdid
|
||||
if msg.get('type') == 'send':
|
||||
pl = msg['payload']
|
||||
t, m = pl['t'], pl['m']
|
||||
if t == 'FOUND_HDID':
|
||||
print(f"\n★★★★★★ 模拟器 hdid = {m} ★★★★★★", flush=True)
|
||||
with open(FOUND, 'w') as f:
|
||||
f.write(m)
|
||||
return
|
||||
print(f"[pid {pid}][{t}] {m}", flush=True)
|
||||
elif msg.get('type') == 'error':
|
||||
print(f"[pid {pid}] JSErr: {str(msg)[:150]}", flush=True)
|
||||
try:
|
||||
sc = session.create_script(JS)
|
||||
sc.on('message', on_msg)
|
||||
sc.load()
|
||||
print(f" hook 已装 (pid {pid})", flush=True)
|
||||
except Exception as e:
|
||||
print(f" script失败: {e}", flush=True)
|
||||
time.sleep(1.5)
|
||||
print("10分钟超时结束", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 32hex hdid 抓取 v3: poll 等待模块 + hook createWupDeviceInfo(ret+152=hdid).
|
||||
|
||||
createWupDeviceInfo(0x2746A0): 每次 wup 打包必调用 (udb 上报/登录帧都走它),
|
||||
返回 DeviceInfo 结构 +152 = hdid std::string (文档十九节真机验证过偏移)。
|
||||
同时 hook setSafeDeviceId(0x26A2E0) / getHdid(0x26A484) 双保险。
|
||||
"""
|
||||
import frida, time, re, subprocess, json
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/tmp/emu_hdid_v3.json")
|
||||
|
||||
HDID_JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function emit(tag, val){ send({type:'hdid', tag:tag, val:''+(val||''), ts:Date.now()}); }
|
||||
|
||||
function install(){
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if (!md) return false;
|
||||
emit('mod-base', ''+md.base);
|
||||
|
||||
// 1) createWupDeviceInfo: 返回结构 +152 = hdid
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onLeave:function(ret){
|
||||
try{
|
||||
var s = readStdString(ret.add(152));
|
||||
if (s) emit('WUPDEV_HDID', ''+s);
|
||||
}catch(e){ emit('WUPDEV_ERR', ''+e); }
|
||||
}
|
||||
});
|
||||
emit('createWupDev-hooked','');
|
||||
}catch(e){ emit('createWupDev-err', ''+e); }
|
||||
|
||||
// 2) setSafeDeviceId: a2=sd, a3=hdid
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){
|
||||
this.sd = readStdString(a[1]);
|
||||
this.hd = readStdString(a[2]);
|
||||
},
|
||||
onLeave:function(){
|
||||
emit('SETSD', (this.hd||'') + ' | sd=' + (this.sd||'').slice(0,24));
|
||||
}
|
||||
});
|
||||
emit('setSd-hooked','');
|
||||
}catch(e){ emit('setSd-err', ''+e); }
|
||||
|
||||
// 3) getHdid: this+1088 (x8)
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){
|
||||
try{ this.thiz = this.context.x8; }catch(e){ this.thiz = null; }
|
||||
},
|
||||
onLeave:function(){
|
||||
if (!this.thiz) return;
|
||||
try{
|
||||
var s = readStdString(this.thiz.add(1088));
|
||||
emit('GETHDID', ''+s);
|
||||
}catch(e){}
|
||||
}
|
||||
});
|
||||
emit('getHdid-hooked','');
|
||||
}catch(e){ emit('getHdid-err', ''+e); }
|
||||
|
||||
emit('ready','');
|
||||
return true;
|
||||
}
|
||||
|
||||
var installed = false;
|
||||
function poll(){
|
||||
if (!installed) installed = install();
|
||||
if (!installed) setTimeout(poll, 200);
|
||||
}
|
||||
poll();
|
||||
"""
|
||||
|
||||
MAIN_JS = r"""
|
||||
'use strict';
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,800));
|
||||
if(h.indexOf('hypasswordLogin')>=0||h.indexOf('huyaudbwebui')>=0){
|
||||
send({type:'wup', len:len, hex:hexb(a[1],len), t:Date.now()});
|
||||
}
|
||||
}});
|
||||
});
|
||||
}catch(e){ send({type:'err', e:String(e)}); }
|
||||
"""
|
||||
|
||||
def load(session, js, wait=0.2):
|
||||
try:
|
||||
s = session.create_script(js); s.load(); return s
|
||||
except Exception as e:
|
||||
print("[load-err]", str(e)[:150], flush=True)
|
||||
return None
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],
|
||||
capture_output=True)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
load(session, (RE/"evidence/scripts/bypass_msaoaid_maps_art_callsite.js").read_text())
|
||||
load(session, (RE/"evidence/scripts/mask_frida_maps_only.js").read_text())
|
||||
hdid_sc = load(session, HDID_JS)
|
||||
print("[*] HDID v3 loaded (poll-wait)", flush=True)
|
||||
d.resume(pid)
|
||||
print("[*] resumed", flush=True)
|
||||
load(session, (RE/"evidence/scripts/patch_guard_block_termination.js").read_text(), wait=0.1)
|
||||
|
||||
events = []
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'hdid':
|
||||
print(f"[HDID {p.get('tag')}] {p.get('val')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'wup':
|
||||
b = bytes.fromhex(p.get('hex',''))
|
||||
if b'hidden' in b[:50]:
|
||||
print(f"[WUP] len={p.get('len')}", flush=True)
|
||||
else:
|
||||
h = re.search(rb'hdid.{0,120}', b)
|
||||
print(f"[WUP] len={p.get('len')} ctx={h.group(0)[:120] if h else b[:60]}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'err':
|
||||
print("[err]", p.get('e'), flush=True)
|
||||
|
||||
hdid_sc.on('message', on_message)
|
||||
main_sc = load(session, MAIN_JS)
|
||||
if main_sc:
|
||||
main_sc.on('message', on_message)
|
||||
print("[*] running 90s ...", flush=True)
|
||||
t0 = time.time()
|
||||
try:
|
||||
while time.time() - t0 < 90:
|
||||
time.sleep(4)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
print(f"[*] done, {len(events)} events", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 32hex hdid 抓取 v7 (严格按约定 doc)。
|
||||
|
||||
时序(严格复刻成功案例 hook_emu_spawn_bypass.py):
|
||||
1. spawn(挂起)
|
||||
2. load bypass_msaoaid_maps_art_callsite.js (挂起)
|
||||
3. load mask_frida_maps_only.js (挂起)
|
||||
4. resume
|
||||
5. sleep 11
|
||||
6. load patch_guard_block_termination.js
|
||||
7. load 主 hook JS: 轮询等模块 -> hook setSafeDeviceId/getHdid/createWupDeviceInfo + SSL_write
|
||||
命中即写 /tmp/emu_hdid_v7.json, 实时打印。
|
||||
"""
|
||||
import frida, time, re, subprocess, json
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/tmp/emu_hdid_v7.json")
|
||||
|
||||
MAIN_JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
function emit(tag,val){ send({type:tag, tag:tag, val:''+(val||''), ts:Date.now()}); }
|
||||
var hooked=false, sslDone=false;
|
||||
|
||||
function hookUdb(){
|
||||
if (hooked) return;
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if (!md) return; // 未加载, 等下一轮
|
||||
emit('mod-base', ''+md.base);
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){ this.sd=readStdString(a[1]); this.hd=readStdString(a[2]); },
|
||||
onLeave:function(){
|
||||
var hd=(this.hd||''); emit('SETSD', hd+' | sd='+(this.sd||'').slice(0,24));
|
||||
if(/^[0-9a-f]{32}$/.test(hd)) emit('FOUND_HDID_32', hd);
|
||||
}
|
||||
});
|
||||
}catch(e){ emit('setSd-err',''+e); }
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){ try{ this.thiz=this.context.x8; }catch(e){ this.thiz=null; } },
|
||||
onLeave:function(){
|
||||
if(!this.thiz) return;
|
||||
try{
|
||||
var s=readStdString(this.thiz.add(1088));
|
||||
if(s){ emit('GETHDID',''+s); if(/^[0-9a-f]{32}$/.test(s)) emit('FOUND_HDID_32',''+s); }
|
||||
}catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){ emit('getHdid-err',''+e); }
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onLeave:function(ret){
|
||||
try{
|
||||
var s=readStdString(ret.add(152));
|
||||
if(s){ emit('WUPDEV_HDID',''+s); if(/^[0-9a-f]{32}$/.test(s)) emit('FOUND_HDID_32',''+s); }
|
||||
}catch(e){ emit('wupdev-err',''+e); }
|
||||
}
|
||||
});
|
||||
}catch(e){ emit('wupdev-err2',''+e); }
|
||||
emit('ready','all hooked');
|
||||
hooked=true;
|
||||
}
|
||||
|
||||
function hookSSL(){
|
||||
if (sslDone) return;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,600));
|
||||
if(h.indexOf('hypasswordLogin')>=0||h.indexOf('huyaudbwebui')>=0){
|
||||
emit('WUP_FRAME', len+'B '+h.slice(0,80));
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'sslwrite-hooked', tag:'ssl'});
|
||||
}catch(e){}
|
||||
sslDone=true;
|
||||
}
|
||||
|
||||
setInterval(function(){ hookUdb(); }, 300);
|
||||
setInterval(function(){ hookSSL(); }, 1000);
|
||||
"""
|
||||
|
||||
def load(session, js, wait=0.2):
|
||||
try:
|
||||
s = session.create_script(js); s.load(); return s
|
||||
except Exception as e:
|
||||
print("[load-err]", str(e)[:160], flush=True)
|
||||
return None
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],
|
||||
capture_output=True)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
|
||||
# 挂起阶段: 只加载两个 bypass (复刻成功案例)
|
||||
load(session, (RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text())
|
||||
print("[*] bypass_msaoaid loaded", flush=True)
|
||||
load(session, (RE/"evidence/scripts/mask_frida_maps_only.js").read_text())
|
||||
print("[*] mask_frida loaded", flush=True)
|
||||
|
||||
d.resume(pid)
|
||||
print("[*] resumed", flush=True)
|
||||
# 立即加载 patch_guard (不 sleep 11! bash-118 成功案例 resume 后立即加载, sleep 期间 App 被杀)
|
||||
load(session, (RE/"evidence/scripts/patch_guard_block_termination.js").read_text(), wait=0.1)
|
||||
print("[*] patch_guard loaded", flush=True)
|
||||
|
||||
events = []
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t in ('SETSD','GETHDID','WUPDEV_HDID','FOUND_HDID_32','mod-base','ready',
|
||||
'setSd-err','getHdid-err','wupdev-err','wupdev-err2'):
|
||||
print(f"[{t}] {p.get('val')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'WUP_FRAME':
|
||||
print(f"[WUP_FRAME] {p.get('val')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'sslwrite-hooked':
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
|
||||
main_sc = load(session, MAIN_JS)
|
||||
if main_sc:
|
||||
main_sc.on('message', on_message)
|
||||
|
||||
print("[*] running 150s", flush=True)
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 150:
|
||||
time.sleep(3)
|
||||
if any(e.get('tag') in ('FOUND_HDID_32','SETSD','GETHDID','WUPDEV_HDID') for e in events):
|
||||
print("[*] 命中 hdid, 提前停止", flush=True)
|
||||
break
|
||||
print(f"[*] done, {len(events)} events", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,194 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 hdid v8: spawn + 三件套 + 内存扫描 32hex (App 启动即扫, 无需触发登录).
|
||||
|
||||
时序(成功验证): spawn → bypass×2(挂起) → resume → 立即 patch_guard → 主JS:
|
||||
1. 轮询 hook setSafeDeviceId/getHdid/createWupDeviceInfo (保险)
|
||||
2. 轮询: mod-base 出现后 3s, 扫描进程内存找 [0-9a-f]{32} ASCII 字符串并去重
|
||||
3. SSL_write 抓 hypasswordLogin (万一触发登录)
|
||||
"""
|
||||
import frida, time, re, subprocess, json
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/tmp/emu_hdid_v8.json")
|
||||
|
||||
MAIN_JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
function emit(tag,val){ send({type:tag, tag:tag, val:''+(val||''), ts:Date.now()}); }
|
||||
var hooked=false, scanned=false, sslDone=false;
|
||||
|
||||
function hookUdb(){
|
||||
if (hooked) return;
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if (!md) return;
|
||||
emit('mod-base', ''+md.base);
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){ this.sd=readStdString(a[1]); this.hd=readStdString(a[2]); },
|
||||
onLeave:function(){
|
||||
var hd=(this.hd||''); emit('SETSD', hd+' | sd='+(this.sd||'').slice(0,24));
|
||||
if(/^[0-9a-f]{32}$/.test(hd)) emit('FOUND_HDID_32', hd);
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){ try{ this.thiz=this.context.x8; }catch(e){ this.thiz=null; } },
|
||||
onLeave:function(){
|
||||
if(!this.thiz) return;
|
||||
try{ var s=readStdString(this.thiz.add(1088)); if(s){ emit('GETHDID',''+s); if(/^[0-9a-f]{32}$/.test(s)) emit('FOUND_HDID_32',''+s); } }catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onLeave:function(ret){
|
||||
try{ var s=readStdString(ret.add(152)); if(s){ emit('WUPDEV_HDID',''+s); if(/^[0-9a-f]{32}$/.test(s)) emit('FOUND_HDID_32',''+s); } }catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
emit('ready','all hooked');
|
||||
hooked = true;
|
||||
}
|
||||
|
||||
function scanMem(){
|
||||
// 扫描所有可读内存, 找 32hex ASCII 字符串 (含大小写hex)
|
||||
var found = {};
|
||||
var re32 = /[0-9a-f]{32}/i;
|
||||
var ranges = Process.enumerateRanges({protection:'r--', coalesce:true});
|
||||
ranges.forEach(function(r){
|
||||
try{
|
||||
var size = Math.min(r.size, 24*1024*1024);
|
||||
var buf = Memory.readByteArray(r.base, size);
|
||||
if (!buf) return;
|
||||
var s = String.fromCharCode.apply(null, new Uint8Array(buf));
|
||||
var m;
|
||||
var re = /[0-9a-f]{32,40}/gi;
|
||||
while ((m = re.exec(s)) !== null){
|
||||
var v = m[0].toLowerCase();
|
||||
if (!/^[0-9a-f]{32}$/.test(v)) continue;
|
||||
if (found[v]) { found[v]++; continue; }
|
||||
found[v] = 1;
|
||||
}
|
||||
}catch(e){}
|
||||
});
|
||||
var keys = Object.keys(found);
|
||||
emit('scan-result', 'found32=' + keys.length + ' | ' + keys.slice(0,40).join(' '));
|
||||
keys.forEach(function(k){ if(found[k]>=1) emit('H32CAND', k); });
|
||||
scanned = true;
|
||||
}
|
||||
|
||||
function hookSSL(){
|
||||
if (sslDone) return;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,600));
|
||||
if(h.indexOf('hypasswordLogin')>=0){
|
||||
emit('WUP_LOGIN', len+'B '+hexb(a[1],len));
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'sslwrite-hooked', tag:'ssl'});
|
||||
}catch(e){}
|
||||
sslDone=true;
|
||||
}
|
||||
|
||||
setInterval(hookUdb, 100);
|
||||
setInterval(hookSSL, 1000);
|
||||
// 模块出现后 3s 启动内存扫描
|
||||
var scanLaunched = false;
|
||||
setInterval(function(){
|
||||
if (!scanLaunched && hooked && !scanned){
|
||||
scanLaunched = true;
|
||||
setTimeout(scanMem, 3000);
|
||||
}
|
||||
}, 500);
|
||||
"""
|
||||
|
||||
def load(session, js, wait=0.2):
|
||||
try:
|
||||
s = session.create_script(js); s.load(); return s
|
||||
except Exception as e:
|
||||
print("[load-err]", str(e)[:160], flush=True)
|
||||
return None
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],
|
||||
capture_output=True)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
load(session, (RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text())
|
||||
print("[*] bypass_msaoaid loaded", flush=True)
|
||||
load(session, (RE/"evidence/scripts/mask_frida_maps_only.js").read_text())
|
||||
print("[*] mask_frida loaded", flush=True)
|
||||
d.resume(pid)
|
||||
print("[*] resumed", flush=True)
|
||||
load(session, (RE/"evidence/scripts/patch_guard_block_termination.js").read_text(), wait=0.1)
|
||||
print("[*] patch_guard loaded", flush=True)
|
||||
|
||||
events = []
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t in ('mod-base','ready','setSd-err','getHdid-err','wupdev-err'):
|
||||
print(f"[{t}] {p.get('val')}", flush=True)
|
||||
elif t == 'SETSD' or t == 'GETHDID' or t == 'WUPDEV_HDID':
|
||||
print(f"[{t}] {p.get('val')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'FOUND_HDID_32':
|
||||
print(f"\n★★★ FOUND 32HEX HDID = {p.get('val')} ★★★", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'scan-result':
|
||||
print(f"[SCAN] {p.get('val')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'H32CAND':
|
||||
print(f"[H32CAND] {p.get('val')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'WUP_LOGIN':
|
||||
print(f"[WUP_LOGIN] {p.get('val')[:80]}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
elif t == 'sslwrite-hooked':
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
|
||||
main_sc = load(session, MAIN_JS)
|
||||
if main_sc:
|
||||
main_sc.on('message', on_message)
|
||||
print("[*] running 160s", flush=True)
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 160:
|
||||
time.sleep(3)
|
||||
if any(e.get('tag')=='FOUND_HDID_32' for e in events):
|
||||
print("[*] 命中, 提前停止", flush=True)
|
||||
break
|
||||
print(f"[*] done, {len(events)} events", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,203 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 hdid v9: spawn + 三件套 + 稳健内存扫描 32hex + hook 三函数 + SSL_write 抓登录帧.
|
||||
|
||||
v8 失败点: String.fromCharCode.apply 大数组崩 → 改分块扫描(chunk 256KB), 累计计数。
|
||||
"""
|
||||
import frida, time, re, subprocess, json
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/tmp/emu_hdid_v9.json")
|
||||
|
||||
MAIN_JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
function emit(tag,val){ send({type:tag, tag:tag, val:''+(val||''), ts:Date.now()}); }
|
||||
var hooked=false, scanned=false, sslDone=false;
|
||||
|
||||
function hookUdb(){
|
||||
if (hooked) return;
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if (!md) return;
|
||||
emit('mod-base', ''+md.base);
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){ this.sd=readStdString(a[1]); this.hd=readStdString(a[2]); },
|
||||
onLeave:function(){
|
||||
var hd=(this.hd||''); emit('SETSD', hd+' | sd='+(this.sd||'').slice(0,24));
|
||||
if(/^[0-9a-f]{32}$/.test(hd)) emit('FOUND_HDID_32', hd);
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){ try{ this.thiz=this.context.x8; }catch(e){ this.thiz=null; } },
|
||||
onLeave:function(){
|
||||
if(!this.thiz) return;
|
||||
try{ var s=readStdString(this.thiz.add(1088)); if(s){ emit('GETHDID',''+s); if(/^[0-9a-f]{32}$/.test(s)) emit('FOUND_HDID_32',''+s); } }catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onLeave:function(ret){
|
||||
try{ var s=readStdString(ret.add(152)); if(s){ emit('WUPDEV_HDID',''+s); if(/^[0-9a-f]{32}$/.test(s)) emit('FOUND_HDID_32',''+s); } }catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
emit('ready','all hooked');
|
||||
hooked = true;
|
||||
}
|
||||
|
||||
// 稳健内存扫描: 分块读取, 用正则找 32hex ASCII
|
||||
function scanMem(){
|
||||
var found = {};
|
||||
try{
|
||||
var ranges = Process.enumerateRanges({protection:'r--', coalesce:true});
|
||||
var total = ranges.length, scannedB = 0;
|
||||
ranges.forEach(function(r, ri){
|
||||
try{
|
||||
var size = r.size;
|
||||
if (size <= 0) return;
|
||||
var step = 256*1024;
|
||||
var off = 0;
|
||||
while (off < size){
|
||||
var n = Math.min(step, size - off);
|
||||
var buf = Memory.readByteArray(r.base.add(off), n);
|
||||
if (buf){
|
||||
var sbuf = new Uint8Array(buf);
|
||||
var s = '';
|
||||
for (var i=0;i<sbuf.length;i++) s += String.fromCharCode(sbuf[i]);
|
||||
var re = /[0-9a-f]{32,40}/gi;
|
||||
var m;
|
||||
while ((m = re.exec(s)) !== null){
|
||||
var v = m[0].toLowerCase();
|
||||
if (!/^[0-9a-f]{32}$/.test(v)) continue;
|
||||
found[v] = (found[v]||0) + 1;
|
||||
}
|
||||
scannedB += n;
|
||||
}
|
||||
off += step;
|
||||
}
|
||||
}catch(e){}
|
||||
});
|
||||
}catch(e){ emit('scan-err',''+e); }
|
||||
var keys = Object.keys(found);
|
||||
emit('scan-result', 'ranges='+total+' scannedB='+scannedB+' found32+='+keys.length);
|
||||
keys.sort().forEach(function(k, i){
|
||||
if (i < 50) emit('H32CAND', k+' x'+found[k]);
|
||||
// 过滤: 排除常见噪音
|
||||
if (/^(00000000|ffffffff|0123456789)/.test(k)) return;
|
||||
emit('H32CAND_NZ', k+' x'+found[k]);
|
||||
});
|
||||
scanned = true;
|
||||
}
|
||||
|
||||
function hookSSL(){
|
||||
if (sslDone) return;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,600));
|
||||
if(h.indexOf('hypasswordLogin')>=0){
|
||||
emit('WUP_LOGIN_FULL', len+'B '+hexb(a[1],len));
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'sslwrite-hooked', tag:'ssl'});
|
||||
}catch(e){}
|
||||
sslDone=true;
|
||||
}
|
||||
|
||||
setInterval(hookUdb, 100);
|
||||
setInterval(hookSSL, 1000);
|
||||
var scanLaunched = false;
|
||||
setInterval(function(){
|
||||
if (!scanLaunched && hooked && !scanned){
|
||||
scanLaunched = true;
|
||||
setTimeout(scanMem, 2500);
|
||||
}
|
||||
}, 500);
|
||||
"""
|
||||
|
||||
def load(session, js, wait=0.2):
|
||||
try:
|
||||
s = session.create_script(js); s.load(); return s
|
||||
except Exception as e:
|
||||
print("[load-err]", str(e)[:160], flush=True)
|
||||
return None
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],
|
||||
capture_output=True)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
load(session, (RE/"evidence/scripts/bypass_msaoaid_maps_skip_cleanup.js").read_text())
|
||||
load(session, (RE/"evidence/scripts/mask_frida_maps_only.js").read_text())
|
||||
print("[*] bypass x2 loaded", flush=True)
|
||||
d.resume(pid)
|
||||
print("[*] resumed", flush=True)
|
||||
load(session, (RE/"evidence/scripts/patch_guard_block_termination.js").read_text(), wait=0.1)
|
||||
print("[*] patch_guard loaded", flush=True)
|
||||
|
||||
events = []
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t in ('mod-base','ready','scan-err'):
|
||||
print(f"[{t}] {p.get('val')}", flush=True)
|
||||
elif t in ('SETSD','GETHDID','WUPDEV_HDID'):
|
||||
print(f"[{t}] {p.get('val')}", flush=True)
|
||||
elif t == 'FOUND_HDID_32':
|
||||
print(f"\n★★★ FOUND 32HEX HDID = {p.get('val')} ★★★", flush=True)
|
||||
elif t == 'scan-result':
|
||||
print(f"[SCAN] {p.get('val')}", flush=True)
|
||||
elif t in ('H32CAND','H32CAND_NZ'):
|
||||
print(f"[{t}] {p.get('val')}", flush=True)
|
||||
elif t == 'WUP_LOGIN_FULL':
|
||||
b = bytes.fromhex(p.get('val','').split('B ')[-1]) if 'B ' in p.get('val','') else b''
|
||||
h = re.search(rb'hdid.{0,100}', b)
|
||||
print(f"[WUP_LOGIN] len={p.get('val','').split('B')[0]} ctx={(h.group(0)[:110] if h else b[:60])}", flush=True)
|
||||
elif t == 'sslwrite-hooked':
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events, indent=1))
|
||||
|
||||
main_sc = load(session, MAIN_JS)
|
||||
if main_sc:
|
||||
main_sc.on('message', on_message)
|
||||
print("[*] running 170s", flush=True)
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 170:
|
||||
time.sleep(3)
|
||||
if any(e.get('tag')=='FOUND_HDID_32' for e in events):
|
||||
print("[*] 命中, 提前停止", flush=True)
|
||||
break
|
||||
print(f"[*] done, {len(events)} events", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
"""抓模拟器自生成 32hex hdid — attach 主进程版 (PID=10200).
|
||||
|
||||
hook libudbauthunify.so:
|
||||
- BusinessCfg::setSafeDeviceId(0x26A2E0): a2=sd, a3=hdid
|
||||
- BusinessCfg::getHdid(0x26A484): this+1088 = std::string
|
||||
- createWupDeviceInfo(0x2746A0): 返回 +152 = hdid
|
||||
"""
|
||||
import time, frida
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PID = 10200
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function log(t,m){ send({t:t,m:m}); }
|
||||
|
||||
function install(){
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if(!md){ log('err','no module'); return; }
|
||||
log('mod','base='+md.base+' size='+md.size);
|
||||
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){ this.sd=readStdString(a[1]); this.hd=readStdString(a[2]); },
|
||||
onLeave:function(){ log('setSafeDeviceId', JSON.stringify({sd:(this.sd||'').slice(0,48), hd:(this.hd||'').slice(0,48)})); }
|
||||
});
|
||||
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){ this.thiz=a[0]; },
|
||||
onLeave:function(){
|
||||
try{
|
||||
var s=readStdString(this.thiz.add(1088));
|
||||
log('getHdid', (s!==null&&s!==undefined?'':s)||'EMPTY');
|
||||
}catch(e){ log('getHdid','ERR '+e); }
|
||||
}
|
||||
});
|
||||
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onLeave:function(ret){
|
||||
try{
|
||||
var s=readStdString(ret.add(152));
|
||||
if (s) log('wupDevInfo.hdid', ''+s);
|
||||
}catch(e){}
|
||||
}
|
||||
});
|
||||
|
||||
// 也 hook libhydeviceid 数据区常见字符串? 先看 getHdid 输出
|
||||
log('hooked','all OK');
|
||||
}
|
||||
|
||||
install();
|
||||
"""
|
||||
|
||||
def main():
|
||||
dev = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = PID
|
||||
try:
|
||||
s = dev.attach(pid)
|
||||
except Exception as e:
|
||||
print("attach失败:", e); return
|
||||
print("attached", pid, flush=True)
|
||||
sc = s.create_script(JS)
|
||||
def on_msg(m,d):
|
||||
if m.get('type')=='send':
|
||||
p=m['payload']
|
||||
print("[%s] %s" % (p['t'], p['m']), flush=True)
|
||||
elif m.get('type')=='error':
|
||||
print("JSErr:", str(m)[:200], flush=True)
|
||||
sc.on('message', on_msg)
|
||||
sc.load()
|
||||
print("等待 90s ...", flush=True)
|
||||
time.sleep(90)
|
||||
print("done", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,95 @@
|
||||
#!/usr/bin/env python3
|
||||
"""attach 模式抓模拟器 32hex hdid v4: hook createWupDeviceInfo(ret+152=hdid).
|
||||
|
||||
直接 attach 正在运行的主进程(不 spawn, 无 EGL 崩溃风险)。
|
||||
createWupDeviceInfo 每次 udb 上报/wup 打包都调用 → 上报即触发, 无需登录UI。
|
||||
"""
|
||||
import frida, time, re, json, sys
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
OUT = Path_ = "/tmp/emu_hdid_v4.json"
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
function readStdString(p){
|
||||
if (p.isNull()) return null;
|
||||
try{
|
||||
var first = p.readU8();
|
||||
if ((first & 1) === 0) {
|
||||
var len = first >> 1;
|
||||
return (len>0 && len<256) ? p.add(1).readUtf8String(len) : '';
|
||||
} else {
|
||||
var data = p.readPointer();
|
||||
var len = p.add(8).readU64();
|
||||
return (len>0 && len<1024) ? data.readUtf8String(len) : null;
|
||||
}
|
||||
}catch(e){ return null; }
|
||||
}
|
||||
function emit(tag, val){ send({type:'hdid', tag:tag, val:''+(val||''), ts:Date.now()}); }
|
||||
|
||||
function install(){
|
||||
var md = Process.findModuleByName('libudbauthunify.so');
|
||||
if (!md){ emit('state','NO_MOD'); return; }
|
||||
emit('state','mod='+md.base);
|
||||
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x2746A0), {
|
||||
onEnter:function(){ emit('tick','createWupDeviceInfo #' + (++window.__n||(window.__n=1))); },
|
||||
onLeave:function(ret){
|
||||
try{
|
||||
var s = readStdString(ret.add(152));
|
||||
emit('WUPDEV_HDID', ''+s);
|
||||
}catch(e){ emit('WUPDEV_ERR', ''+e); }
|
||||
}
|
||||
});
|
||||
emit('state','createWupDev hooked');
|
||||
}catch(e){ emit('state','createWupDev ERR '+e); }
|
||||
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A2E0), {
|
||||
onEnter:function(a){ this.sd=readStdString(a[1]); this.hd=readStdString(a[2]); },
|
||||
onLeave:function(){ emit('SETSD', (this.hd||'')+' | sd='+(this.sd||'').slice(0,24)); }
|
||||
});
|
||||
}catch(e){}
|
||||
|
||||
try{
|
||||
Interceptor.attach(md.base.add(0x26A484), {
|
||||
onEnter:function(a){ try{ this.thiz=this.context.x8; }catch(e){ this.thiz=null; } },
|
||||
onLeave:function(){
|
||||
if(!this.thiz) return;
|
||||
try{ var s=readStdString(this.thiz.add(1088)); if(s) emit('GETHDID',''+s); }catch(e){}
|
||||
}
|
||||
});
|
||||
}catch(e){}
|
||||
|
||||
emit('state','all hooked, waiting events');
|
||||
}
|
||||
install();
|
||||
"""
|
||||
|
||||
def main():
|
||||
dev = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = None
|
||||
for p in dev.enumerate_processes():
|
||||
if p.name and p.name == 'com.duowan.kiwi':
|
||||
pid = p.pid; break
|
||||
if not pid:
|
||||
print("找不到主进程"); return
|
||||
print("attach pid =", pid, flush=True)
|
||||
s = dev.attach(pid)
|
||||
events = []
|
||||
def on_msg(m, d):
|
||||
if m.get('type') == 'send':
|
||||
p = m['payload']
|
||||
print(f"[{p.get('tag')}] {p.get('val')}", flush=True)
|
||||
events.append(p); open(OUT,'w').write(json.dumps(events, indent=1))
|
||||
elif m.get('type') == 'error':
|
||||
print("JSErr:", str(m)[:150], flush=True)
|
||||
sc = s.create_script(JS)
|
||||
sc.on('message', on_msg)
|
||||
sc.load()
|
||||
print("运行 100s (App 上报会自动触发 createWupDeviceInfo)...", flush=True)
|
||||
time.sleep(100)
|
||||
print("done,", len(events), "events", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 spawn+立即resume 版 dfpReport 捕获。
|
||||
|
||||
关键: spawn 后【立即】resume(App 避免 EGL 崩溃), 然后立即 attach+load 主 hook。
|
||||
dfpReport 冷启动约 1s 后自动发, attach 足够快能赶上。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, json, re
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_spawn_dfp.json")
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++; send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,t:Date.now(),hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn pid={pid}", flush=True)
|
||||
# 立即 resume (防 EGL 崩)
|
||||
d.resume(pid)
|
||||
time.sleep(0.4)
|
||||
session = d.attach(pid)
|
||||
events = []
|
||||
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'armed':
|
||||
print("[*] armed", flush=True)
|
||||
elif t == 'hooked':
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
elif t == 'err':
|
||||
print("[*] err", p.get('e'), flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[{p.get('t')}] {p.get('cls')} len={p.get('len')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
|
||||
sc = session.create_script(JS)
|
||||
sc.on('message', on_message)
|
||||
sc.load()
|
||||
print(f"[*] loaded. running (OUT={OUT})", flush=True)
|
||||
t0 = time.time()
|
||||
try:
|
||||
while time.time() - t0 < 60:
|
||||
time.sleep(4)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
print(f"[*] done, {len(events)} dfpRevent(s)", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,119 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 spawn + frida 绕过 版 dfpReport 捕获。
|
||||
|
||||
时序(模拟器需快速 resume 防 EGL 崩, 但反调试需在 resume 前 hook):
|
||||
spawn(挂起) → 快速 load bypass_msaoaid + mask_frida (~1s内)
|
||||
→ resume → patch_guard → 主 hook (抓 dfpReport+响应 actionV)
|
||||
|
||||
bypass 脚本用动态定位(Process.findModuleByName), 偏移为 lib 内偏移,
|
||||
同一 apk(13.4.22)下与真机一致, 直接复用。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, json, re, subprocess
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_spawn_bypass_dfp.json")
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++; send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,t:Date.now(),hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var nn=ret.toInt32();
|
||||
if(nn<=0||nn>3200)return;
|
||||
send({type:'resp',len:nn,hex:hexb(this.buf,nn),t:Date.now()});
|
||||
}});
|
||||
});
|
||||
send({type:'readhooked'});
|
||||
}catch(e){send({type:'readerr',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def load(session, js, wait=0.2):
|
||||
try:
|
||||
s = session.create_script(js); s.load(); return s
|
||||
except Exception as e:
|
||||
print("[load-err]", str(e)[:150], flush=True); return None
|
||||
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb", "-s", "127.0.0.1:5555", "shell", "am", "force-stop", PACKAGE], capture_output=True)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
|
||||
# 1) 挂起时快速加载两个 bypass
|
||||
print("[*] load bypass_msaoaid (suspended)", flush=True)
|
||||
load(session, (RE / "evidence/scripts/bypass_msaoaid_maps_art_callsite.js").read_text())
|
||||
print("[*] load mask_frida (suspended)", flush=True)
|
||||
load(session, (RE / "evidence/scripts/mask_frida_maps_only.js").read_text())
|
||||
|
||||
# 2) resume (防 EGL 崩), 快速
|
||||
d.resume(pid)
|
||||
print("[*] resumed", flush=True)
|
||||
|
||||
# 3) patch_guard + 主 hook
|
||||
load(session, (RE / "evidence/scripts/patch_guard_block_termination.js").read_text(), wait=0.1)
|
||||
print("[*] load 主 hook JS", flush=True)
|
||||
events = []
|
||||
|
||||
def on_message(m, data):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:200], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'armed': print("[*] armed", flush=True)
|
||||
elif t == 'hooked': print("[*] SSL_write hooked", flush=True)
|
||||
elif t == 'readhooked': print("[*] SSL_read hooked", flush=True)
|
||||
elif t in ('err','readerr'): print("[*]", t, p.get('e'), flush=True)
|
||||
elif t == 'event': print("[bypass]", p.get('event'), flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[{p.get('t')}] {p.get('cls')} len={p.get('len')}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
elif 'resp' in t or t == 'resp':
|
||||
import re
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p.get('hex') or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
print(f"[{p.get('t')}] RESP len={p.get('len')}{mark}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
|
||||
sc = load(session, JS)
|
||||
if sc:
|
||||
sc.on('message', on_message)
|
||||
print(f"[*] running (OUT={OUT})", flush=True)
|
||||
t0 = time.time()
|
||||
try:
|
||||
while time.time() - t0 < 70:
|
||||
time.sleep(4)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
print(f"[*] done, {len(events)} events", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 稳定版 dfpReport 抓取: spawn→挂起快速加载2个bypass→立即resume→patch_guard+主hook。
|
||||
内置自动重试(EGL 偶发崩 + 反调试偶发), 一旦抓到 dfpReport+actionV 或达上限即停。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, json, subprocess
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_stable_dfp.json")
|
||||
|
||||
MAIN_JS = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
var n=0;
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
n++; send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',n:n,len:len,t:Date.now(),hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
try{
|
||||
var r2=new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){this.buf=a[1];},
|
||||
onLeave:function(ret){
|
||||
var nn=ret.toInt32();
|
||||
if(nn<=0||nn>4000)return;
|
||||
send({type:'resp',len:nn,hex:hexb(this.buf,nn),t:Date.now()});
|
||||
}});
|
||||
});
|
||||
send({type:'readhooked'});
|
||||
}catch(e){send({type:'readerr',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def run_once(d, events, attempt):
|
||||
"""一次尝试, 成功(抓到 actionV 或 dfp) 返回 True."""
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True)
|
||||
time.sleep(1.2)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[att{attempt}] spawn pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
|
||||
# 挂起时快速加载两个 bypass (极快, 不 sleep)
|
||||
def fast_load(path):
|
||||
try:
|
||||
s = session.create_script(path.read_text()); s.load(); return True
|
||||
except Exception as e:
|
||||
print(f" [bypass-load-err] {e}", flush=True); return False
|
||||
fast_load(RE / "evidence/scripts/bypass_msaoaid_maps_art_callsite.js")
|
||||
fast_load(RE / "evidence/scripts/mask_frida_maps_only.js")
|
||||
|
||||
# 立即 resume
|
||||
d.resume(pid)
|
||||
print(f"[att{attempt}] resumed", flush=True)
|
||||
|
||||
got_dfp = False
|
||||
def on_main(m, dta):
|
||||
nonlocal got_dfp
|
||||
if m.get('type') == 'error':
|
||||
return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'hooked':
|
||||
print(f"[att{attempt}] SSL_write hooked", flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[att{attempt}] {p['cls']} len={p['len']}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
if p['cls'] == 'dfpReport':
|
||||
got_dfp = True
|
||||
elif t == 'resp':
|
||||
import re
|
||||
av = re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(p.get('hex') or ''))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
print(f"[att{attempt}] RESP len={p['len']}{mark}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
|
||||
# patch_guard + 主 hook (resume 后)
|
||||
try:
|
||||
sg = session.create_script((RE/"evidence/scripts/patch_guard_block_termination.js").read_text()); sg.load()
|
||||
except Exception as e:
|
||||
print(f" [guard-err] {e}", flush=True)
|
||||
sc = session.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
|
||||
# 观察 ~35s, 抓到 dfp 即提前停
|
||||
for _ in range(8):
|
||||
time.sleep(4)
|
||||
if got_dfp:
|
||||
# 再等 actionV 响应
|
||||
time.sleep(4)
|
||||
print(f"[att{attempt}] dfp captured, stopping", flush=True)
|
||||
break
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
return got_dfp
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
events = []
|
||||
for attempt in range(1, 6): # 最多 5 次
|
||||
try:
|
||||
if run_once(d, events, attempt):
|
||||
print(f"[*] SUCCESS on attempt {attempt}", flush=True)
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"[att{attempt}] ERROR {repr(e)}", flush=True)
|
||||
time.sleep(2)
|
||||
print(f"[*] done, {len(events)} events, saved {OUT}", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,78 @@
|
||||
"""用 frida attach 到运行中 App, hook __system_property_get,
|
||||
记录虎牙派生读取的系统属性, 并测试替换某些属性后 hdid 是否变化.
|
||||
"""
|
||||
import frida, time, subprocess, sys, json, re, ssl, socket
|
||||
|
||||
PACKAGE="com.duowan.kiwi"
|
||||
REMOTE="127.0.0.1:31878"
|
||||
JS = r"""
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function rcsv(p){try{return p.readCString(256)||'';}catch(e){return '';}}
|
||||
var interest = ['ro.serialno','ro.product.model','ro.product.device',
|
||||
'ro.boot.serialno','ro.hardware','ro.build.fingerprint','ro.build.id',
|
||||
'ro.product.board','ro.product.manufacturer','ro.ril.miui.imei0',
|
||||
'persist.sys.imei','gsm.imei','ro.boot.image','ro.boot.product',
|
||||
'ro.kernel.qemu','init.svc.adbd','ro.product.cpu.abi','ro.build.version.sdk',
|
||||
'ro.build.version.release','ro.product.brand','ro.product.name'];
|
||||
function hook(){
|
||||
var m = Process.findModuleByName('libc.so');
|
||||
// dl_ prefixed variants first
|
||||
var syms = ['__system_property_get','free'];
|
||||
var target = Module.findExportByName('libc.so','__system_property_get');
|
||||
if(!target){send({type:'info',k:'no-propget'});return;}
|
||||
send({type:'info',k:'found',a:target.toString()});
|
||||
Interceptor.attach(target,{
|
||||
onEnter:function(a){
|
||||
this.name = rcsv(a[0]);
|
||||
},
|
||||
onLeave:function(ret){
|
||||
var ov = rcsv(this.ctx.x1); // __system_property_get 第二参数 value buffer (x1)
|
||||
var sig = this.name+'='+ov;
|
||||
// 只记录感兴趣的; 若想起记则全记
|
||||
if(interest.indexOf(this.name)>=0 || 1){
|
||||
send({type:'prop',name:this.name,val:ov.slice(0,80)});
|
||||
}
|
||||
// 可选替换
|
||||
// if(this.name=='ro.serialno'){ this.ctx.x1.writeUtf8String('99999999999'); }
|
||||
}
|
||||
});
|
||||
}
|
||||
hook();
|
||||
"""
|
||||
|
||||
def get_pid(d):
|
||||
for _ in range(10):
|
||||
r=subprocess.run(["adb","-s","127.0.0.1:5555","shell","pidof",PACKAGE],capture_output=True,text=True)
|
||||
if r.stdout.strip(): return int(r.stdout.strip().split()[0])
|
||||
time.sleep(1)
|
||||
return None
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True)
|
||||
time.sleep(1)
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","monkey","-p",PACKAGE,"-c","android.intent.category.LAUNCHER","1"],capture_output=True)
|
||||
# attach 前等 app 起来但不触发派生(login 触发)
|
||||
time.sleep(6)
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid=get_pid(d)
|
||||
print("attaching pid",pid,flush=True)
|
||||
if not pid:
|
||||
print("no pid"); return
|
||||
s=d.attach(pid)
|
||||
props=[]
|
||||
def on(m,dd):
|
||||
if m.get('type')!='send':return
|
||||
p=m.get('payload') or {}
|
||||
if p.get('type')=='prop':
|
||||
props.append((p['name'],p['val']))
|
||||
print(f" {p['name']} = {p['val']}",flush=True)
|
||||
sc=s.create_script(JS); sc.on('message',on); sc.load()
|
||||
print("[*] hooked, 触发登录/活动 观察派生属性 20s...",flush=True)
|
||||
# 触发动作让 app 读取属性
|
||||
time.sleep(20)
|
||||
print(f"[*] 共捕获 {len(props)} 次属性读取",flush=True)
|
||||
try: s.detach()
|
||||
except: pass
|
||||
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,176 @@
|
||||
#!/usr/bin/env python3
|
||||
"""请求链捕获器: 冷启动 → 完整登录链。
|
||||
|
||||
不再只盯 dfpReport。hook SSL_write + SSL_read:
|
||||
- SSL_write: 读取 body 前 2000B, 按文本标记分类 (dfpReport/hy*Credlogin/hylogout/dckey/PrtReq 等),
|
||||
记录完整 hex + len + t + 分类。
|
||||
- SSL_read: 记录响应 hex + len + t, 按时间与请求配对, 看身份链 (t1/t5/actionV 的建立)。
|
||||
用途: 搞清楚 dfpReport 在登录链中的角色, 设备身份(t1/t5)到底由哪个接口发放。
|
||||
|
||||
约定: 后台启动 + tail 实时看 + 命中即杀 (docs/Hook脚本运行与捕获约定.md)。
|
||||
spawn 顺序: bypass x2 -> resume+11s -> patch_guard -> 最后主 hook JS。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
import frida
|
||||
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/reqchain_" + time.strftime("%H%M%S") + ".json")
|
||||
|
||||
# 请求分类关键字 (wup payload 名 / http 头)
|
||||
MARKERS = [
|
||||
("dfpReport", "dfpReport"),
|
||||
("hylogout", "hylogout"),
|
||||
("hyCredlogin", "hyCredlogin"),
|
||||
("hyanonymousCredlogin", "hyanonymousCredlogin"),
|
||||
("dckey", "dckey"),
|
||||
("PrtReq", "PrtReq"),
|
||||
("CheckUidIsBind", "CheckUidIsBind"),
|
||||
("GetUidByGameZone", "GetUidByGameZone"),
|
||||
("get3", "get3"),
|
||||
("verify3", "verify3"),
|
||||
]
|
||||
|
||||
|
||||
def classify(head: bytes) -> str:
|
||||
for marker, name in MARKERS:
|
||||
if marker.encode() in head:
|
||||
return name
|
||||
return "other"
|
||||
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
Process.setExceptionHandler(function(d){ return true; });
|
||||
send({type:'armed'});
|
||||
var t0 = Date.now();
|
||||
|
||||
function hexb(p, n){ try{ return Array.from(new Uint8Array(p.readByteArray(n))).map(function(b){return ('0'+b.toString(16)).slice(-2)}).join(''); }catch(e){ return ''; } }
|
||||
function head(p, n){ try{ return p.readCString(n); }catch(e){ return ''; } }
|
||||
function classify(head){
|
||||
var ms = [['dfpReport','dfpReport'],['hylogout','hylogut'],['hyanonymousCredlogin','hyanonym'],
|
||||
['hyCredlogin','hyCredlogin'],['dckey','dckey'],['PrtReq','PrtReq'],['get3','get3'],
|
||||
['verify3','verify3']];
|
||||
for (var i=0;i<ms.length;i++){ if (head.indexOf(ms[i][0]) >= 0) return ms[i][1]; }
|
||||
return 'other';
|
||||
}
|
||||
|
||||
var n = 0;
|
||||
try{
|
||||
var r = new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address, {
|
||||
onEnter: function(a){
|
||||
var len = a[2].toInt32();
|
||||
if (len < 40 || len > 50000) return;
|
||||
var h = head(a[1], Math.min(len, 2000));
|
||||
if (!h) return;
|
||||
var name = classify(h);
|
||||
// 过滤明显无关 (cert请求等), 保留虎牙业务
|
||||
if (name === 'other' && h.indexOf('POST /') < 0 && h.indexOf(' 1@') < 0 && h.indexOf('PUT /') < 0) return;
|
||||
n++;
|
||||
send({type:'req', n:n, cls:name, len:len, head:h.slice(0,80),
|
||||
hex:hexb(a[1], len), t:Date.now()-t0});
|
||||
}
|
||||
});
|
||||
});
|
||||
send({type:'sslwrite_hooked'});
|
||||
}catch(e){ send({type:'sslwrite_err', e:String(e)}); }
|
||||
|
||||
try{
|
||||
var r2 = new ApiResolver('module');
|
||||
r2.enumerateMatchesSync('exports:*!SSL_read').forEach(function(m){
|
||||
Interceptor.attach(m.address, {
|
||||
onEnter: function(a){ this.buf=a[1]; this.cap=a[2].toInt32(); },
|
||||
onLeave: function(ret){
|
||||
var n2 = ret.toInt32();
|
||||
if (n2 <= 0 || n2 > 3200) return;
|
||||
send({type:'resp', len:n2, hex:hexb(this.buf, n2), t:Date.now()-t0});
|
||||
}
|
||||
});
|
||||
});
|
||||
send({type:'sslread_hooked'});
|
||||
}catch(e){ send({type:'sslread_err', e:String(e)}); }
|
||||
"""
|
||||
|
||||
|
||||
def load_with_retry(session, js, n=5):
|
||||
last = None
|
||||
for i in range(n):
|
||||
try:
|
||||
s = session.create_script(js)
|
||||
s.load()
|
||||
return s
|
||||
except Exception as e:
|
||||
last = e
|
||||
print(f"[retry {i}] {e}", flush=True)
|
||||
time.sleep(3)
|
||||
raise last
|
||||
|
||||
|
||||
def main():
|
||||
# 清旧实例 (多进程坑)
|
||||
import subprocess
|
||||
subprocess.run(["adb", "shell", "am", "force-stop", PACKAGE], capture_output=True)
|
||||
device = frida.get_device_manager().add_remote_device("127.0.0.1:31877")
|
||||
pid = device.spawn([PACKAGE])
|
||||
print(f"[*] spawned {PACKAGE} pid={pid}", flush=True)
|
||||
session = device.attach(pid)
|
||||
|
||||
events = []
|
||||
|
||||
def on_message(message, data):
|
||||
if message.get("type") == "error":
|
||||
print("[JS-ERR]", str(message)[:300], flush=True)
|
||||
return
|
||||
if message.get("type") != "send":
|
||||
return
|
||||
p = message.get("payload") or {}
|
||||
t = p.get("type")
|
||||
if t == "armed":
|
||||
print("[*] JS armed", flush=True)
|
||||
elif t == "sslwrite_hooked":
|
||||
print("[*] SSL_write hooked", flush=True)
|
||||
elif t == "sslread_hooked":
|
||||
print("[*] SSL_read hooked", flush=True)
|
||||
elif t == "req":
|
||||
print(f"[{p.get('t')}ms] [{p.get('n')}] {p.get('cls'):12s} len={p.get('len')}", flush=True)
|
||||
events.append({"type": "req", **p})
|
||||
OUT.write_text(json.dumps(events))
|
||||
elif t == "resp":
|
||||
h = p.get('hex', '')
|
||||
import re as _re
|
||||
av = _re.search(rb'actionV\(([0-9a-f]{40})', bytes.fromhex(h))
|
||||
mark = f" actionV={av.group(1).decode()}" if av else ""
|
||||
print(f"[{p.get('t')}ms] [resp] len={p.get('len')}{mark}", flush=True)
|
||||
events.append({"type": "resp", **p})
|
||||
OUT.write_text(json.dumps(events))
|
||||
elif t in ("sslwrite_err", "sslread_err"):
|
||||
print(f"[*] {t}: {p.get('e')}", flush=True)
|
||||
|
||||
# 严格约定顺序
|
||||
print("[*] loading bypass", flush=True)
|
||||
load_with_retry(session, (RE / "evidence/scripts/bypass_msaoaid_maps_art_callsite.js").read_text())
|
||||
load_with_retry(session, (RE / "evidence/scripts/mask_frida_maps_only.js").read_text())
|
||||
device.resume(pid)
|
||||
time.sleep(11)
|
||||
load_with_retry(session, (RE / "evidence/scripts/patch_guard_block_termination.js").read_text())
|
||||
print("[*] loading 主 hook JS (最后)", flush=True)
|
||||
script = load_with_retry(session, JS)
|
||||
script.on("message", on_message)
|
||||
print("[*] 已 resume。捕获取请求链 (冷启动自动触发 + 登录触发)", flush=True)
|
||||
try:
|
||||
while True:
|
||||
time.sleep(5)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
print(f"[*] 结束 -> {OUT}", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -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()
|
||||
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
"""模拟器 spawn + 真机G2-0055组合bypass(bypass_msaoaid_maps_skip_cleanup.js) 存活测试。
|
||||
对照真机50s存活结论, 应在模拟器上也长时存活。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, subprocess, json
|
||||
REMOTE="127.0.0.1:31878"; PACKAGE="com.duowan.kiwi"
|
||||
RE=Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
BYPASS="bypass_msaoaid_maps_skip_cleanup.js"
|
||||
def one_round(d,r):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE],capture_output=True)
|
||||
time.sleep(1.2)
|
||||
pid=d.spawn([PACKAGE])
|
||||
s=d.attach(pid)
|
||||
# 挂起时加载 G2-0055 组合
|
||||
sc=s.create_script((RE/"evidence/scripts"/BYPASS).read_text())
|
||||
def on(m,dd):
|
||||
if m.get('type')=='send': print(f" r{r} {m.get('payload')}",flush=True)
|
||||
elif m.get('type')=='error': print(f" r{r} ERR {str(m)[:100]}",flush=True)
|
||||
sc.on('message',on); sc.load()
|
||||
d.resume(pid)
|
||||
print(f"r{r} spawned+bypass, resume, 观察存活...",flush=True)
|
||||
t0=time.time(); died=None; last=True
|
||||
while time.time()-t0<90:
|
||||
time.sleep(3)
|
||||
try: alive=[p for p in d.enumerate_processes() if p.pid==pid]
|
||||
except: break
|
||||
if not alive:
|
||||
died=time.time()-t0
|
||||
print(f" r{r} DEAD at +{died:.0f}s",flush=True); break
|
||||
last=(time.time()-t0)
|
||||
if not died:
|
||||
print(f" r{r} 存活超过 90s! (仍在最后观测点 {last:.0f}s)",flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
return died if died else 90
|
||||
def main():
|
||||
d=frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for r in range(1,4):
|
||||
try:
|
||||
surv=one_round(d,r)
|
||||
print(f"=> r{r} 存活={surv:.0f}s",flush=True)
|
||||
except Exception as e:
|
||||
print(f"r{r} ERR {e}",flush=True)
|
||||
time.sleep(2)
|
||||
if __name__=="__main__": main()
|
||||
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env python3
|
||||
"""spawn + 快速加载 bypass → resume 的【存活时长】多轮测试。
|
||||
|
||||
验证: spawn 路径带 bypass 后 App 能活多久, 是否每个 spawn 都稳定抓到 dfpReport。
|
||||
流程每轮:
|
||||
force-stop → spawn → attach → 挂起内快速加载 bypass_msaoaid + mask_frida
|
||||
→ resume → 加载 patch_guard + 主hook(SSL_write抓dfp)
|
||||
→ 持续观察存活, 记录死亡时间 或 抓满 N 秒
|
||||
统计多轮: 平均存活时长, dfpReport 捕获成功率, actionV。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, subprocess, json, re
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/spawn_survival.json")
|
||||
|
||||
MAIN_JS = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',len:len,t:Date.now()});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
|
||||
ROUNDS = 4
|
||||
MAX_SURVIVE = 120 # 每轮最多观察秒数
|
||||
|
||||
|
||||
def one_round(d, r):
|
||||
subprocess.run(["adb","-s","127.0.0.1:5555","shell","am","force-stop",PACKAGE], capture_output=True)
|
||||
time.sleep(1.2)
|
||||
pid = d.spawn([PACKAGE])
|
||||
s = d.attach(pid)
|
||||
# 挂起快速加载 2 bypass
|
||||
for name in ["bypass_msaoaid_maps_art_callsite.js", "mask_frida_maps_only.js"]:
|
||||
try:
|
||||
sc = s.create_script((RE/"evidence/scripts"/name).read_text()); sc.load()
|
||||
except Exception as e:
|
||||
print(f" r{r} bp {name} err {e}", flush=True)
|
||||
d.resume(pid)
|
||||
dfp = []
|
||||
def on_main(m, dd):
|
||||
if m.get('type') == 'error': return
|
||||
p = m.get('payload') or {}
|
||||
if p.get('type') == 'hooked':
|
||||
print(f" r{r} hook installed", flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f" r{r} {p['cls']} len={p['len']}", flush=True)
|
||||
dfp.append(p)
|
||||
# patch_guard + 主 hook
|
||||
try:
|
||||
sg = s.create_script((RE/"evidence/scripts/patch_guard_block_termination.js").read_text()); sg.load()
|
||||
except Exception as e:
|
||||
print(f" r{r} guard err {e}", flush=True)
|
||||
sc = s.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
# 观察存活
|
||||
t0 = time.time()
|
||||
died_at = None
|
||||
last_alive = True
|
||||
while time.time() - t0 < MAX_SURVIVE:
|
||||
time.sleep(3)
|
||||
try:
|
||||
alive = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
except Exception:
|
||||
break
|
||||
if not alive:
|
||||
died_at = time.time() - t0
|
||||
break
|
||||
survival = died_at if died_at else MAX_SURVIVE
|
||||
got_dfp = any(e.get('cls')=='dfpReport' for e in dfp)
|
||||
res = {"round": r, "survival_s": round(survival), "dfp_count": len([e for e in dfp if e.get('cls')=='dfpReport']), "got_dfp": got_dfp, "died": died_at is not None}
|
||||
print(f"=> r{r}: 存活={survival:.0f}s dfpReport={res['dfp_count']} {'DIED' if died_at else 'alive'} ", flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
return res
|
||||
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
all_res = []
|
||||
for r in range(1, ROUNDS+1):
|
||||
try:
|
||||
all_res.append(one_round(d, r))
|
||||
except Exception as e:
|
||||
print(f"r{r} ERROR {e}", flush=True)
|
||||
all_res.append({"round": r, "error": str(e)})
|
||||
time.sleep(2)
|
||||
print("\n=== 汇总 ===", flush=True)
|
||||
sur = [x.get('survival_s') for x in all_res if 'survival_s' in x]
|
||||
dfp = [x for x in all_res if x.get('got_dfp')]
|
||||
print(f"存活时长: {sur}", flush=True)
|
||||
print(f"dfpReport 捕获成功率: {len(dfp)}/{ROUNDS}", flush=True)
|
||||
json.dump(all_res, open(OUT, 'w'), indent=2)
|
||||
print(f"saved {OUT}", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env python3
|
||||
"""T0: 基础对照实验 (2026-08-27 重做, 不用旧结论).
|
||||
|
||||
T1: spawn + attach(空session) + resume → 观察 15s, 死因=完整logcat
|
||||
T2: spawn + resume (不attach) → 对照
|
||||
每轮输出: pid 时间线 + 死亡时 logcat(main/crash/events + kernel) 关键行。
|
||||
判定死亡: 主进程不存在 或 pid 变化 (KeepAlive 重启也算死)。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys, re
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/tmp/t0_basic.json")
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def run_case(d, kind, rnd):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
adb("shell", "logcat", "-c")
|
||||
adb("shell", "logcat", "-c", "-b", "crash")
|
||||
pid = d.spawn([PACKAGE])
|
||||
t0 = time.time()
|
||||
session = None
|
||||
if kind == "attach":
|
||||
session = d.attach(pid)
|
||||
d.resume(pid)
|
||||
print(f"[T1.r{rnd}] spawn pid={pid} {'attach+resume' if kind=='attach' else '纯resume'} +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
# 观察 15s
|
||||
timeline = []
|
||||
died_at = None
|
||||
while time.time() - t0 < 15:
|
||||
time.sleep(1.5)
|
||||
mp = main_pid()
|
||||
now = round(time.time() - t0, 1)
|
||||
if mp is None:
|
||||
died_at = now
|
||||
timeline.append({"t": now, "main": None})
|
||||
print(f" +{now}s 主进程消失 (死)", flush=True)
|
||||
break
|
||||
if mp != pid:
|
||||
died_at = now
|
||||
timeline.append({"t": now, "main": mp, "note": "pid变化"})
|
||||
print(f" +{now}s pid变化 {pid}->{mp} (主进程死/重启)", flush=True)
|
||||
break
|
||||
timeline.append({"t": now, "main": mp})
|
||||
# 抓日志
|
||||
main_log = adb("shell", "logcat", "-d", "-t", "300").stdout
|
||||
crash_log = adb("shell", "logcat", "-d", "-b", "crash", "-t", "100").stdout
|
||||
# 关键筛选
|
||||
keys = []
|
||||
for line in (main_log.splitlines() + crash_log.splitlines()):
|
||||
if re.search(r"msaoaid|nsdt|kist|guard|exit|kill|died|died|FATAL|Fatal|signal|Abort|SIGSEGV|SIGABRT|frida|avc:|SELinux|scudo|Suspicious|property|magisk|denied", line, re.I):
|
||||
keys.append(line[:220])
|
||||
print(f" 死亡={'是@'+str(died_at) if died_at else '否(存活)'} 关键日志行数={len(keys)}", flush=True)
|
||||
for l in keys[-18:]:
|
||||
print(f" L: {l}", flush=True)
|
||||
try:
|
||||
if session: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
return {"kind": kind, "round": rnd, "died_at": died_at, "timeline": timeline, "log_lines": keys[-40:]}
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
results = []
|
||||
for rnd in (1, 2):
|
||||
results.append(run_case(d, "attach", rnd))
|
||||
results.append(run_case(d, "pure", 1))
|
||||
OUT.write_text(json.dumps(results, ensure_ascii=False, indent=1))
|
||||
print(f"[*] -> {OUT}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,141 @@
|
||||
#!/usr/bin/env python3
|
||||
"""T1: frida attach 痕迹快照 (自己的实验).
|
||||
|
||||
spawn -> attach(挂起) -> 加载【痕迹采集脚本】(只读, 不改任何东西) -> resume
|
||||
采集(每~350ms):
|
||||
- 进程线程名列表 (/proc/self/task/*/comm)
|
||||
- /proc/self/maps 里含 frida/agent/re.linker/gum 的行
|
||||
- /proc/self/fd 的 symlink (linjector/pipe/socket)
|
||||
- 已加载模块含 frida/agent 的名字
|
||||
目标: attach(不任何hook) 时进程内哪些痕迹可被 msaoaidsec 看到。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/tmp/t1_traces.json")
|
||||
|
||||
TRACE_JS = r"""
|
||||
'use strict';
|
||||
function snap() {
|
||||
const s = { t: Date.now(), threads: [], maps_marks: [], fds: [], modules: [] };
|
||||
try {
|
||||
for (const t of Process.enumerateThreads()) {
|
||||
s.threads.push({ id: t.id, name: t.state == null ? '?' : t.name });
|
||||
}
|
||||
} catch (_) {}
|
||||
try {
|
||||
const maps = Process.enumerateMappings ? null : null;
|
||||
} catch (_) {}
|
||||
try {
|
||||
for (const m of Process.enumerateModules()) {
|
||||
if (/frida|agent|gum|re\.linker|linjector/i.test(m.name + m.path)) {
|
||||
s.modules.push({ name: m.name, path: m.path, base: m.base.toString() });
|
||||
}
|
||||
}
|
||||
} catch (_) {}
|
||||
try {
|
||||
const MEM = Process.findModuleByName('libc.so');
|
||||
} catch (_) {}
|
||||
// fd 列表: 用 openat 枚举 /proc/self/fd
|
||||
try {
|
||||
const dir = new File('/proc/self/fd', 'r');
|
||||
const names = dir.read().toString().split(/\s+/);
|
||||
for (const n of names) {
|
||||
if (!/^\d+$/.test(n)) continue;
|
||||
const link = new File('/proc/self/fd/' + n, 'r');
|
||||
// can't readlink via File; use readlink via NativeFunction
|
||||
}
|
||||
} catch (_) {}
|
||||
send(s);
|
||||
}
|
||||
try {
|
||||
const readlink = new NativeFunction(Module.findExportByName('libc.so', 'readlink'), 'long', ['pointer', 'pointer', 'ulong']);
|
||||
setInterval(() => {
|
||||
const s = { t: Date.now(), threads: [], fds: [], modules: [], links: [] };
|
||||
try {
|
||||
for (const t of Process.enumerateThreads()) s.threads.push({ id: t.id, name: t.name });
|
||||
} catch (_) {}
|
||||
try {
|
||||
for (const m of Process.enumerateModules()) {
|
||||
if (/frida|agent|gum|re\.linker|linjector/i.test(m.name + m.path)) {
|
||||
s.modules.push({ name: m.name, path: m.path });
|
||||
}
|
||||
}
|
||||
} catch (_) {}
|
||||
// fd symlinks
|
||||
try {
|
||||
const fp = new File('/proc/self/fd', 'r');
|
||||
const buf = fp.read().toString();
|
||||
for (const n of buf.split(/\s+/)) {
|
||||
if (!/^\d+$/.test(n)) continue;
|
||||
try {
|
||||
const p = Memory.alloc(512);
|
||||
const r = readlink('/proc/self/fd/' + n, p, 512);
|
||||
if (r > 0) {
|
||||
const link = p.readCString();
|
||||
if (/frida|agent|linjector|pipe|socket|memfd/i.test(link)) s.links.push(n + ' -> ' + link);
|
||||
}
|
||||
} catch (_) {}
|
||||
}
|
||||
} catch (_) {}
|
||||
send(s);
|
||||
}, 350);
|
||||
} catch (e) { send({ err: String(e) }); }
|
||||
send({ boot: true });
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for rnd in (1, 2):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
pid = d.spawn([PACKAGE])
|
||||
session = d.attach(pid)
|
||||
t0 = time.time()
|
||||
snaps = []
|
||||
def on(m, dta):
|
||||
if m.get('type') != 'send': return
|
||||
p = m.get('payload') or {}
|
||||
p['elapsed'] = round(time.time() - t0, 2)
|
||||
if 'threads' in p or 'err' in p or 'boot' in p:
|
||||
snaps.append(p)
|
||||
sc = session.create_script(TRACE_JS)
|
||||
sc.on('message', on)
|
||||
sc.load()
|
||||
d.resume(pid)
|
||||
print(f"[T1.r{rnd}] spawn pid={pid} attach+采集脚本 resume +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
# 观察直到死(最多15s)
|
||||
died = None
|
||||
while time.time() - t0 < 15:
|
||||
time.sleep(1)
|
||||
mp = main_pid()
|
||||
if mp is None or mp != pid:
|
||||
died = time.time() - t0
|
||||
break
|
||||
print(f"[T1.r{rnd}] 死@+{died if died else 15}s 快照数={len(snaps)}", flush=True)
|
||||
if dies := (died or 15):
|
||||
print(f" 最后2个快照: {json.dumps(snaps[-2:], ensure_ascii=False)[:900]}", flush=True)
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
OUT.write_text(json.dumps(snaps, ensure_ascii=False, indent=1))
|
||||
print(f"[*] -> {OUT}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,139 @@
|
||||
#!/usr/bin/env python3
|
||||
"""T2: 拦截 msaoaidsec 的退出动作 (找到检测点 + 让App活下来).
|
||||
|
||||
spawn -> attach(挂起) -> 加载【exit拦截脚本】:
|
||||
- Interceptor.replace libc _exit/exit/exit_group/_Exit/abort
|
||||
- 若调用者 backtrace 含 libmsaoaidsec.so → 吞掉该退出(不真正退出), 记录 backtrace
|
||||
- 其他来源(Java System.exit等) → 放行原函数
|
||||
resume 后观察 App 是否存活 (若存活并能看到 msaoaidsec backtrace = 检测点找到+绕过成功)
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/tmp/t2_exit_block.json")
|
||||
|
||||
INTERCEPT_JS = r"""
|
||||
'use strict';
|
||||
const PACK = 'libmsaoaidsec.so';
|
||||
let swallowed = 0, passthrough = 0;
|
||||
const log = [];
|
||||
|
||||
function bt() {
|
||||
const src = [];
|
||||
try {
|
||||
for (const a of Thread.backtrace(this.context, Backtracer.ACCURATE)) {
|
||||
const m = Process.findModuleByAddress(a);
|
||||
src.push(m ? (m.name === PACK ? a.sub(m.base).toString() : m.name) : a.toString());
|
||||
}
|
||||
} catch (_) {}
|
||||
return src;
|
||||
}
|
||||
|
||||
function make(name, retType, argTypes) {
|
||||
try {
|
||||
const addr = Module.findExportByName('libc.so', name);
|
||||
if (addr === null) return;
|
||||
const orig = new NativeFunction(addr, retType, argTypes);
|
||||
Interceptor.replace(addr, new NativeCallback(function () {
|
||||
const src = bt();
|
||||
const fromMsao = src.some(s => typeof s === 'string' && s.startsWith('0x'));
|
||||
if (fromMsao) {
|
||||
swallowed++;
|
||||
log.push({ fn: name, msao: true, src: src.slice(0, 8) });
|
||||
send({ sw: name, n: swallowed });
|
||||
return; // 吞掉 msaoaidsec 的退出
|
||||
}
|
||||
passthrough++;
|
||||
send({ pass: name, src: src.slice(0, 6) });
|
||||
return orig.apply(null, arguments);
|
||||
}, retType, argTypes));
|
||||
send({ installed: name });
|
||||
} catch (e) { send({ err: name, e: String(e) }); }
|
||||
}
|
||||
|
||||
make('_exit', 'void', ['int']);
|
||||
make('_Exit', 'void', ['int']);
|
||||
make('exit', 'void', ['int']);
|
||||
make('exit_group', 'void', ['int']);
|
||||
make('abort', 'void', []);
|
||||
// 线程退出也要看 (pthread_exit 常用于静默死)
|
||||
try {
|
||||
const pe = Module.findExportByName('libc.so', 'pthread_exit');
|
||||
const origPe = new NativeFunction(pe, 'void', ['pointer']);
|
||||
Interceptor.replace(pe, new NativeCallback(function (retval) {
|
||||
const src = bt();
|
||||
if (src.some(s => typeof s === 'string' && s.startsWith('0x'))) {
|
||||
swallowed++;
|
||||
log.push({ fn: 'pthread_exit', msao: true, src: src.slice(0, 8) });
|
||||
send({ sw: 'pthread_exit', n: swallowed });
|
||||
return; // 吞掉
|
||||
}
|
||||
return origPe(retval);
|
||||
}, 'void', ['pointer']));
|
||||
send({ installed: 'pthread_exit' });
|
||||
} catch (e) { send({ err: 'pthread_exit', e: String(e) }); }
|
||||
|
||||
send({ ready: true });
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for rnd in (1, 2, 3):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = d.spawn([PACKAGE])
|
||||
session = d.attach(pid)
|
||||
t0 = time.time()
|
||||
events = []
|
||||
def on(m, dta):
|
||||
if m.get('type') != 'send': return
|
||||
p = m.get('payload') or {}
|
||||
p['elapsed'] = round(time.time() - t0, 2)
|
||||
events.append(p)
|
||||
if 'sw' in p:
|
||||
print(f" [+{p['elapsed']}s] 吞掉 msaoaidsec {p['sw']} (#{p['n']})", flush=True)
|
||||
elif 'pass' in p:
|
||||
print(f" [+{p['elapsed']}s] 放行 {p['pass']} src={p['src'][:4]}", flush=True)
|
||||
elif 'installed' in p:
|
||||
print(f" [+{p['elapsed']}s] hook {p['installed']}", flush=True)
|
||||
sc = session.create_script(INTERCEPT_JS)
|
||||
sc.on('message', on)
|
||||
sc.load()
|
||||
d.resume(pid)
|
||||
print(f"[T2.r{rnd}] spawn pid={pid} + exit拦截, resume +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
died = None
|
||||
while time.time() - t0 < 20:
|
||||
time.sleep(1.5)
|
||||
mp = main_pid()
|
||||
if mp is None or mp != pid:
|
||||
died = time.time() - t0
|
||||
break
|
||||
# 抓 backtrace 详情
|
||||
swallows = [e for e in events if 'sw' in e]
|
||||
print(f"[T2.r{rnd}] 结果: {'死@+'+str(round(died,1))+'s' if died else '存活20s'} 吞掉={len(swallows)} 放行={sum(1 for e in events if 'pass' in e)}", flush=True)
|
||||
# 打印最后几次吞掉的 backtrace (从 py 侧拿不到 log, 用 events 里的 sw 计数即可)
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
OUT.write_text(json.dumps(events, ensure_ascii=False, indent=1))
|
||||
print(f"[*] -> {OUT}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env python3
|
||||
"""T3: 抓 msaoaidsec 的真实退出途径 (raw syscall / tgkill / kill).
|
||||
|
||||
T2 proved libc _exit/exit/abort/pthread_exit NOT used (0 calls, app still dies).
|
||||
This experiment hooks:
|
||||
- libc 'syscall' (可变参数) → 若 msaoaidsec 用 syscall(exit_group)
|
||||
- libc 'tgkill' / 'tkill' / 'kill' → 若自杀信号
|
||||
- libc 'raise'
|
||||
- libc '_exit' _Exit exit exit_group (再拦一次确认)
|
||||
每次命中打印 backtrace (库内偏移)。不做任何返回改写 (只读观察) —— 纯归因。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/tmp/t3_exit_trace.json")
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
const PACK = 'libmsaoaidsec.so';
|
||||
function bt() {
|
||||
const out = [];
|
||||
try {
|
||||
for (const a of Thread.backtrace(this.context, Backtracer.ACCURATE)) {
|
||||
const m = Process.findModuleByAddress(a);
|
||||
out.push(m ? (m.name === PACK ? 'MS:' + a.sub(m.base).toString() : m.name) : a.toString());
|
||||
}
|
||||
} catch (_) {}
|
||||
return out.slice(0, 10);
|
||||
}
|
||||
function watch(name, nargs) {
|
||||
try {
|
||||
const addr = Module.findExportByName('libc.so', name);
|
||||
if (addr === null) { send({ skip: name }); return; }
|
||||
Interceptor.attach(addr, {
|
||||
onEnter(args) {
|
||||
const src = bt();
|
||||
const ms = src.some(s => typeof s === 'string' && s.startsWith('MS:'));
|
||||
const argv = [];
|
||||
for (let i = 0; i < nargs; i++) { try { argv.push(args[i].toString()); } catch (_) { argv.push('?'); } }
|
||||
send({ fn: name, ms, src, argv });
|
||||
}
|
||||
});
|
||||
send({ hooked: name });
|
||||
} catch (e) { send({ err: name, e: String(e) }); }
|
||||
}
|
||||
watch('syscall', 8);
|
||||
watch('tgkill', 3);
|
||||
watch('tkill', 2);
|
||||
watch('kill', 2);
|
||||
watch('raise', 1);
|
||||
watch('_exit', 1);
|
||||
watch('_Exit', 1);
|
||||
watch('exit', 1);
|
||||
watch('exit_group', 1);
|
||||
watch('abort', 0);
|
||||
send({ ready: true });
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for rnd in (1, 2, 3):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = d.spawn([PACKAGE])
|
||||
session = d.attach(pid)
|
||||
t0 = time.time()
|
||||
hits = []
|
||||
def on(m, dta):
|
||||
if m.get('type') != 'send': return
|
||||
p = m.get('payload') or {}
|
||||
p['elapsed'] = round(time.time() - t0, 3)
|
||||
if 'fn' in p:
|
||||
hits.append(p)
|
||||
mark = 'MSAO!!' if p.get('ms') else ' '
|
||||
print(f" [{mark} +{p['elapsed']:6.2f}s] {p['fn']} argv={p.get('argv')}", flush=True)
|
||||
print(f" bt={p.get('src')}", flush=True)
|
||||
elif 'hooked' in p:
|
||||
pass
|
||||
elif 'skip' in p:
|
||||
print(f" [skip] {p['skip']}", flush=True)
|
||||
sc = session.create_script(JS)
|
||||
sc.on('message', on)
|
||||
sc.load()
|
||||
d.resume(pid)
|
||||
print(f"[T3.r{rnd}] pid={pid} resume +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
died = None
|
||||
while time.time() - t0 < 15:
|
||||
time.sleep(1)
|
||||
mp = main_pid()
|
||||
if mp is None or mp != pid:
|
||||
died = time.time() - t0
|
||||
break
|
||||
print(f"[T3.r{rnd}] {'死@+'+str(round(died,1))+'s' if died else '存活'} 命中={len(hits)}", flush=True)
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
OUT.write_text(json.dumps(hits, ensure_ascii=False, indent=1))
|
||||
print(f"[*] -> {OUT}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,124 @@
|
||||
#!/usr/bin/env python3
|
||||
"""T4 终局验证: 全吞退出函数 replace成no-op, 读LR抓调用者, 观察App是否存活.
|
||||
|
||||
T3 已证 _exit(0)/_Exit(0) 被调且 backtrace 空 (内联/清栈调用)。
|
||||
T4: Interceptor.replace _exit/_Exit/exit/exit_group/abort 为 no-op (不真正退出)
|
||||
同时 attach libc 'syscall' 打印 SYS_exit_group(94)/SYS_tgkill(131)/SYS_kill(129) 调用
|
||||
并读 LR (return address) 找 msaoaidsec 偏移。
|
||||
若 App 存活 >10s → 挡住退出=绕过成功; 若仍死 → 是 syscall/tgkill 自杀。
|
||||
"""
|
||||
from pathlib import Path
|
||||
import frida, time, json, subprocess, sys
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
OUT = Path("/tmp/t4_all_block.json")
|
||||
|
||||
JS = r"""
|
||||
'use strict';
|
||||
const PACK = 'libmsaoaidsec.so';
|
||||
let nExit = 0, nSyscall = 0;
|
||||
|
||||
function where(addr) {
|
||||
try {
|
||||
const m = Process.findModuleByAddress(addr);
|
||||
if (m === null) return addr.toString();
|
||||
return m.name === PACK ? 'MS:' + addr.sub(m.base).toString() : m.name;
|
||||
} catch (_) { return '?'; }
|
||||
}
|
||||
|
||||
// 1) 全吞退出函数
|
||||
for (const name of ['_exit', '_Exit', 'exit', 'exit_group', 'abort']) {
|
||||
try {
|
||||
const addr = Module.findExportByName('libc.so', name);
|
||||
if (addr === null) { send({ skip: name }); continue; }
|
||||
Interceptor.replace(addr, new NativeCallback(function () {
|
||||
nExit++;
|
||||
send({ exit: name, n: nExit, lr: where(this.context.lr) });
|
||||
return; // no-op: 吞掉退出
|
||||
}, 'void', name === 'abort' ? [] : ['int']));
|
||||
send({ blocked: name });
|
||||
} catch (e) { send({ err: name, e: String(e) }); }
|
||||
}
|
||||
|
||||
// 2) 观察 syscall 的 exit_group/tgkill/kill
|
||||
try {
|
||||
const sc = Module.findExportByName('libc.so', 'syscall');
|
||||
Interceptor.attach(sc, {
|
||||
onEnter(args) {
|
||||
const nr = args[0].toInt32() & 0xffffffff;
|
||||
if ([94, 93, 131, 129].includes(nr)) {
|
||||
nSyscall++;
|
||||
send({ sc: nr, n: nSyscall, lr: where(this.context.lr), arg1: args[1].toString() });
|
||||
}
|
||||
}
|
||||
});
|
||||
send({ watch_syscall: true });
|
||||
} catch (e) { send({ err: 'syscall', e: String(e) }); }
|
||||
|
||||
// 3) 观察 tgkill/tkill/kill/raise
|
||||
for (const name of ['tgkill', 'tkill', 'kill', 'raise']) {
|
||||
try {
|
||||
const addr = Module.findExportByName('libc.so', name);
|
||||
if (addr) Interceptor.attach(addr, { onEnter(args) { send({ kill: name, a0: args[0].toString(), a1: args[1].toString(), lr: where(this.context.lr) }); } });
|
||||
} catch (_) {}
|
||||
}
|
||||
send({ ready: true });
|
||||
"""
|
||||
|
||||
def sh(*a): return subprocess.run(a, capture_output=True, text=True)
|
||||
def adb(*a): return sh(*ADB, *a)
|
||||
|
||||
def main_pid():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
for p in r.stdout.strip().split():
|
||||
rr = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
if rr.stdout.strip("\x00").strip() == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def main():
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
for rnd in (1, 2, 3):
|
||||
adb("shell", "am", "force-stop", PACKAGE)
|
||||
time.sleep(1.5)
|
||||
adb("shell", "logcat", "-c")
|
||||
pid = d.spawn([PACKAGE])
|
||||
session = d.attach(pid)
|
||||
t0 = time.time()
|
||||
events = []
|
||||
def on(m, dta):
|
||||
if m.get('type') != 'send': return
|
||||
p = m.get('payload') or {}
|
||||
p['elapsed'] = round(time.time() - t0, 3)
|
||||
events.append(p)
|
||||
if 'exit' in p or 'sc' in p or 'kill' in p:
|
||||
line = f" [+{p['elapsed']:6.2f}s]"
|
||||
if 'exit' in p: line += f" 退出被吞 {p['exit']}(#{p['n']}) lr={p['lr']}"
|
||||
if 'sc' in p: line += f" syscall#{p['sc']} lr={p['lr']}"
|
||||
if 'kill' in p: line += f" kill {p['kill']}({p['a0']},{p['a1']}) lr={p['lr']}"
|
||||
print(line, flush=True)
|
||||
sc = session.create_script(JS)
|
||||
sc.on('message', on)
|
||||
sc.load()
|
||||
d.resume(pid)
|
||||
print(f"[T4.r{rnd}] pid={pid} resume +{(time.time()-t0)*1000:.0f}ms", flush=True)
|
||||
died = None
|
||||
while time.time() - t0 < 15:
|
||||
time.sleep(1)
|
||||
mp = main_pid()
|
||||
if mp is None or mp != pid:
|
||||
died = time.time() - t0
|
||||
break
|
||||
print(f"[T4.r{rnd}] {'死@+'+str(round(died,1))+'s' if died else '存活15s'} exit吞={sum(1 for e in events if 'exit' in e)} syscall命中={sum(1 for e in events if 'sc' in e)}", flush=True)
|
||||
try: session.detach()
|
||||
except Exception: pass
|
||||
try: d.kill(pid)
|
||||
except Exception: pass
|
||||
time.sleep(1)
|
||||
OUT.write_text(json.dumps(events, ensure_ascii=False, indent=1))
|
||||
print(f"[*] -> {OUT}", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env python3
|
||||
"""干净验证: 模拟器 spawn + 挂起加载 bypass → resume → 确认存活并抓到 dfpReport。
|
||||
打印每个 bypass 脚本的 event, 确认安装成功。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import frida, time, json, subprocess
|
||||
from pathlib import Path
|
||||
|
||||
REMOTE = "127.0.0.1:31878"
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
RE = Path("/Users/yml/codes/Reverse-Engineering-Agent-Universal-v3.0")
|
||||
OUT = Path("/Users/yml/codes/douyu_login_py/evidence/emu_clean_verify.json")
|
||||
|
||||
MAIN_JS = """
|
||||
'use strict';
|
||||
send({type:'armed'});
|
||||
function hexb(p,n){try{return Array.from(new Uint8Array(p.readByteArray(n))).map(b=>('0'+b.toString(16)).slice(-2)).join('');}catch(e){return '';}}
|
||||
function head(p,n){try{return p.readCString(n);}catch(e){return '';}}
|
||||
try{
|
||||
var r=new ApiResolver('module');
|
||||
r.enumerateMatchesSync('exports:*!SSL_write').forEach(function(m){
|
||||
Interceptor.attach(m.address,{onEnter:function(a){
|
||||
var len=a[2].toInt32();
|
||||
if(len<50||len>50000)return;
|
||||
var h=head(a[1],Math.min(len,1500));
|
||||
if(h.indexOf('dfpReport')>=0||h.indexOf('dckey')>=0){
|
||||
send({cls:h.indexOf('dfpReport')>=0?'dfpReport':'dckey',len:len,hex:hexb(a[1],len)});
|
||||
}
|
||||
}});
|
||||
});
|
||||
send({type:'hooked'});
|
||||
}catch(e){send({type:'err',e:String(e)});}
|
||||
"""
|
||||
|
||||
|
||||
def bypass_events(session, js_path, label):
|
||||
"""加载 bypass 并捕获其 send(event) 消息, 返回是否成功安装."""
|
||||
events = []
|
||||
|
||||
def on_msg(m, d):
|
||||
if m.get('type') == 'send':
|
||||
events.append(m.get('payload'))
|
||||
elif m.get('type') == 'error':
|
||||
events.append({'scripterr': str(m)[:120]})
|
||||
|
||||
try:
|
||||
sc = session.create_script(js_path.read_text())
|
||||
sc.on('message', on_msg)
|
||||
sc.load()
|
||||
time.sleep(0.15)
|
||||
print(f" [{label}] events: {events}", flush=True)
|
||||
return events
|
||||
except Exception as e:
|
||||
print(f" [{label}] load ERR: {e}", flush=True)
|
||||
return [{'loaderr': str(e)[:120]}]
|
||||
|
||||
|
||||
def main():
|
||||
subprocess.run(["adb", "-s", "127.0.0.1:5555", "shell", "am", "force-stop", PACKAGE], capture_output=True)
|
||||
time.sleep(1.5)
|
||||
d = frida.get_device_manager().add_remote_device(REMOTE)
|
||||
pid = d.spawn([PACKAGE])
|
||||
print(f"[*] spawned pid={pid}", flush=True)
|
||||
session = d.attach(pid)
|
||||
print("[*] suspended, loading bypass (fast)...", flush=True)
|
||||
|
||||
e1 = bypass_events(session, RE / "evidence/scripts/bypass_msaoaid_maps_art_callsite.js", "bypass_msaoaid")
|
||||
e2 = bypass_events(session, RE / "evidence/scripts/mask_frida_maps_only.js", "mask_frida")
|
||||
|
||||
print("[*] resuming...", flush=True)
|
||||
d.resume(pid)
|
||||
ok = []
|
||||
|
||||
# patch_guard 在 resume 后加载
|
||||
e3 = bypass_events(session, RE / "evidence/scripts/patch_guard_block_termination.js", "patch_guard")
|
||||
|
||||
# 主 hook
|
||||
events = []
|
||||
def on_main(m, dta):
|
||||
if m.get('type') == 'error':
|
||||
print("[JS-ERR]", str(m)[:120], flush=True); return
|
||||
p = m.get('payload') or {}
|
||||
t = p.get('type')
|
||||
if t == 'armed': print("[*] armed", flush=True)
|
||||
elif t == 'hooked': print("[*] SSL_write hooked", flush=True)
|
||||
elif 'cls' in p:
|
||||
print(f"[*] {p['cls']} len={p['len']}", flush=True)
|
||||
events.append(p); OUT.write_text(json.dumps(events))
|
||||
sc = session.create_script(MAIN_JS)
|
||||
sc.on('message', on_main)
|
||||
sc.load()
|
||||
|
||||
# 观察 25s: 存活 + 是否有 dfpReport
|
||||
for t in [2, 4, 6, 8, 10, 15, 20, 25]:
|
||||
time.sleep(t if t == 2 else t - prev)
|
||||
prev = t
|
||||
alive = [p for p in d.enumerate_processes() if p.pid == pid]
|
||||
print(f" +{t}s alive={bool(alive)}", flush=True)
|
||||
if not alive:
|
||||
print("[*] *** App DEAD at +%ds ***" % t, flush=True); break
|
||||
print(f"[*] final alive check: {bool([p for p in d.enumerate_processes() if p.pid==pid])}", flush=True)
|
||||
print(f"[*] dfpReport captured: {len([e for e in events if e.get('cls')=='dfpReport'])}", flush=True)
|
||||
try: d.kill(pid)
|
||||
except: pass
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env python3
|
||||
"""可靠进程存活监控: 以 adb pidof + /proc/<pid> 为唯一事实来源.
|
||||
|
||||
不用 frida enumerate_processes 判断存活 (有延迟/漏报, 且 spawn 后枚举不稳定)。
|
||||
用法: python3 watch_proc.py <seconds> [label] -- 对当前 com.duowan.kiwi 进程做轮询
|
||||
输出: 每 2s 一行 pid/状态; 结束时报告存活与否与死亡精确时长。
|
||||
"""
|
||||
import subprocess, sys, time
|
||||
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
|
||||
def adb(*a):
|
||||
return subprocess.run(ADB + list(a), capture_output=True, text=True)
|
||||
|
||||
def pidof():
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
out = r.stdout.strip()
|
||||
return [int(x) for x in out.split()] if out else []
|
||||
|
||||
def proc_ok(pid):
|
||||
r = adb("shell", "ls", f"/proc/{pid}/status")
|
||||
return r.returncode == 0
|
||||
|
||||
def main():
|
||||
seconds = int(sys.argv[1]) if len(sys.argv) > 1 else 60
|
||||
label = sys.argv[2] if len(sys.argv) > 2 else ""
|
||||
print(f"[watch:{label}] {seconds}s, 起点 pids={pidof()}", flush=True)
|
||||
t0 = time.time()
|
||||
seen = {}
|
||||
last_alive = t0
|
||||
last_dead = None
|
||||
while time.time() - t0 < seconds:
|
||||
pids = pidof()
|
||||
if pids:
|
||||
for p in pids:
|
||||
seen.setdefault(p, time.time())
|
||||
last_alive = time.time()
|
||||
last_dead = None
|
||||
print(f" +{time.time()-t0:5.1f}s ALIVE pids={pids}", flush=True)
|
||||
else:
|
||||
if last_dead is None:
|
||||
last_dead = time.time()
|
||||
print(f" +{time.time()-t0:5.1f}s DEAD (was alive={last_alive-t0:.1f}s)", flush=True)
|
||||
time.sleep(2)
|
||||
dur = time.time() - t0
|
||||
final = pidof()
|
||||
print(f"[watch:{label}] 结束: alive={bool(final)} final_pids={final} 存活时长={last_alive-t0:.1f}s 死亡时刻={last_dead-t0 if last_dead else '未死亡'} 总时长={dur:.1f}s", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env python3
|
||||
"""可靠主进程监控 v2: 主进程 = cmdline 精确等于包名 (排除 :sub 子进程).
|
||||
|
||||
事实来源: adb /proc/<pid>/cmdline + pidof. 绝不使用 frida enumerate 判断存活.
|
||||
用法: python3 watch_proc_v2.py <seconds> [label]
|
||||
"""
|
||||
import subprocess, sys, time
|
||||
|
||||
ADB = ["adb", "-s", "127.0.0.1:5555"]
|
||||
PACKAGE = "com.duowan.kiwi"
|
||||
|
||||
def adb(*a):
|
||||
return subprocess.run(ADB + list(a), capture_output=True, text=True)
|
||||
|
||||
def main_pid():
|
||||
"""返回主进程 pid (cmdline==PACKAGE), 无则 None."""
|
||||
r = adb("shell", "pidof", PACKAGE)
|
||||
pids = r.stdout.strip().split()
|
||||
for p in pids:
|
||||
r2 = adb("shell", "cat", f"/proc/{p}/cmdline")
|
||||
cmd = r2.stdout.strip("\x00").strip()
|
||||
if cmd == PACKAGE:
|
||||
return int(p)
|
||||
return None
|
||||
|
||||
def main():
|
||||
seconds = int(sys.argv[1]) if len(sys.argv) > 1 else 60
|
||||
label = sys.argv[2] if len(sys.argv) > 2 else ""
|
||||
t0 = time.time()
|
||||
last_alive = 0.0
|
||||
died_at = None
|
||||
pid_history = {}
|
||||
print(f"[watch:{label}] {seconds}s 起点 main_pid={main_pid()}", flush=True)
|
||||
while time.time() - t0 < seconds:
|
||||
p = main_pid()
|
||||
now = time.time() - t0
|
||||
if p is not None:
|
||||
pid_history.setdefault(p, now)
|
||||
last_alive = now
|
||||
died_at = None
|
||||
elif died_at is None:
|
||||
died_at = now
|
||||
print(f" +{now:5.1f}s DEAD (main) [存活到 +{last_alive:.1f}s]", flush=True)
|
||||
time.sleep(1.5)
|
||||
dur = time.time() - t0
|
||||
p = main_pid()
|
||||
print(f"[watch:{label}] END: alive={p is not None} pid={p} 最后存活时间=+{last_alive:.1f}s "
|
||||
f"死亡时刻={round(died_at,1) if died_at else '未死'} pids_seen={list(pid_history.keys())} 总={dur:.1f}s", flush=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user