Barih 发表于 2025-11-28 21:26

某XXXDB绕过vip权限验证,直接播放求助

本帖最后由 Barih 于 2025-11-28 22:41 编辑

> 这个APP之前版本是可以重写实现完整VIP功能的,可能是开发者加强了安全措施并在最新版本进行了服务端验证,不符合直接PASS到支付页面。

**以下是我的分析:**
这是一个Flutter应用,通过Blutter逆向后,PP.txt找到关键代码:
```
AnonymousClosure: (0x78a86c), in MoviePageState::_buildBody (0x77a040)
List(7)
String: "/api/v1/movies/%s/play"
String: "operation"
String: "play"
AnonymousClosure: (0x783c4c), in MoviePagePresenter::getM3U8Info (0x7837c8)
AnonymousClosure: (0x783aac), in MoviePagePresenter::getM3U8Info (0x7837c8)
TypeArguments: <MovieM3u8Entity>
String: "PermissionDenied"
String: "PermissionDeniedToPayment"
String: "PermissionDeniedToPromotion"
TypeArguments: <SourceItem?>
AnonymousClosure: (0x783290), in MoviePageState::_showBottomSourceSheet (0x783200)
AnonymousClosure: (0x7834c0), in MoviePageState::_showBottomSourceSheet (0x783200)
Null
String: "value"
AnonymousClosure: (0x7836e4), in MoviePageState::_showBottomSourceSheet (0x783200)
String: "ConnectivityResult.mobile"
AnonymousClosure: (0x78b1f8), in MoviePageState::setM3U8Info (0x783d28)
AnonymousClosure: (0x71b068), in RecentViewedPageState::_getAppBar (0x71b964)
AnonymousClosure: (0x78b6c0), in MoviePageState::setM3U8Info (0x783d28)
AnonymousClosure: (0x78b63c), in MoviePageState::setM3U8Info (0x783d28)
AnonymousClosure: (0x7184e8), in MinePageState::_getDownloadLine (0x718510)
AnonymousClosure: (0x78b018), in MoviePageState::handleM3U8Entity (0x783e28)
AnonymousClosure: (0x78b018), in MoviePageState::handleM3U8Entity (0x783e28)
AnonymousClosure: (0x78b018), in MoviePageState::handleM3U8Entity (0x783e28)
AnonymousClosure: (0x78aff4), in MoviePageState::handleM3U8Entity (0x783e28)
```

点击播放按钮后,请求/api/v1/movies/%s/play 获取视频播放URL,并在设置Mu38前检查用户权限
这三个字符串是关键的权限检查标识:
```
- PermissionDenied - 基本权限拒绝
- PermissionDeniedToPayment - 权限拒绝,引导至支付页面
- PermissionDeniedToPromotion - 权限拒绝,引导至推广页面
```
参考我之前的帖子:[某DB去开屏广告+本地vip(ProxyPin重写)](https://www.52pojie.cn/forum.php?mod=viewthread&tid=2076382&page=1#pid54363595)
这里我在ProxyPin接口虽然通过重写获取了VIP,但播放视频还是返回了PermissionDeniedToPayment,并直接跳转到支付页面,很有可能就是服务端验证失败


丢给AI分析:
## 视频播放流程逻辑

1. 用户点击播放按钮 → 触发 _buildBody 中的播放逻辑
2. 调用API获取播放信息 → 向 /api/v1/movies/%s/play 发送请求
3. 处理API响应 → getM3U8Info 函数获取M3U8播放列表
4. 权限检查 → 检查返回结果中是否包含 PermissionDenied* 字符串
5. 根据权限结果处理 :
   - 如果有权限: setM3U8Info → handleM3U8Entity → 开始播放
   - 如果无权限:显示 PermissionDeniedToPayment → 跳转支付页面

## 权限检查流程:
1. 第一次检查 :TBZ W0, #4, loc_783B50 调用权限检查函数,测试W0寄存器第4位
   
   - 如果为0 → 正常播放流程
   - 如果为1 → 继续VIP检查
2. VIP字符串检查 :检查"PermissionDeniedToPayment"
3. 第二次检查 : TBNZ W0, #4, loc_783B98 再次测试W0寄存器第4位
   
   - 如果不为0 → 跳转到支付页面
   - 如果为0 → 正常播放流程

## 打开IDA查找汇编


## 尝试修改汇编地址
1. 将 TBZ W0, #4, loc_783B50 改为 B loc_783B50 - ✅ 强制 第一次检查后跳转到正常流程。

2. 将 TBNZ W0, #4, loc_783B98 改为 NOP - ✅ 禁用 任何跳转到支付页面的可能性

然后令人抓狂的事情就来了:
1. 无论怎么修改汇编,Patch后重新打包都会直接闪退。
2. frida Hook也总是失败,各种错误,模拟器和真机都尝试过。
**总结:我太菜了,对于Flutter是真没招了。**
不知论坛大佬有没有解决播放过程中绕过权限检查的办法,还请不吝赐教。
页: [1]
查看完整版本: 某XXXDB绕过vip权限验证,直接播放求助