# 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 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 突破*