本教程适合基于flutter框架开发应用的修改
需要用到的工具:MT管理器、Termux、DisElf2
1.下载安装Termux
2.Termux中安装python3
3.安装blutter
这一步执行完之后可能会报这样的错误(如果没报错,直接执行下一步)
python环境缺少SSL支持,执行一下代码即可
检查python环境- import ssl
- print(ssl.OPENSSL_VERSION)
复制代码 出现这样说明环境加载成功
然后再去执行上一步,成功截图
4.使用blutter
- 解压apk包中的lib文件夹下的arm64-v8a
- Termux中运行blutter脚本 python3 blutter.py so文件路径 文件输出路径
- 切换到blutter-termux目录下执行以下代码(cd blutter-termux)
- python3 blutter.py /storage/emulated/0/MT2/apks/arm64-v8a /storage/emulated/0/MT2/apks/flutter
复制代码
运行成功截图(时间可能会久一点)
至此前期准备工作完成

5.接下来开始逆向破解
打开输出好的flutter文件夹,可以看到
主要会用到asm文件夹和pp.txt文件
app的会员功能是通过观看广告得到的
会看到跟会员有关的关键字段有这么几个 "看广告视频,领取尊贵VIP"、"看激励视频可领vip会员" 对应的包是
[package:guoguo/pages/my_vip/view.dart]
[package:guoguo/pages/video_page/widget/video_info_widget.dart]
- 进入dart文件搜索会发现两个文件都调用了GlobalService 类中的 isVip 方法,并且包是 [package:guoguo/global_service/global_service.dart]
isVip方法就是我们需要修改的,继续寻找 GlobalService 类中的 isVip 方法
这段代码是ARM架构下的汇编语言代码,用于实现一个名为 isVip 的函数。该函数的功能是判断一个用户是否是VIP。为了更清楚地分析这段代码,我们可以逐步解读每一部分的作用。 可跳过 1. 函数入口和堆栈管理
- stp fp, lr, [SP, #-0x10]!: 将当前的帧指针 (fp) 和返回地址 (lr) 存入堆栈,保存当前上下文。
- mov fp, SP: 更新帧指针。
- sub SP, SP, #0x10: 为局部变量分配16字节的堆栈空间。
- ldr x16, [THR, #0x38]: 加载当前线程的堆栈限制。
- cmp SP, x16: 比较当前堆栈指针与堆栈限制。
- b.ls #0x9e81a4: 如果堆栈指针低于或等于限制,跳转到堆栈溢出处理。
2. 读取用户数据和检查是否为VIP
- ldr x0, [fp, #0x10]: 加载函数参数到 x0 寄存器。
- ldur w1, [x0, #0x1f]: 从 x0 指向的对象中加载字段。
- add x1, x1, HEAP, lsl #32: 解压指针并计算实际地址。
- str x1, [SP, #-8]!: 将计算得到的地址存储到堆栈中。
- bl #0xe9a874: 调用 value() 方法,检查对象值是否为 NULL。
- cmp w0, NULL: 比较返回值。
- b.ne #0x9e811c: 如果不为 NULL,跳转到处理逻辑。
3. 进一步检查VIP状态
- 继续调用 value() 方法并检查。
- 如果值不为 NULL,则加载 vipExpiredAt() 方法的返回值。
- 分配新的 DateTime 对象,并将当前时间与 VIP 过期时间进行比较。
- 通过 compareTo 方法判断 VIP 是否过期,设置返回值为 true 或 false。
4. 函数退出
- LeaveFrame: 恢复堆栈指针和帧指针。
- ret: 返回到调用者。
- 处理堆栈溢出和空指针异常的部分
- 根据代码上下文,x20表示true,x30表示false。代码开头的isVip方法地址和大小 addr: 0x9e80dc, size: 0xd4
使用DisElf2 修改 isVip方法 接下来跟着图片内容完成即可
以上思路来自 blutter逆向flutter实战教学 (出处: MT论坛) 感兴趣可以去看
至此,修改结束。
本次修改svip只实现了视频免广告,开屏广告和首页广告并没有去除,svip下载功能也未实现。
本教程仅供小白学习,ps:我也是小白。教程是我一边实操一边编写的,如果发现教程中那块有错误,请在评论区留言
|