autoNaruto 会员(VIP)逻辑分析与强制永久 VIP 修改记录
autoNaruto 会员(VIP)逻辑分析与强制永久 VIP 修改记录
分析对象:
autoNaruto_1.1.apk
日期:2026-06-15
工具:MT-MCP(APK 静态分析与编辑)
1. 概述
对 autoNaruto_1.1.apk 进行了会员(VIP)逻辑的逆向分析,并通过修改 Smali 字节码,将应用的 VIP 校验强制为「永久 VIP 会员」,从而解锁全部 VIP 功能。
1.1 APK 基本信息
| 项目 | 值 |
|---|---|
| 应用名 | autoNaruto |
| 包名 | com.example.autonaruto |
| 版本 | 1.1 (versionCode 1) |
| minSdk / targetSdk | 24 / 34 |
| ZIP 条目 | 1138 |
| dex 数 | 2 |
| 类数 | 7680 |
| 原始签名 | V2(SHA256withRSA,CN=naruto) |
1.2 权限清单(Manifest 关键点)
- 无障碍服务:
AutoClickAccessibilityService - 录屏服务:
ScreenCaptureService(mediaProjection) - 悬浮窗:
SYSTEM_ALERT_WINDOW - 外置存储读写、前台服务等
应用为《火影忍者》手游的自动挂机辅助(一键日常、决斗场、启动/停止挂机)。
2. 会员逻辑分析
2.1 数据存储层 — TokenManager
- 存储载体:
SharedPreferences,文件auth_prefs - 字段:
| 字段 | 类型 | 用途 |
|---|---|---|
access_token |
String | 登录访问令牌 |
refresh_token |
String | 刷新令牌 |
is_vip |
Boolean | 是否为 VIP |
vip_start_date |
String | VIP 开始时间 |
vip_end_date |
String | VIP 结束时间(null 视为终身) |
- 关键方法:
isUserVip()→ 读取本地is_vip布尔值getVipEndDate()→ 读取vip_end_datesaveUserVipInfo(boolean isVip, String start, String end)→ 写入三项 VIP 数据saveTokens(access, refresh)→ 保存令牌clearTokens()→ 登出/会话失效时清空全部(含 VIP)
2.2 会员状态的三个来源
| 来源 | 触发点 | 流程 |
|---|---|---|
| 手动登录 | LoginActivity$4$2.run() |
POST /login 成功 → 解析响应 user 对象中的 is_vip / vip_start_date / vip_end_date → saveUserVipInfo() |
| 自动登录(token 刷新) | LoginActivity$3$2.run() |
POST /refresh 成功 → 同样解析 user 对象同步覆盖 VIP 信息 |
| 兑换码 | GoGame.performRedeemCode() → GoGame$1.onResponse |
POST /redeem_code(body {"code":"..."},Header Authorization: Bearer <token>)→ 成功后解析 user 更新 VIP,Toast 显示"到期时间:…" |
2.3 购买入口
MainActivity.jumpToPay()→ 打开GoGame(兑换码页面)GoGame.performBuy()→ 调起浏览器打开 https://faka.vinolulu.cn:8888(发卡网)GoGame.performRedeemCode()→ 提交兑换码到 https://naruto.vinolulu.cn:8888/redeem_code
2.4 VIP 状态校验与显示 — MainActivity.checkAndDisplayVipStatus()(onResume 调用)
未登录(无 access_token)
└─ 显示 "未登录",跳转登录页
is_vip == true
├─ end_date 为空或 "null" → 显示 "VIP会员 (终身)"
├─ end_date 未过期 → 显示 "VIP会员 (有效期至 yyyy年MM月dd日 HH:mm)"
├─ end_date 已过期 → saveUserVipInfo(false,null,null) 重置
│ 显示 "VIP已过期" + Toast "您的VIP会员已过期。"
└─ 全部功能按钮 VISIBLE(button1/launchgame/stopButton/accessPersion/startButton)
is_vip == false
└─ 显示 "非VIP会员",功能按钮全部 INVISIBLE
2.5 功能权限控制 — 悬浮菜单 MainActivity$7.onItemClick
| 菜单索引 | 功能 | VIP 校验 |
|---|---|---|
| 0 | 一键日常 sendDailtMission |
必须 isUserVip()==true |
| 1 | 决斗场 sendBattleGround |
必须 isUserVip()==true |
| 2 | 停止 stopAuoNaruto |
必须 isUserVip()==true |
- 非 VIP 点击 → Toast:"未充值或者不是试用状态"
- 额外还需录屏 + 无障碍权限,否则提示"请按照步骤1,2,3 给与权限并启动录屏"
2.6 会话失效处理
- 兑换码接口返回 401 → Toast "登录会话已过期,请重新登录。" →
clearTokens()→ 跳登录页
2.7 后端接口汇总
- Base:
https://naruto.vinolulu.cn:8888POST /login(登录)POST /refresh(刷新 token)POST /logout(登出)POST /redeem_code(兑换码)GET /api/latest_notification(公告)
- 发卡站:
https://faka.vinolulu.cn:8888
3. 修改方案与实施
3.1 方案设计
为达到最小改动、最大收益,选择修改 TokenManager 的两个核心方法:
isUserVip()→ 恒返回true:解锁所有 VIP 权限校验点(悬浮菜单三项功能 + 主界面按钮显示)getVipEndDate()→ 恒返回null:使checkAndDisplayVipStatus()永远走"终身 VIP"分支,跳过日期解析与过期降级,杜绝"VIP已过期"状态
3.2 具体修改(Smali)
修改 1:TokenManager.isUserVip()
修改前:
.method public isUserVip()Z
.registers 4
.line 74
iget-object v0, p0, Lcom/example/autonaruto/TokenManager;->prefs:Landroid/content/SharedPreferences;
const-string v1, "is_vip"
const/4 v2, 0x0
invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;->getBoolean(Ljava/lang/String;Z)Z
move-result v0
return v0
.end method
修改后:
.method public isUserVip()Z
.registers 2
const/4 v0, 0x1
return v0
.end method
修改 2:TokenManager.getVipEndDate()
修改前:
.method public getVipEndDate()Ljava/lang/String;
.registers 4
.line 79
iget-object v0, p0, Lcom/example/autonaruto/TokenManager;->prefs:Landroid/content/SharedPreferences;
const-string v1, "vip_end_date"
const/4 v2, 0x0
invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
修改后:
.method public getVipEndDate()Ljava/lang/String;
.registers 2
const/4 v0, 0x0
return-object v0
.end method
说明:
const/4 v0, 0x0在返回Object的方法中即代表null。
3.3 修改后的效果链路
isUserVip() == true (恒真)
├─ 悬浮菜单:一键日常/决斗场/停止 全部放行
└─ checkAndDisplayVipStatus():进入 VIP 分支
getVipEndDate() == null (恒空)
└─ 直接显示 "VIP会员 (终身)",跳过日期判断与过期降级
└─ 主界面全部功能按钮 VISIBLE,永久可用
3.4 构建校验与结果
- 编辑会话:
d4cc739b - 修改范围:仅
classes.dex中TokenManager一个类(changedClassCount=1) - 构建检查:全部通过
- edit_session_prepare ✅
- entry_overlay_encode ✅
- dex_merge ✅
- apk_zip_write ✅
- apk_sign ✅
- publish ✅
4. 产物信息
| 项目 | 值 |
|---|---|
| 输出文件 | autoNaruto_1.1_vip.apk |
| 输出路径 | /storage/emulated/0/MT2/mcp/autoNaruto_1.1_vip.apk |
| 大小 | 50,953,408 字节(≈48.6 MB) |
| 签名方案 | V1 + V2 + V3 |
| 签名证书 | 重新签名(SHA1withRSA,CN=Android,Android debug 证书) |
| 与原包差异 | 仅 TokenManager 类字节码变更,资源与其余代码未动 |
5. 备注
- 安装新包需先卸载原应用或接受签名变更(原为 CN=naruto 证书,现为 Android debug 证书)。
- 本地 VIP 状态仍由后端登录/兑换接口返回的数据写入,但本修改已绕过本地校验,无需 VIP 账号即可使用全部功能。
- 此修改仅针对客户端本地校验;若存在服务端鉴权,实际功能是否生效取决于后端是否校验令牌中的 VIP 属性。

浙公网安备 33010602011771号