feat: MariBank 风控 bypass、澳洲银行 Hook 与 reverse 逆向工作区
新增 MariBank/SeaBank PH Root 与 SHPSSDK bypass、riskToken 净化及 Up/Suncorp/ubank 消息 Hook;整理 reverse/ 脚本与 Frida 工具链,并补充当日工作说明文档。
This commit is contained in:
134
docs/BANK_REVERSE.md
Normal file
134
docs/BANK_REVERSE.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# 澳大利亚银行 App 逆向报告
|
||||
|
||||
从 Pixel 6 设备拉取 APK(2026-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. 数据提取逻辑
|
||||
|
||||
### RemoteMessage(FCM)
|
||||
|
||||
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
248
docs/WORKLOG_2026-07-03.md
Normal file
@@ -0,0 +1,248 @@
|
||||
# 工作说明 — 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 生效** | `|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 环境
|
||||
|
||||
- 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/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*
|
||||
Reference in New Issue
Block a user