|
|
本帖最后由 Cynnie 于 2026-8-24 10:15 编辑
流光助手 3.1.0 会员解锁分析:Flutter App 反混淆 + Mock代理服务器方案
前言
流光助手是一款基于 Flutter + Gopeed(Go下载引擎) 开发的网盘资源下载工具,版本 3.1.0。本文记录了从静态分析到最终实现会员解锁的完整过程,核心思路是利用 Blutter 反混淆 libapp.so 定位关键逻辑,再通过 篡改型透明代理服务器 从源头替换会员状态,规避服务端校验。
一、应用架构分析
APK 的 Java/Kotlin 层极其精简(仅14个类),只是个壳:
-通过 MethodChannel 桥接 Go 下载引擎
-注册广告插件
真正的业务逻辑(登录、会员判断、网盘接口)全部编译在(Dart AOT 产物,9.3MB)中。这意味着传统的 Java Hook 方案失效,需要深入 Dart 层。
二、Blutter 反混淆定位关键逻辑
使用 Blutter 对 libapp.so 进行 Dart AOT 反编译恢复。通过字符串交叉引用(string_xrefs),快速定位到核心类与方法:
1. 会员状态存储
定位到类,会员状态通过(AES加密存储)持久化到本地:
-— 会员状态(字符串 "1"/"0")
-— 到期时间
关键方法读取缓存并构建对象,其中 isPro 的判断逻辑是将读取到的字符串与对象池常量比较。
2. 网络架构
通过搜索/等关键词,定位到后端:
-— 认证服务,构造请求时调用拼接 baseURL + path
- baseURL 由- GuangyaApiService._configuredBaseUri()
复制代码 硬编码返回,存储在 .rodata 明文字符串中
- 网络栈为标准 Dart包 +,无 SSL Pinning
3. is_pro 真正来源
分析调用链,发现会员状态并非仅存本地缓存,而是由服务端接口实时下发:
- {
- "data": {
- "user": {
- "is_pro": 1,
- "pro_expires_at": "2099-12-31 23:59:59",
- ...
- }
- }
- }
复制代码
这解释了为什么仅 Patch 本地缓存读取(返回 "1")无法稳定生效——登录或刷新时服务端下发的 is_pro 直接进入内存,绕过了缓存路径。
三、方案演进:从本地 Patch 到代理服务器
方案1:本地 Smali + Dart 机器码双重 Patch(失败)
初期尝试在 Java 层 patch- FlutterSecureStorage.readUnsafe
复制代码 返回 "1",并在 Dart 层强制返回 true()。
结果:仅在重启读缓存时偶尔显示会员,登录即时状态仍以服务端为准,不稳定。
方案2:Mock 代理服务器(最终方案)
既然无 SSL Pinning 且 baseURL 为单个明文字符串,最彻底的方案是替换 baseURL 指向自建代理服务器,代理服务器仅篡改会员接口,其余透传真实服务器。
四、实施步骤
1. Patch baseURL 字符串
libapp.so 中 baseURL 以明文 ASCII 存储,需等长替换(Dart 对象池要求)。原字符串- https://pan-api.yodlx.com
复制代码 共25字节,替换为等长的自建域名。
关键:域名需 ≤17字符,凑满25字节槽位。
2. 部署篡改型透明代理
代理服务器核心逻辑:仅对和篡改、,其余所有请求原样转发至真实服务器。
这保证了网盘文件列表、下载链接、积分等所有功能正常工作(数据来自真实服务器),仅会员判断被篡改。
核心代码(Python):
- REAL_SERVER = "https://真实服务器域名"
- TAMPER_PATHS = {"/api/v1/auth/me", "/api/v1/auth/login"}
- def _forward(self):
- # 原样转发请求至真实服务器
- url = REAL_SERVER + self.path
- # ... 转发并获取响应 ...
-
- # 仅篡改会员接口
- if self.path in TAMPER_PATHS:
- j = json.loads(resp_body)
- j["data"]["user"]["is_pro"] = 1
- j["data"]["user"]["pro_expires_at"] = "2099-12-31 23:59:59"
- resp_body = json.dumps(j).encode()
-
- # 返回给App
复制代码
3. HTTPS 证书
因 Dart http 包校验证书链,需使用正规 CA 证书。利用 Let's Encrypt + certbot webroot 模式申请免费证书,nginx 反代至代理服务即可。
五、效果
- 用真实账号登录,网盘文件列表、下载等全部功能正常
- 会员状态显示为 Pro,到期时间 2099 年
- 无需修改任何功能代码,仅靠流量代理实现
六、总结
本次分析的关键经验:
1. Flutter App 的 Java 层是壳,需用 Blutter 反混淆 libapp.so 才能定位真实逻辑
2. 仅 Patch 本地判断往往不够,需追踪数据来源(服务端接口)
3. 篡改型透明代理是对付服务端校验的利器:只改关键接口,其余透传,保证功能完整
4. 无 SSL Pinning 的 App 替换 baseURL + 自建 HTTPS 代理是通用且低侵入的方案
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +2
金币 +2
|