Files
notiMessage/docs/MariBank风控与载荷说明.md
mars 81119e0ff9 feat(maribank): PH 注册 OTP 突破、SG bypass 与中文文档
菲律宾 SeaBank 在 Root+LSPosed+Shamiko 下 register 已通过并触发 OTP;扩展 SG 包名、加密前 Hook、Magisk 设备伪装脚本,并将 docs 整理为中文操作与风控说明。
2026-07-06 14:01:49 +08:00

6.8 KiB
Raw Blame History

MariBank 风控与注册载荷说明

客户端检测分层、register 请求字段含义、菲律宾突破原因、USB 调试与 Hook 关系。
关联:MariBank_2026-07-06_菲律宾突破.md · MariBank实现说明.md · 手机操作手册.md


1. 风控两层模型

层级 谁在做 失败表现 bypass 方式
客户端本地 SafeMode、SHPSSDK、SG ADB 页 弹窗、全屏拦截、自杀 Xposed boolean / Settings / finish Activity
服务端 api.seabank.ph / api.maribank.com.sg 4067012 / 3100012 让出站 attestation「够干净」+ 区域策略

DFP code=0 只表示上报收到,不等于注册会通过。

干净机对照25078RA3EY开 USB 调试 → SG 本地 ADB 页;关调试 → SG OTP 可过。说明本地检测与服务端决策 相互独立


2. 注册请求载荷结构App 发出)

加密前 JSONMariBankEncrypt / uvwuvwuv.uvwvuww 入口)典型结构:

{
  "cyCode": "63",
  "phone": "<RSA 加密>",
  "scene": "REGISTRATION",
  "step": "BE",
  "rdVerifyInfo": {
    "bioStatus": 0,
    "data": "<SHPSSDK native attestation 密文>",
    "dataKey": "<attestation 密钥>",
    "deviceFingerprint": "段1|段2|段3|00|0",
    "fvInfo": {},
    "afExtInfo": {
      "modeInCall": "N",
      "modeInCommunication": "N",
      "modeCallScreening": "N"
    },
    "publicKeyAuthen": "pk2",
    "random": "...",
    "softTokenActivated": false
  }
}

流程:App 本地采集 → 拼 JSON → native 加密 → POST /uapi/v2/register


3. 字段说明

3.1 deviceFingerprint

pipe 分隔字符串,示例:

jrKyNF/Fx4gcnzVpf1u9bw==|WJMksio9SaKKuyk1KMSilUGivdF+...|TXeh8FyEf/8qHdAS|00|0
  ↑ Base64 段1          ↑ Base64 段2设备哈希     ↑ 短码  ↑ 风险码|标志
部分 含义 Hook 能否改
前两段 Base64 设备 / 环境哈希,服务端可索引黑名单 换 serial/android_id 后 重新生成
第三段 短码 随 SDK 变
最后 |xx|y 风险摘要(如 Root+Hook |09|1 已净化为 |00|0

只改尾部不够:服务端还验 data/dataKey 解密内容。

3.2 data / dataKey

  • libshpssdk_bank.so native 生成并签名
  • 内含 Root / Hook / 调试等 attestationJava 层改 JSON 字段无法重写密文
  • SG 3100012 时多半此层或设备黑名单未过PH 7/6 成功时服务端 接受了 当前密文

3.3 afExtInfo(银行 App 上报,非 PC 添加)

"afExtInfo": {
  "modeInCall": "N",
  "modeInCommunication": "N",
  "modeCallScreening": "N"
}
字段 推测含义 "N"
modeInCall 是否正在通话 No
modeInCommunication 是否通信/音频占用 No
modeCallScreening 来电筛选等相关状态 No
  • 来源App / SDK 读系统状态写入 rdVerifyInfo
  • 去向:随 register 加密后发给服务端
  • 当前模块未专门修改 这三项(原样上报)
  • 用途:反欺诈辅助信号,不是 USB 调试开关

3.4 其他常见字段

字段 说明
cyCode 国家码PH=63SG=65
step BE 首次注册 → 成功后可到 BSOOTP
action OTP_SMS_TRIGGER 触发短信验证码
bioStatus 生物识别状态,注册时多为 0

4. 为何 USB 调试开着仍能发 OTP菲律宾实测

4.1 两个「USB 调试」不是一回事

PC 侧 adb App 内部读到的值
你开 USB 调试 adb shell 被 Hook 伪装为关闭

4.2 模块已做的 ADB bypassMariBankRootBypassHook

Java Settings

  • adb_enabled / adb_wifi_enabled / development_settings_enabled0

系统属性(MariBankShpsNativeHook

  • init.svc.adbdstopped
  • persist.sys.adb_enable0

UI

  • 全屏「ADB / Wireless ADB Detected」页 → Activity.finish()
  • 相关 Toast 拦截

因此:PC 连着 adbApp 仍可能认为未开调试本地不拦、register 载荷也不带「adb 开」的自报字段。

4.3 与干净机对照

环境 USB 调试 结果
干净机(无 Hook 本地 ADB 页,进不了 OTP
干净机 OTP
Pixel 6 + LSPosed + Shamiko PH OTPHook 伪装)

4.4 注意

  • native 仍可能用 Hook 未覆盖的路径读调试状态
  • SG 更严,开 adb 风险高于 PH
  • 文档仍建议测 SG 时 关 USB 调试

5. 菲律宾能发验证码的真实原因

5.1 能确定

  • api.seabank.ph 返回 code=0step 进入 BSOOTP_SMS_TRIGGER 成功
  • 同一台机、同一套 Hook 下 SG 仍 3100012 → 差异在 服务端,非「没风控」

5.2 7/3 失败 → 7/6 成功的变化

能力 7/3 7/6
riskToken 尾部净化
加密前 register 明文 Hook
Attestation / 环境 Hook
Shamiko 藏 Magisk 无/未配
换 serial / android_id

不是单一开关,而是 Shamiko + 新设备 ID + 加密前/采集链净化 组合后PH 服务端认为 attestation 可接受

5.3 高概率推断

  1. PH / SG 两套 API、两套规则 — 同一载荷 PH 过、SG 不过
  2. PH 侧设备黑名单 — Pixel 6 在 SG 测多次PH 可能未标记
  3. 7/3 的 4067012 — bypass 不完整非「PH 永远不能 Root 注册」

5.4 无法无源码 100% 证实

  • PH 后台具体哪条规则放行
  • data 解密后哪一位从拒变收

6. Magisk / LSPosed / Shamiko 分工

MagiskRoot 权限)
  └── Zygisk
        ├── LSPosed → 加载 xposed-module改 Java 检测、抓加密前 JSON
        └── Shamiko → 对银行进程隐藏 Magisk/LSPosed
Magisk 模块 maribank_device_spoof → resetprop 换 serial 等
组件 作用
Magisk Root
LSPosed 运行 Xposed 模块(与经典 Xposed 同 APIHook指南.md §0
Shamiko 进程内 Hide Root改善 native attestation
Xposed 模块 SafeMode / ADB / 加密前净化

7. 服务端可能校验项(反推)

校验项 说明
rdVerifyInfo.data / dataKey native attestation 解密
deviceFingerprint 段 1/2 设备黑名单
DFP 历史画像 与 register 是否一致
区域策略 PH 松 / SG 严(实测)
IP / 号码 / 频率 次要,非本次主因

最后更新2026-07-06