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 代码视图,分析代码发现 payCancel、payFailed、paySuccess 三个方法都调用了 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,点击要购买的道具任务,在最后一步支付时、点击叉号取消支付,返回主页发现内购成功;