# MariBank 新加坡版逆向报告

> **日期**：2026-07-06  
> **设备**：Pixel 6（已 Root + LSPosed + ADB 开启）  
> **APK 来源**：从本机 pull，`reverse/apks/maribank_sg_*.apk`

---

## 1. 基本信息

| 项 | 值 |
|----|-----|
| **包名** | `sg.com.maribankmobile.digitalbank` |
| **显示名** | MariBank（新加坡） |
| **版本** | 3.2.2（versionCode **30220**） |
| **对比 PH 版** | `ph.seabank.seabank` · v3.22.0 (32200) |
| **API 域名** | `https://api.maribank.com.sg`（staging: `api.staging.maribank.com.sg`） |
| **Application** | `com.shopee.bke.digitalbank.BkeApplication`（与 PH **相同**） |

本地 APK：

```
reverse/apks/maribank_sg_base.apk
reverse/apks/maribank_sg_arm64.apk   → SO 在 reverse/extracted/native/
```

---

## 2. 截图现象（你当前遇到的）

启动后出现 **两层拦截**：

| 现象 | 类型 | 说明 |
|------|------|------|
| 全屏 **「ADB/Wireless ADB Detected」** | 环境检测页 | 文案 key：`bke_title_adb_wirelessadb_control`、`bke_btn_turn_off_adb_wireless_adb` |
| Toast **「Does not support root device」** | Root 检测 | SHPSSDK / SafeMode 典型提示 |

**含义**：

1. **ADB 检测** 与 **Root 检测** 是 **独立项**——新加坡版在 PH 版基础上 **明显加强了 USB/无线调试检测**。  
2. 状态栏 **VPN 小钥匙** 可能额外触发 `RISK_*` 或网络风控（需 logcat 确认）。  
3. 当前 **PH 版 Xposed Hook 未作用到 SG 包名**（只 Hook `ph.seabank.seabank`），所以 SG 版 **完全未 bypass**。

**临时验证（无 Hook）**：关闭 **USB 调试 + 无线调试** 后冷启动，可确认 ADB 页是否消失；Root Toast 仍会存在。

---

## 3. 技术栈对比（SG vs PH）

| 组件 | SG 3.2.2 | PH 3.22.0 | 结论 |
|------|----------|-----------|------|
| Shopee BKE | ✅ | ✅ | 同框架 |
| `BkeApplication` | ✅ | ✅ | Hook 时机相同（`attachBaseContext` 后） |
| SafeMode | `com.shopee.bke.lib.safemode.b` 等 | 相同 | 可复用 boolean Hook |
| `SafeModeRecoverActivity` | ✅ | ✅ | Root 弹窗/恢复页 |
| SHPSSDK Bank | `com.shopee.shpssdkbank.SHPSSDK` | 相同 | 可复用 riskToken / requestDefense 链 |
| Native SO | `libshpssdk_bank.so`、`libsdkutils.so`、`libbkutils.so` | 相同 | SG 额外有 **`libshpssdk.so`** |
| 字符串解密 | `uvuwwuvwv.uvwwuuvvw` | 相同 | 混淆包名可能不同 |

**结论**：SG 与 PH 是 **同一套 Shopee 银行 SDK**，PH 上已写的 Hook **大部分可迁移**，需改 **包名** 并 **补充 ADB 风控**。

---

## 4. 新加坡版新增：ADB / 无线调试检测

### 4.1 SHPSSDK 风险常量（DEX 内）

```
RISK_USB_ADB          ← USB 调试
RISK_WIFI_ADB         ← 无线调试
RISK_ADB
RISK_ROOT
RISK_HOOK
RISK_DEBUG
RISK_DEVELOPER_MODE
RISK_EMULATOR
...
```

与截图中 **ADB 拦截页 + Root Toast** 对应。

### 4.2 UI 字符串（资源 key）

| Key | 用途 |
|-----|------|
| `bke_title_adb_wirelessadb_control` | 标题「ADB/Wireless ADB Detected」 |
| `bke_btn_turn_off_adb_wireless_adb` | 按钮「Turn Off ADB/Wireless ADB」 |
| `bke_desc_explain_detect_adb_1/2` | 说明文案 |
| `bke_desc_safeguard_bank_app_from_adb_wirelessadb_1/2` | 安全说明 |
| `AdbDetected` / `WifiAdbDetected` | RN / 业务路由标识 |

### 4.3 检测思路（推断）

1. **Settings.Global** / `adb_enabled`、无线调试相关属性  
2. SHPSSDK `getRiskSync` → 命中 `RISK_USB_ADB` / `RISK_WIFI_ADB`  
3. 进入 **ADB 专用拦截 UI**（非仅 SafeModeRecoverActivity）  
4. Root 仍走 `RISK_ROOT` → Toast「Does not support root device」

---

## 5. API 与登录（SG）

PH 实测重点为 `POST /uapi/v2/register`；SG DEX 内可见：

| 类型 | 路径示例 |
|------|----------|
| 登录 | `/v3/login`、`/v4/login`、`/v2/login/bke/linkage` |
| 注册 | `/v2/register` |
| 登录前 | `/v1/list/latest-notice/pre-login` |
| 人脸 | `/v3/login/facial/verification` |
| DFP | `/dfp/`（与 PH 同类） |
| 通用 uapi | `/uapi/`（47 处引用） |

**Host**：`https://api.maribank.com.sg`（非 PH 的 `api.seabank.ph`）。

---

## 6. Native 库（arm64 split）

已从 `maribank_sg_arm64.apk` 解出至 `reverse/extracted/native/`，与风控相关：

| SO | 大小（约） | 作用 |
|----|-----------|------|
| `libshpssdk_bank.so` | 8.5 MB | SHPSSDK 银行风控、riskToken |
| `libshpssdk.so` | 6.3 MB | **SG 额外**（PH 侧以 bank 为主） |
| `libsdkutils.so` | 789 KB | 注册/body 加密 |
| `libbkutils.so` | 102 KB | JNI 工具 |
| `libmemory_security.so` | 3.8 MB | 内存/安全相关 |

---

## 7. 与现有 Xposed 模块的关系

当前 `MariBankRootBypassHook` / `MariBankShpsNativeHook` **仅绑定**：

```java
public static final String PACKAGE = "ph.seabank.seabank";
```

**SG 包名未纳入**，因此截图中的拦截 **预期行为**。

### 7.1 可复用（改包名即可试）

- SafeMode boolean Hook（`safemode.b` 等）  
- `Process.killProcess` / `finishAffinity` 反自杀  
- `/proc/self/maps` 过滤、`SystemProperties` 伪装  
- SHPSSDK `getRiskSync` 清空、`getRiskToken` 净化  
- OkHttp 出站 riskToken 净化  

**已实现（2026-07-06）**：`MariBankRootBypassHook` 已支持 `sg.com.maribankmobile.digitalbank`，含 ADB Settings 伪装、ADB 全屏页 finish、Root/ADB Toast 拦截。

### 7.2 SG 专用（已部分实现）

| 项 | 状态 |
|----|------|
| **包名** | ✅ `MainHook` + `arrays.xml` |
| **ADB 风险** | ✅ `Settings.Global/Secure` adb 键 → 0；`init.svc.adbd` → stopped |
| **ADB 拦截页** | ✅ `Activity.onResume` 检测 ADB 文案后 `finish()` |
| **Root Toast** | ✅ 「Does not support root device」 |

### 7.3 不建议照搬 PH 服务端结论

PH 的 **4067012** 是 **菲律宾服务端** 结论；SG 需单独测 `api.maribank.com.sg`。

---

## 8. 逆向脚本

```powershell
# 已从手机 pull APK 后可本地扫描
python reverse/scripts/scan_maribank_sg.py
python reverse/scripts/find_sg_adb_strings.py
python reverse/scripts/find_sg_adb_classes.py
python reverse/scripts/list_safemode.py reverse/apks/maribank_sg_base.apk
```

从手机 pull（已执行过）：

```powershell
adb shell pm path sg.com.maribankmobile.digitalbank
adb pull <base.apk> reverse/apks/maribank_sg_base.apk
```

---

## 9. 建议下一步（2026-07-06 更新）

1. ~~LSPosed 增加 SG 包名~~ ✅ 已完成  
2. ~~扩展 ADB bypass~~ ✅ 已完成  
3. **SG**：diff PH/SG register 明文；修复 ProcessBuilder 异常；仍 3100012 则试干净机  
4. **PH**：走完 OTP → 开户全流程，确认稳定性  
5. logcat：`MariBankEncrypt in0 byte`、`3100012`、`OTP_SMS`  

---

## 10. 实测状态（2026-07-06）

| 包 | 注册 API | 结果 |
|----|----------|------|
| `ph.seabank.seabank` | `api.seabank.ph/uapi/v2/register` | ✅ **code=0 → OTP** |
| `sg.com.maribankmobile.digitalbank` | `api.maribank.com.sg/uapi/v2/register` | ❌ **3100012** |

完整说明：[`MariBank_2026-07-06_菲律宾突破.md`](MariBank_2026-07-06_菲律宾突破.md)

---

## 11. 相关文档

| 文档 | 说明 |
|------|------|
| [`MariBank_2026-07-06_菲律宾突破.md`](MariBank_2026-07-06_菲律宾突破.md) | **PH OTP 突破 + SG 现状 + 方案 B** |
| [`MariBank实现说明.md`](MariBank实现说明.md) | PH Hook 实现与问题清单 |
| [`工作日志_2026-07-03.md`](工作日志_2026-07-03.md) | PH 版 7/3 工作记录 |

---

*记录日期：2026-07-06 · 最后更新：菲律宾 OTP 突破*
