行车记录仪 App 会员逆向分析

查看 109|回复 10
作者:plusboy   
行车记录仪 App 会员验证逆向分析
写在前面
这是我在本论坛学习逆向工程的第一个实践项目,可能存在不足之处,欢迎大家指正和建议。
项目背景
最近购买了一款行车记录仪,但其配套 App 中的多数功能都需要会员才能使用。出于学习目的,我决定尝试逆向分析其会员验证机制。

技术说明:虽然我使用的是 iOS 设备,但考虑到服务端逻辑通常是统一的,会员验证机制在 Android 和 iOS 客户端上应该是一致的,因此我选择了分析 Android 版本。

技术分析过程
第一步:接口抓包分析
使用 iOS 的 HTTP Catcher 进行抓包测试,发现接口通信未加密。
通过搜索 info、vip 等关键词,定位到会员相关接口和返回字段:

原始 JSON 返回内容:
{
  "result": {},
  "code": 200001,
  "des": "vip info notfound"
}
初步尝试:通过重写响应,将 code 改为 0 并在 data 中添加常见的会员字段(如 vip、validTime),但验证失败。这表明需要深入分析客户端代码逻辑。
第二步:逆向环境搭建
所需工具
  • 雷电模拟器 9(Android 9.0)
  • Python 3.12
  • ADB(雷电模拟器自带)
  • Frida 服务端(版本 16.5.2)
  • JADX-GUI(版本 1.5.3,下载地址)

    环境配置
    [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

  • 反编译设置
  • 打开 JADX-GUI
  • 文件首选项插件Dex Input
  • 关闭 Verify dex file checksum before load 选项
  • 依次导入所有 dex 文件并导出项目源代码

    [/ol]
    第四步:代码逻辑分析
    1. 定位关键接口
    搜索接口路径 /vip/infos,找到相关代码逻辑:

    关键发现
  • 应用会检查 JSON 响应中的 func 数组,如果不存在则认为不是 VIP
  • 同时验证 vipend 或 expire 字段,如果过期也会清除会员状态

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

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

    永久会员条件
    [ol]
  • actime > 0
  • 如果 fset 属性等于 part 且 way 属性等于 device,则不为永久会员
  • Math.max(this.vipend, this.expire) > 0
  • getEndTime() - this.actime >= 933120000000L
    [/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 加固的应用,如果希望修改源代码后重新打包,是不是很难?我没有搜索到相关的教程

    会员, 接口

  • zhuxiangyu1024   

    1.360的壳,你脱的dex修复一下估计就能解决反编译的问题
    2.360的重打包很麻烦的,不说修复,单单过签名校验就能难倒大部分人,所以并没有什么完善的教程。可以考虑hook
    shsww   

    你没有搜索到相关教程的原因是俩个,一个是确实有难度,修复方案比较有价值。 另一个算是主要原因:法务部比较厉害。
    nitian0963   

    向大佬学习      
    FlyPan   

    向大佬学习
    xiukong23   

    向大佬学习
    svia   

    厉害,向您学习
    jgm3380   

    学习到了
    ugvnui   

    大佬厉害,向你学习
    2wzv1nqyde35047   

    你得过程我到无所谓,我只想知道你咋在行车记录仪上提取出app的?难道你这APP是随意下载的?
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部