feat: MariBank 风控 bypass、澳洲银行 Hook 与 reverse 逆向工作区

新增 MariBank/SeaBank PH Root 与 SHPSSDK bypass、riskToken 净化及 Up/Suncorp/ubank 消息 Hook;整理 reverse/ 脚本与 Frida 工具链,并补充当日工作说明文档。
This commit is contained in:
2026-07-03 17:15:16 +08:00
parent 125dfe583b
commit 59970a84a8
121 changed files with 7606 additions and 37 deletions

134
docs/BANK_REVERSE.md Normal file
View File

@@ -0,0 +1,134 @@
# 澳大利亚银行 App 逆向报告
从 Pixel 6 设备拉取 APK2026-07-02用 DEX 字符串扫描 + 类名分析确定 Hook 点。
APK 位置(本地,未入库):`reverse/apks/*-base.apk`
---
## 1. 包名与架构
| App | 包名 | 技术栈 | 推送方案 |
|-----|------|--------|----------|
| **Up** | `au.com.up.money` | React Native | 原生 `HandlerService` + RN Firebase |
| **Suncorp** | `au.com.suncorp.marketplace` | Kotlin 原生 | `SuncorpMessagingService` (FCM) |
| **ubank** | `au.com.bank86400` | Capacitor (Web) | MoEngage + Capacitor FCM 插件 |
---
## 2. Hook 点(已实现)
### Up Bank
| 路径 | 类 | 方法 |
|------|-----|------|
| **FCM 主路径** | `au.com.up.money.notifications.HandlerService` | `onMessageReceived(RemoteMessage)` |
| **前台兜底** | `android.app.NotificationManager` | `notify(...)` |
相关类DEX 中发现):
- `au.com.up.money.notifications.handlers.NotificationHandler`
- `au.com.up.money.notifications.Util$NotificationType`
- `Lio/invertase/firebase/messaging/ReactNativeFirebaseMessagingService`RN 层,已由 HandlerService 覆盖)
### Suncorp Bank
| 路径 | 类 | 方法 |
|------|-----|------|
| **FCM 主路径** | `au.com.suncorp.marketplace.base.application.SuncorpMessagingService` | `onMessageReceived(RemoteMessage)` |
| **前台兜底** | `NotificationManager.notify` | extras 取 title/text |
相关:
- `FirebaseService.registerPushNotification`
- `BankingPaymentNotification` / `incomingPaymentNotification`
- `NotificationDetailsPresenter` / `NotificationDetailsActivity`
### ubank
| 路径 | 类 | 方法 |
|------|-----|------|
| **MoEngage FCM** | `com.moengage.firebase.MoEFireBaseMessagingService` | `onMessageReceived(RemoteMessage)` |
| **Capacitor FCM** | `io.capawesome.capacitorjs.plugins.firebase.messaging.MessagingService` | `onMessageReceived(RemoteMessage)` |
| **前台兜底** | `NotificationManager.notify` | extras |
日志字符串:`onMessageReceived() : Will try to show push``Not a MoEngage Payload`
---
## 3. 源码位置xposed-module
| 文件 | 说明 |
|------|------|
| `hook/UpBankMessageHook.java` | Up 专用 |
| `hook/SuncorpBankMessageHook.java` | Suncorp 专用 |
| `hook/UbankMessageHook.java` | ubank 专用 |
| `hook/BankHookHelper.java` | RemoteMessage / Notification 解析、去重 |
| `hook/BankNotificationHook.java` | 三家共用的 notify 兜底 |
日志 source 标识:
- `xposed_up` / `xposed_up_notify`
- `xposed_suncorp` / `xposed_suncorp_notify`
- `xposed_ubank` / `xposed_ubank_notify`
---
## 4. 数据提取逻辑
### RemoteMessageFCM
1. `getNotification().getTitle()` / `getBody()`
2. 若 body 为空 → 拼接 `getData()` 键值对
### Notification前台兜底
`extras` 读取:
- `EXTRA_TITLE` / `EXTRA_TEXT`
- `EXTRA_BIG_TEXT`
- `gcm.n.title` / `gcm.n.body`
---
## 5. 安装与验证
```powershell
powershell -ExecutionPolicy Bypass -File scripts\install-full.ps1
```
1. notiMessage **应用列表** 添加三家银行
2. LSPosed 作用域勾选:**银行 App + notiMessage + xposed 模块**
3. 强制停止银行 App 后重开
4. 测试:
```powershell
adb logcat | findstr /i "notiMessageHook/Bank notiMessageHook/Up notiMessageHook/Suncorp notiMessageHook/ubank HookMessageReceiver"
```
| 场景 | 期望 |
|------|------|
| 银行 App **前台** 收到推送 | `[Hook/xposed_up]` 等 |
| 银行 App **后台** 弹通知 | 通知通道 或 `xposed_*_notify` |
---
## 6. 限制与后续
- 银行可能 **不在通知里显示金额**安全策略Hook 也只能拿到 App 愿意展示的内容
- ubank 非 MoEngage 载荷会走 Capacitor 路径,需实测哪条触发
- 若 FCM 加密或仅静默同步,需再 Hook 业务层(如 `TransactionHistoryResponse`)——当前 DEX 未见稳定明文入库点
- 逆向脚本:`reverse/scripts/scan_dex.py``reverse/scripts/scan_target.py`
---
## 7. 复现逆向
```powershell
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
# 拉 base.apk
& $adb shell pm path au.com.up.money
& $adb pull <path> reverse/apks/up-base.apk
# 扫描
python reverse/scripts/scan_dex.py reverse/extracted
```

248
docs/WORKLOG_2026-07-03.md Normal file
View File

@@ -0,0 +1,248 @@
# 工作说明 — 2026-07-03
本文档汇总 **2026 年 7 月 3 日**`notiMessage` 项目上围绕 **MariBank / SeaBank PH 注册与风控绕过** 所完成的分析、实现、测试与仓库整理工作。
---
## 1. 当日目标
在已 Root 的 Pixel 6Magisk + Zygisk + LSPosed对菲律宾 MariBank App 完成:
1. 绕过本地 Root / 设备风控,进入注册流程;
2. 输入手机号并点击 **Next**,完成 `POST /uapi/v2/register` 注册请求。
**目标 App**
| 项 | 值 |
| --- | ------------------------- |
| 包名 | `ph.seabank.seabank` |
| 显示名 | MariBank |
| 版本 | 3.22.0versionCode 32200 |
---
## 2. 核心结论(当日最终状态)
| 层级 | 状态 | 说明 |
| --------------- | ----------- | ------------------------------------------------------------------------------------------- |
| 本地 Root 弹窗 / 自杀 | **已基本绕过** | 可进入首页与手机号输入页 |
| DFP 上报 | **成功** | `POST /dfp/v1/data/report` 返回 `code=0` |
| riskToken 尾部净化 | **Hook 生效** | `|09|1``|00|0`logcat 可见) |
| 注册接口 | **仍失败** | `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 尾部 `|09|1``|00|0` |
| `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 环境
- PCFrida **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 | **停试**:已失败号码/设备冷却 **2448h**,避免加重 `4067012` |
| 6 | **官方解封**(+632) 8424 8050 |
---
## 10. 相关文档与路径索引
| 文档 / 路径 | 说明 |
| ---------------------------------- | ----------------------------------- |
| `docs/BANK_REVERSE.md` | 澳大利亚三家银行 HookUp / 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*