# TNG eWallet 逆向笔记 — 自杀链（2026-07-31）

## 运行时铁证

| 现象 | 含义 |
|------|------|
| `Fatal signal 6 (SIGABRT), code 0 (SI_USER)` | 用户态 `kill(pid, SIGABRT)`，**不是** `exit_group`，也不是 `abort()` 的 `SI_TKILL` |
| PLT hook `kill/raise` **从不打日志** | Promon 走 **内联 SVC**，不经 PLT |
| `E Report : Exiting:` + `xwwqazamx.W: 16` + `bl.a` | Java 层检测入口仍是 `xwwqazamx.bl#a/#b` |
| `Displayed ...UserLoginActivity` | UI 能到登录页；随后数秒内被杀 |
| `Lcom/aliyun/TigerTally/t/B` 反射 `Thread.dispatchUncaughtException` | 另有一套阿里 TigerTally SDK |

## 自杀阶梯（当前理解）

```
Promon native 检测 (Thread-N 扫 /proc、selinux、wifi prop…)
    → xwwqazamx.bl#a / #b
        → 抛 W:16（Report 打 Exiting）
        → 同时/随后 inline kill(SIGABRT, SI_USER)
    → KillApplicationHandler（Xposed 可拦）
    → 若 ABRT 被 ignore：可能改 SIGKILL / BRK（待证）
```

并行：

- `AppSecurityManager.handle*Callback`（Xposed 已拦）
- `openSecurityUrl` Root FAQ（已拦）
- `UnhandledEvent` → `finishAllActivityAndKillApp`（已 hook）
- ForceExitCountdown（已 hook）
- TigerTally / SecurityGuard `JNICLibrary.doCommand`（当前 stub，可能过度）

## 静态 SO

`libtngdigital_ewallet.so`（~7.7MB，打包态）：

- `brk` 假阳性/加密指令很多（imm 离散）
- 真实 `svc #0` 极少；运行时解密后才出现 exit 序列
- **禁止**在 `JNI_OnLoad` 前/中 patch SO（会 Bad JNI / SIGILL）

## 已验证无效/有害手段

- seccomp 拦 `exit_group` → Promon 改 UDF/SIGILL
- 改 libc exit SVC→RET → 同上
- 改 Promon SO 字节 → Bad JNI / SIGILL
- 高频 `sigaction` 重装 → 易被当成 hook 指纹

## 较有效手段

- Xposed：拦 FAQ / KillApplicationHandler / handle*Callback / ForceExit / UnhandledEvent
- Xposed：`bl#a/#b` **beforeHook short-circuit**（避免跑进 native 杀进程）
- Zygisk：PLT 观察 + `SIGABRT` ignore（对 SI_USER 理论有效；Promon 可能复位 handler）

## 新发现（2026-07-31 续）

### `libtiger_tally.so`（~4.6MB）
- 与 Promon `libtngdigital_ewallet.so` **并行加载**
- 动态依赖：`abort@LIBC`、`signal@LIBC`（**走 PLT**，可被 Zygisk PLT hook）
- 内嵌少量 syscall stub（openat/read/faccessat…），**无** kill/exit stub
- `BIND_NOW`

### 打包态 SO
- `libtngdigital_ewallet.so` / `libtiger_tally.so` 静态 **0** 处 `movz x8,#129 + svc`
- 自杀用的 inline `kill` 仍可能在 **运行时解密** 后出现 → Zygisk **延迟 2s** 扫描 patch

### 日志结论（2026-07-31 11:37–11:47）

| 现象 | 含义 |
|------|------|
| `exited cleanly (1)` | inline `exit_group(1)`（PLT 拦不住） |
| kill SVC→RET 后 `signal 9` | SO 完整性/备用路径 → **SIGKILL** |
| 过早 patch exit_group | 启动即崩（CEM） |
| seccomp 拦 `exit`+`exit_group` | ~1s 死（误伤线程 exit） |
| seccomp **只拦 exit_group** | 存活 **~16s**，随后 **SIGILL 风暴**（count 7000+） |
| `caught sig=4 si_code=1` | Promon UDF 兜底；+4 skip 无效 |

### Rest 配置（2026-07-31 12:55，已装机）

| 层 | 策略 |
|----|------|
| Zygisk | PLT 拦 exit/abort/kill；**exit_group-only seccomp @2s**；**禁止**改 SO（会 SIGKILL） |
| 信号 | ABRT ignore；SEGV/ILL **+4 skip**；**不** freeze 线程（freeze 会 ANR） |
| Xposed | Splash `reportFullyDrawn` + **2.5s 强拉 UserLogin** + finish Splash；bl SC / 自杀 Java / JNIC stub |

实测：进程 **≥40s** 存活，焦点 `UserLoginActivity`；`phase done seccomp=1 caught=0`。  
注意：点亮屏幕后再开 App（`svc power stayon true`）；勿把 TNG 放进 Magisk DenyList。
