# MariBank 菲律宾注册突破 & 新加坡现状（2026-07-06）

> **设备**：Pixel 6（`1C081FDF600K5Q`）· Magisk 30.7 + Zygisk + LSPosed  
> **结论**：**菲律宾 SeaBank 已能发 OTP**；**新加坡 MariBank 仍 3100012**  
> **关联**：[`MariBank实现说明.md`](MariBank实现说明.md) · [`MariBank新加坡逆向.md`](MariBank新加坡逆向.md)

---

## 1. 结果一览

| 地区 | 包名 | API | 注册结果 | 错误码 |
|------|------|-----|----------|--------|
| **菲律宾** | `ph.seabank.seabank` | `https://api.seabank.ph` | ✅ **成功 → OTP 短信** | `code=0` |
| **新加坡** | `sg.com.maribankmobile.digitalbank` | `https://api.maribank.com.sg` | ❌ 仍失败 | **3100012** |

**关键意义**：同一台 Root 机、同一套 Xposed + Magisk 伪装下，**PH 服务端已放行注册**，说明 Hook 链与 attestation 载荷 **对 PH 有效**；SG 失败更可能是 **区域风控策略差异** 或 **SG 侧设备黑名单**，而非「Root  bypass 完全无效」。

---

## 2. 测试环境

| 项 | 值 |
|----|-----|
| 手机 | Google Pixel 6（oriole） |
| Root | Magisk **30.7**（`MAGISK:R`） |
| Magisk 模块 | `maribank_device_spoof`、`zygisk_shamiko`、`playintegrityfix`、`zygisk_vector` |
| DenyList | MariBank PH/SG 均已加入；**Enforce DenyList = OFF**（Shamiko 要求） |
| LSPosed 模块 | `com.miraclegarden.smsmessage.xposed` |
| LSPosed 作用域 | `ph.seabank.seabank`、`sg.com.maribankmobile.digitalbank` 等 |
| 伪装 serial | `Y1Rr2fxhOI0ZCQSb`（resetprop + Magisk 模块） |
| 伪装 android_id | `87ec910ab5d6f423` |
| 对照干净机 | `25078RA3EY`：关 USB 调试可进 SG OTP（无 LSPosed） |

---

## 3. 菲律宾突破 — log 证据（2026-07-06 13:40）

### 3.1 第一次 register（step=BE）

```text
POST https://api.seabank.ph/uapi/v2/register
```

加密前明文（`MariBankEncrypt in0 byte[1180]`）核心字段：

```json
{
  "cyCode": "63",
  "phone": "<RSA 加密>",
  "rdVerifyInfo": {
    "bioStatus": 0,
    "data": "tPNHr/0eZzaPXs9oimvMNVWI/...",
    "dataKey": "H/A6AqA8NhXZoaL0alG5VGRovcfuJykY92U...",
    "deviceFingerprint": "jrKyNF/Fx4gcnzVpf1u9bw==|WJMksio9SaKKuyk1KMSilUGivdF+SHbqjB+aL65fucQcOCdojhBN3GKoY58sxVomiCfi5w==|TXeh8FyEf/8qHdAS|00|0",
    "afExtInfo": { "modeInCall": "N", "modeInCommunication": "N", "modeCallScreening": "N" }
  },
  "scene": "REGISTRATION",
  "step": "BE",
  "source": "app"
}
```

服务端响应：

```json
{"code":0,"msg":"success","data":{"scene":"REGISTRATION","step":"BSO","tranId":"7f21098a-2113-40fb-bb6a-e2e651460f53",...}}
```

### 3.2 第二次 register（OTP 触发，step=BSO）

```json
{
  "cyCode": "63",
  "rdVerifyInfo": {
    "action": "OTP_SMS_TRIGGER",
    "deviceFingerprint": "jrKyNF/...|00|0",
    "operationId": "61f9bcc6-dc0c-4f3d-8566-e1d3dc02653f1783316458430"
  },
  "scene": "REGISTRATION",
  "step": "BSO",
  "tranId": "7f21098a-2113-40fb-bb6a-e2e651460f53"
}
```

响应仍为 **`code=0`** → **App 可发验证码**。

### 3.3 与 7 月 3 日对比

| 日期 | PH register | 说明 |
|------|-------------|------|
| 2026-07-03 | ❌ 4067012 | 仅 riskToken 尾部净化，无加密前 Hook |
| 2026-07-06 | ✅ code=0 → OTP | 加密前 Hook + Attestation Hook + 方案 B 换 ID + Shamiko |

---

## 4. 新加坡仍失败 — log 证据

### 4.1 典型失败（11:50，换 ID 前）

```text
POST https://api.maribank.com.sg/uapi/v2/register
→ {"code":3100012,"msg":"Unexpected error occurred. Please try again later. "}
```

加密前 `deviceFingerprint` 示例：

```text
X4Ln9cRV1v6aabPt4Ymnqw==|RmdlV34wu8nk8n9nj9A+32Z0BjF/29py3UVnqGWHBJRj5HuTmmOPX+pfJWkZBOn/n41pYw==|3ailMzmgCFzRDFGv|00|0
```

尾部 `\|00\|0` 已净化，**仍 3100012**。

### 4.2 SG 错误码含义（推断）

| 码 | 地区 | 文案 |
|----|------|------|
| 4067012 | PH | For your account's security, temporarily blocked... |
| 3100012 | SG | Unexpected error occurred. Please try again later. |

同属 **服务端风控拒绝**，非本地 Root 弹窗。

---

## 5. 已实现的 bypass 架构

### 5.1 分层模型

```
客户端本地层                     服务端层
─────────────────              ─────────────────
SafeMode Root 弹窗/自杀    →    （不决定 OTP，只决定能否进 App）
SG ADB 全屏拦截页          →
SHPSSDK assessRisk         →    解密 rdVerifyInfo.data/dataKey
riskToken / deviceFingerprint →  查 deviceHash 黑名单
Magisk resetprop 换 serial  →    区域策略（PH 松 / SG 严）
```

### 5.2 Xposed 模块文件

| 文件 | 作用 |
|------|------|
| `MariBankRootBypassHook.java` | SafeMode、SHPSSDK、ADB Settings、OkHttp 日志、4067/3100012 记录 |
| `MariBankShpsNativeHook.java` | `/proc` 过滤、SystemProperties、requestDefense 净化（不再 block） |
| `MariBankSdkUtilsHook.java` | 加密前 Hook `utils.d` / `uvwuvwuv` / Gson |
| `MariBankRegisterPayloadUtil.java` | `scene=REGISTRATION` JSON 净化 |
| `MariBankAttestationHook.java` | native 桥 attestation 链 + 环境探测拦截 |
| `MariBankRiskTokenUtil.java` | riskToken 尾部 `\|09\|1` → `\|00\|0` |

### 5.3 方案 B：Magisk 设备 ID 伪装

路径：`scripts/magisk/maribank-device-spoof/`

| 脚本 | 时机 | 内容 |
|------|------|------|
| `post-fs-data.sh` | 早期启动 | `resetprop` serial、boot 属性、关 adb 属性 |
| `service.sh` | 开机完成后 | 写入新 `Settings.Secure.android_id` |

PC 一键：

```powershell
.\scripts\maribank-spoof-device.ps1              # 一次性 resetprop
.\scripts\maribank-spoof-device.ps1 -InstallModule # 安装持久模块
.\scripts\maribank-scheme-b-finish.ps1             # LSPosed 作用域 + pm clear
```

### 5.4 Shamiko 配置要点

1. Magisk → 开启 **Zygisk**
2. **Configure DenyList** 开启 → 勾选 MariBank PH/SG 全部进程
3. **Enforce DenyList 必须关闭**（否则 Shamiko 不生效）
4. 安装 **Shamiko** 模块并重启

---

## 6. 为何 PH 能过、SG 不过（推断）

> **详细展开**（菲律宾真实原因、`afExtInfo`、USB 调试与 Hook）：见 [`MariBank风控与载荷说明.md`](MariBank风控与载荷说明.md) §4–§5。

| 维度 | PH ✅ | SG ❌ |
|------|-------|-------|
| 同一 deviceFingerprint 结构 | 有，尾部 `\|00\|0` | 有，尾部 `\|00\|0` |
| `data`/`dataKey` attestation | 服务端接受 | 服务端拒绝（3100012） |
| 测试次数 / 黑名单 | 较少失败记录 | Pixel 6 多次测 SG 注册 |
| API 风控强度 | 当日实测 **通过** | 当日实测 **拒绝** |
| 干净机对照 | 未详测 PH | 25078RA3EY 关 ADB 可 OTP |

**结论**：

1. **改 riskToken 尾部 alone 不够**，但加上 **加密前 Hook + Shamiko + 换 ID** 后 **PH 足够**。
2. SG 可能在 attestation 解密后仍有 **更严规则**（Play Integrity、设备信誉、区域黑名单）。
3. PH 成功 **不能** 直接类推 SG；需 **diff 两次 register 明文** 或 **换未测过 SG 的环境** 再试。

---

## 7. 已知问题与踩坑

| 问题 | 现象 | 处理 |
|------|------|------|
| Gson Hook 误报 | i18n 文案含 "register" 刷屏 | 已改为只匹配 `scene=REGISTRATION` |
| `requestDefense` 被 block | 缺 `x-sap-fixme` | 已改为执行后净化，不 block |
| ProcessBuilder 抛异常 | `which su` → SecurityException | **待修**：应返回空进程而非抛异常 |
| Magisk zip 在 Windows 打包 | 只解压 module.prop | 用 `tar -a -cf` 或 adb 手动 push sh |
| 关 USB 调试后 adb 断开 | 收尾脚本卡住 | `maribank-scheme-b-finish.ps1` 已加 60s 超时 |
| Attest native Hook 命中少 | 仅 8 个 hook | `data`/`dataKey` 仍未在 native 层改写 |

### 禁止操作（会导致白屏/崩溃）

- Hook `System.loadLibrary`（SG RN 崩溃）
- Hook `RealInterceptorChain.proceed`
- 过早 Hook `ShpssInstall` / `vuvuwwwuw`

---

## 8. 常用命令

```powershell
$adb = "C:\Users\Administrator\AppData\Local\Android\Sdk\platform-tools\adb.exe"

# 构建安装
.\scripts\build-debug.ps1
.\scripts\install-debug.ps1

# 抓注册 log（先 logcat -c，再点 Next）
& $adb logcat -d | Select-String "MariBankEncrypt  in0 byte\[1|MariBankRoot HTTP.*register|3100012|4067012|OTP_SMS"

# 验证伪装 ID
& $adb shell su -c "getprop ro.serialno; settings get secure android_id"
```

---

## 9. 新加坡后续建议

1. **用 PH 成功时的同一环境** 测 SG：关 USB 调试、`pm clear` SG 包、冷启动  
2. **diff PH vs SG** 加密前 register JSON（`deviceFingerprint` 段、`data` 长度与字段）  
3. 修复 **ProcessBuilder** 不抛异常，避免 SHPSSDK 检测 tamper  
4. 若仍 3100012：考虑 **未测过 SG 的干净机** 或 **native hook `libshpssdk_bank.so`**  
5. 菲律宾侧：继续走完 **OTP → 开户** 验证全流程稳定性  

---

## 10. 相关文档

| 文档 | 说明 |
|------|------|
| [`MariBank风控与载荷说明.md`](MariBank风控与载荷说明.md) | **register 字段、afExtInfo、USB 调试、PH 真实原因、Xposed/LSPosed** |
| [`手机操作手册.md`](手机操作手册.md) | **Root 机部署、LSPosed、日常操作、抓 log** |
| [`Hook指南.md`](Hook指南.md) | Xposed/LSPosed 概念、Telegram Hook、扩展 App |
| [`MariBank实现说明.md`](MariBank实现说明.md) | PH Hook 实现细节（含 7/3 失败记录，已追加 7/6 突破） |
| [`MariBank新加坡逆向.md`](MariBank新加坡逆向.md) | SG 逆向与 ADB 检测 |
| [`工作日志_2026-07-03.md`](工作日志_2026-07-03.md) | 7/3 工作记录 |

---

*记录日期：2026-07-06 · 最后更新：文档体系整理（操作手册 + 风控载荷说明）*
