249 lines
10 KiB
Markdown
249 lines
10 KiB
Markdown
# 2026-07-03
|
||
|
||
本文档汇总 **2026 年 7 月 3 日** 在 `notiMessage` 项目上围绕 **MariBank / SeaBank PH 注册与风控绕过** 所完成的分析、实现、测试与仓库整理工作。
|
||
|
||
---
|
||
|
||
## 1. 当日目标
|
||
|
||
在已 Root 的 Pixel 6(Magisk + Zygisk + LSPosed)上,对菲律宾 MariBank App 完成:
|
||
|
||
1. 绕过本地 Root / 设备风控,进入注册流程;
|
||
2. 输入手机号并点击 **Next**,完成 `POST /uapi/v2/register` 注册请求。
|
||
|
||
**目标 App**
|
||
|
||
|
||
| 项 | 值 |
|
||
| --- | ------------------------- |
|
||
| 包名 | `ph.seabank.seabank` |
|
||
| 显示名 | MariBank |
|
||
| 版本 | 3.22.0(versionCode 32200) |
|
||
|
||
|
||
---
|
||
|
||
## 2. 核心结论(当日最终状态)
|
||
|
||
|
||
| 层级 | 状态 | 说明 |
|
||
| --------------- | ----------- | ------------------------------------------------------------------------------------------- |
|
||
| 本地 Root 弹窗 / 自杀 | **已基本绕过** | 可进入首页与手机号输入页 |
|
||
| DFP 上报 | **成功** | `POST /dfp/v1/data/report` 返回 `code=0` |
|
||
| riskToken 尾部净化 | **Hook 生效** | ` |
|
||
| 注册接口 | **仍失败** | `POST /uapi/v2/register` → `**4067012`**(亦见 `4067004`) |
|
||
| 服务端文案 | 账户安全临时封锁 | 「For your account's security, this service has been temporarily blocked...」(+632) 8424 8050 |
|
||
|
||
|
||
**判断**:本地 bypass 已推进到 DFP 层,但 **服务端仍拒绝注册**。原因可能包括:加密 DFP 载荷校验、设备指纹黑名单、号码/设备组合风控,而非单纯 riskToken 尾部字段。改 token 尾部 **不足以** 通过注册。
|
||
|
||
---
|
||
|
||
## 3. Xposed 模块实现(`xposed-module`)
|
||
|
||
### 3.1 新增 / 主要 Hook 文件
|
||
|
||
|
||
| 文件 | 作用 |
|
||
| ---------------------------------- | ------------------------------------------------------------ |
|
||
| `hook/MariBankRootBypassHook.java` | SafeMode、SHPSSDK、OkHttp 出站净化、4067 错误日志、Root 自杀拦截 |
|
||
| `hook/MariBankShpsNativeHook.java` | `/proc` 过滤、native-core、boot 属性伪装、`requestDefense` 等 native 层 |
|
||
| `hook/MariBankRiskTokenUtil.java` | riskToken / deviceToken 尾部 ` |
|
||
| `MainHook.java` | 对 `ph.seabank.seabank` 加载上述 Hook(先 early proc,再 deferred) |
|
||
|
||
|
||
### 3.2 关键逆向结论(已写入 Hook)
|
||
|
||
|
||
| 能力 | 真实类 / 库 |
|
||
| -------------- | ------------------------------------------------------- |
|
||
| riskToken 生成链 | `vvuuuuvvv.wwvuwuwvu(Context)`(classes11.dex) |
|
||
| SoUtils | `com.shopee.bke.lib.jni.utils.f`(log tag `SoUtils`) |
|
||
| Native 加密包装 | `com.shopee.bke.lib.jni.utils.d` → native `uvwuvwuv` |
|
||
| SHPSSDK native | `libshpssdk_bank.so`;`wvvvuwwu.vvuwuuvuu` → `wwvwvwuvv` |
|
||
| 字符串解密 | `uvuwwuvwv.uvwwuuvvw.uvuwwwuwu(hex, key)` |
|
||
|
||
|
||
### 3.3 明确避免 Hook 的点(实测会崩)
|
||
|
||
- `**RealInterceptorChain.proceed`**:SO 硬编码检测,Hook 后易触发风控或异常。
|
||
- `**ShpssInstall` / `vuvuwwwuw`**:干扰 `SoUtils.loadSoLibrary`,导致 `libsdkutils` 加载死循环 **白屏**。
|
||
|
||
### 3.4 注册请求体
|
||
|
||
- register body 为 **native 加密**,Java 层 Hook 常见日志:`register request body unreadable (encrypted or one-shot)`。
|
||
- 当日 **未** 在 logcat 中抓到 register 明文 JSON。
|
||
|
||
---
|
||
|
||
## 4. 逆向与静态分析(`reverse/`)
|
||
|
||
### 4.1 已完成
|
||
|
||
- 从设备 pull split APK / base APK,提取 `libsdkutils.so`、`libshpssdk_bank.so`、`libbkutils.so` 等至 `reverse/extracted/native/`。
|
||
- 编写并运行大量 DEX/APK 扫描脚本(scan / dump / find 系列),定位:
|
||
- SHPSSDK、SafeMode、注册 API、4067 错误上下文;
|
||
- JNI 目标与加密类继承关系。
|
||
- 脚本:`reverse/frida/pull_split_apk.ps1`、`reverse/scripts/extract_all_so.py` 等。
|
||
|
||
### 4.2 主要 native / 加密链路
|
||
|
||
```
|
||
register 请求
|
||
→ NativeEncryptUtilsWrapper (utils.d)
|
||
→ native uvwuvwuv (libsdkutils.so / libbkutils.so)
|
||
→ 加密 body + riskToken / deviceToken
|
||
→ POST https://api.seabank.ph/uapi/v2/register
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Frida 动态分析
|
||
|
||
### 5.1 环境
|
||
|
||
- PC:Frida **17.15.3**;手机:`/data/local/tmp/frida-server`
|
||
- 脚本:`reverse/frida/trace_maribank_register.js`
|
||
- 运行器:`run_frida_trace.py`(attach / spawn)、`run_spawn_trace.py`、`start-mari-trace.ps1`
|
||
|
||
### 5.2 遇到的问题
|
||
|
||
|
||
| 模式 | 现象 |
|
||
| ---------- | ---------------------------------------------------------------------- |
|
||
| **attach** | 长时间 `Java.available == false`,Java Hook 无法安装;进程名需用 **MariBank** 而非包名查找 |
|
||
| **spawn** | native `dlopen` 可 hook,但 Java 层 `Java is not defined` / 线程相关异常 |
|
||
| CLI spawn | 无 `--no-pause` 时 session 立即退出;需 Python runner 保活 |
|
||
|
||
|
||
### 5.3 当日 Frida 结论
|
||
|
||
- **未抓到** 有效的 `/register` 明文 body 或完整 HTTP 链日志。
|
||
- MariBank 对 Frida 有较强干扰;**当日有效证据主要来自 LSPosed logcat**,而非 Frida trace。
|
||
|
||
---
|
||
|
||
## 6. Logcat 实测摘要(LSPosed 生效)
|
||
|
||
**测试号码示例**:`9178854266`、`9133477799`、`9171243667` 等(均失败)。
|
||
|
||
**典型成功链路**
|
||
|
||
```text
|
||
POST /dfp/v1/data/report → {"code":0,...}
|
||
riskToken sanitized ... -> |00|0
|
||
```
|
||
|
||
**典型失败链路**
|
||
|
||
```text
|
||
POST /uapi/v2/register
|
||
→ {"code":4067012,"msg":"For your account's security, this service has been temporarily blocked..."}
|
||
```
|
||
|
||
**其他日志**
|
||
|
||
- `wvvvuwwu.vuwuuwvw` native 实现未找到(可能与 LSPosed / 环境冲突有关)。
|
||
- Root 检测触发 `killProcess` 时被 `blocked finish` 拦截,表现为短暂异常后仍可继续使用。
|
||
|
||
**推荐 logcat 过滤**
|
||
|
||
```powershell
|
||
powershell -File scripts\logcat-maribank.ps1 -Follow
|
||
# 或
|
||
adb logcat -s notiMessageHook/MariBankRoot:V MB-TRACE:V
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 构建与安装脚本
|
||
|
||
|
||
| 脚本 | 用途 |
|
||
| ------------------------------ | ------------------------------------ |
|
||
| `scripts/build-debug.ps1` | 构建主 App + xposed-module debug APK |
|
||
| `scripts/install-debug.ps1` | 安装双 APK |
|
||
| `scripts/install-frida.ps1` | PC + 手机 frida-server |
|
||
| `scripts/start-mari-trace.ps1` | 启动 Frida attach + MariBank 相关 logcat |
|
||
| `scripts/logcat-maribank.ps1` | 过滤 MariBank / Hook 日志 |
|
||
| `scripts/organize-reverse.ps1` | 整理 `reverse/` 目录(可重复执行) |
|
||
|
||
|
||
LSPosed 作用域需勾选:**MariBank + notiMessage + xposed 模块**。
|
||
|
||
---
|
||
|
||
## 8. 仓库整理
|
||
|
||
### 8.1 问题
|
||
|
||
`reverse/` 根目录堆积 **70+ Python 脚本**、临时 `.dex`、解压 APK(约 **2.2 GB / 7 万+ 文件**),IDE 与 `git status` 显得极乱。
|
||
|
||
### 8.2 新目录结构
|
||
|
||
```
|
||
reverse/
|
||
├── README.md
|
||
├── scripts/ # 逆向 Python 脚本(71 个,含 _paths.py)
|
||
├── frida/ # Frida 脚本与运行器
|
||
├── apks/ # APK / zip(不入库)
|
||
├── extracted/ # 解压、dex dump、.so(不入库)
|
||
├── output/ # 分析报告 *.txt
|
||
├── logs/ # 运行日志
|
||
│ └── frida/ # trace / logcat
|
||
└── tmp/ # 临时 *.dex(不入库)
|
||
```
|
||
|
||
### 8.3 同步修改
|
||
|
||
- **44 个** 脚本内路径改为相对 `reverse/` 根(`apks/`、`extracted/`、`tmp/`、`output/`)。
|
||
- Frida 日志输出改到 `reverse/logs/frida/`。
|
||
- 更新 `.gitignore`、`docs/BANK_REVERSE.md`、`pull_split_apk.ps1`、`start-mari-trace.ps1`。
|
||
- `apk_extract/` 迁入 `extracted/apk_extract/`;`seabank.zip` 迁入 `apks/`。
|
||
|
||
---
|
||
|
||
## 9. 后续建议(未在当日完成)
|
||
|
||
|
||
| 优先级 | 方向 |
|
||
| --- | -------------------------------------------------------------------- |
|
||
| 1 | **对照实验**:未 Root 干净机 + 菲律宾 IP + 新号码,区分设备封禁 vs 号码封禁 |
|
||
| 2 | **Native 明文**:Hook `libsdkutils` / `utils.d` 包装层,抓 register 加密前 body |
|
||
| 3 | **riskToken 全链**:在 `vvuuuuvvv.wwvuwuwvu` 最早出口做更深层净化(含加密段) |
|
||
| 4 | **Frida**:换未被检测环境,或仅 attach 已运行进程;当前 MariBank 上 Java 桥不稳定 |
|
||
| 5 | **停试**:已失败号码/设备冷却 **24–48h**,避免加重 `4067012` |
|
||
| 6 | **官方解封**:(+632) 8424 8050 |
|
||
|
||
|
||
---
|
||
|
||
## 10. 相关文档与路径索引
|
||
|
||
|
||
| 文档 / 路径 | 说明 |
|
||
| ---------------------------------- | ----------------------------------- |
|
||
| `docs/MARIBANK_IMPLEMENTATION.md` | **MariBank 实现细节与问题记录(专文)** |
|
||
| `docs/BANK_REVERSE.md` | 澳大利亚三家银行 Hook(Up / Suncorp / ubank) |
|
||
| `docs/HOOK_GUIDE.md` | 通用 Hook 架构与扩展 |
|
||
| `docs/CHANGELOG.md` | 主 App / TG Hook 版本历史 |
|
||
| `reverse/README.md` | 逆向工作区目录说明 |
|
||
| `reverse/frida/jni_targets.md` | JNI Hook 目标备忘 |
|
||
| `xposed-module/.../MariBank*.java` | MariBank bypass 实现 |
|
||
|
||
|
||
---
|
||
|
||
## 11. 当日工作清单(摘要)
|
||
|
||
- [x] MariBank Root / SHPSSDK / SafeMode Xposed bypass 实现与迭代
|
||
- [x] riskToken 尾部净化与 OkHttp 出站拦截
|
||
- [x] DEX / SO / JNI 静态逆向与脚本沉淀
|
||
- [x] Frida trace 脚本与 attach/spawn 运行器(受 App 反 Frida 限制)
|
||
- [x] LSPosed logcat 分析,确认 **4067012** 为服务端拒绝
|
||
- [x] `reverse/` 目录整理与 `.gitignore` 更新
|
||
- [ ] 注册成功(**未完成**,阻塞于服务端风控)
|
||
|
||
---
|
||
|
||
*记录日期:2026-07-03* |