写在前面
这是我在本论坛学习逆向工程的第一个实践项目,可能存在不足之处,欢迎大家指正和建议。
项目背景
最近购买了一款行车记录仪,但其配套 App 中的多数功能都需要会员才能使用。出于学习目的,我决定尝试逆向分析其会员验证机制。
技术说明:虽然我使用的是 iOS 设备,但考虑到服务端逻辑通常是统一的,会员验证机制在 Android 和 iOS 客户端上应该是一致的,因此我选择了分析 Android 版本。
技术分析过程
第一步:接口抓包分析
使用 iOS 的 HTTP Catcher 进行抓包测试,发现接口通信未加密。
通过搜索 info、vip 等关键词,定位到会员相关接口和返回字段:

原始 JSON 返回内容:
{
"result": {},
"code": 200001,
"des": "vip info notfound"
}
初步尝试:通过重写响应,将 code 改为 0 并在 data 中添加常见的会员字段(如 vip、validTime),但验证失败。这表明需要深入分析客户端代码逻辑。
第二步:逆向环境搭建
所需工具
环境配置
[ol]
安装 Python 依赖:
pip install frida==16.5.2 frida-tools objection frida-dexdump
Frida 服务端配置:
# 推送 frida-server 到设备
adb push frida-server-16.5.2-android-x86_64 /data/local/tmp/
# 连接设备并提权
adb shell
su
chmod 755 /data/local/tmp/frida-server-16.5.2-android-x86_64
# 端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
[/ol]
第三步:脱壳与反编译
[ol]
脱壳操作:
# 查看应用包名
frida-ps -Uai
# 执行脱壳
frida-dexdump -U -f
反编译设置:
[/ol]
第四步:代码逻辑分析
1. 定位关键接口
搜索接口路径 /vip/infos,找到相关代码逻辑:

关键发现:
2. 解析功能权限
搜索 func 关键词,定位到枚举类,明确了功能权限的具体定义:

3. 会员状态验证
搜索会员相关关键词,发现 isPermanent 方法是判断会员状态的关键:

永久会员条件:
[ol]
[/ol]
最终解决方案
通过分析,构造有效的会员响应数据:
{
"result": {
"vipend": 2694096033000,
"fset": "full",
"func": ["1999"],
"expire": 2694096033000
},
"code": 0,
"des": "success"
}
使用 HTTP Catcher 重写响应后,会员功能成功激活:

技术问题求助
问题一:反编译异常
在反编译部分 dex 文件时,JADX-GUI 报错:
java.lang.IllegalArgumentException: newPosition > limit: (1469428 > 1469424)
遇到这种反编译错误,通常有哪些解决方法?
问题二:重打包难度
目前我通过重写网络请求实现了功能绕过。
针对这种 360 加固的应用,如果希望修改源代码后重新打包,是不是很难?我没有搜索到相关的教程