安卓逆向:破解某手机游戏商品内购功能

0x00. 前言

  • 本文介绍的内容,是对某手机游戏进行逆向分析,破解商品内购功能,从而实现不用实际支付就可以完成商品购买;
  • 法律风险提示:本文内容主要为交流和分享安卓逆向技术,严禁用于任何商业用途!

0x01. 环境

  • Windows 10;
  • JEB 版本 3.0.0.201808031948 Beta;
  • 雷电模拟器 3.94;
  • Android Killer V1.3.1.0;
  • Android Device Monitor 25.2.5;

0x02. 下载

  • 下载游戏 – 链接:https://pan.baidu.com/s/1gYYND0R29xYCxoddM1E8Lw,提取码:m1qu;
  • 下载 JEB – 链接:https://pan.baidu.com/s/1pQWDjA3_rChRzvVWMEtzgA,提取码:wbfw;
  • 下载 Android Killer – 链接:https://pan.baidu.com/s/15kWi_-9HCHceoJyrZCswpA,提取码:4bos;
  • Android Device Monitor – 在本机 SDK 目录下 sdk\tools\lib\monitor-x86_64 文件夹中;
  • 雷电模拟器,请自行下载;

0x03. 分析

  • 启动雷电模拟器;
  • 安装 apk
    adb install apk绝对路径
    
  • 在模拟器打开app;
  • 打开 cmd 命令行,输入下面的命令;
    adb shell dumpsys activity activities
    
  • 获取 app 的 packageName,结果在下图红框位置;

  • 打开 Android Device Monitor,找到 packageName 对应的 PID;

  • 添加 LogCat 过滤器;

  • 在模拟器上,按照下图所示点击操作 APP:

  • 在 Android Device Monitor 查看输出日志,从日志输出中获取可以入手分析的字符串,如下图;

  • 打开 JEB,Ctrl + F 弹出查找弹窗,输入 请求支付,计费id:,找到目标代码位置;

  • 按 Tab 键,切换为 JAVA 代码视图,分析代码发现 payCancelpayFailedpaySuccess 三个方法都调用了 onResult 方法,如下图;

  • 鼠标双击 onResult,跳至 onResult 方法代码段,通过分析发下如果 onResult 方法第二个参数为 0 则支付成功;

0x04. 修改源码

  • 确定思路:即在源代码中修改 onResult 代码的第二个参数,使之始终为 0,则可以实现不支付就能完成购买;
  • 在 JEB 中找到下图红框位置,org/cocos2dx/cpp/AppActivity 就是源码所在的文件位置;

  • 打开 Android Killer,找到 org/cocos2dx/cpp/AppActivity 文件并打开;
  • 找到 onResult 方法,按下图所示添加代码 const/4 p1, 0,这里的 p1 表示 onResult 方法的第二个变量,这句代码表示 第二个变量恒为 0

0x05. 回编译并安装运行

  • 回编译 apk,并安装到模拟器上;
  • 重新打开 app,点击要购买的道具任务,在最后一步支付时、点击叉号取消支付,返回主页发现内购成功;