【新手】彩虹岛1手游内购破解分析过程
本人菜鸟一枚,这是我独立破解的第一个APP,如有分析不对或者不恰当的地方还请大佬们指正~~~{:1_914:}{:1_914:}{:1_914:}《彩虹岛1》很久之前就已经开发好的一款安卓游戏,最高只支持800*480分辨率的手机,在大屏手机运行时会弹出出错信息无法进入游戏。游戏过程中需要内购,而内容提供者早就停止了服务,于是本人将其反编译成smali后对逻辑进行了一些修改,并编写了一个简易的内购破解程序,以下是修改之前的一些截图:
首先将APK导入到AndroidKiller工程中,从string.xml中找到内购相关字符串:
这里出现的相似词汇比较多,“订购成功”“购买成功”“支付成功”,于是我看了下包名,发现了
通过搜索,发现yeepay就是上面弹窗中的“易宝支付”,于是进入com.yeepay.android.plugin包,查看一下里面的类,发现在YeepayPlugin继承了Activity,且类中有setResult()方法,
那么推测肯定游戏相关的某个类调用了startActivityForResult()方法,且intent中传入了YeepayPlugin.class,于是搜索YeepayPlugin
果然在com.sdwl.game.latale.charge中发现了两处!查看其java代码分析逻辑
当然,我们并不关心它是如何启动这个YeepayPlugin这个Activity的,我们关注的是onActivityResult()这个方法,于是我在同一个包中仔细寻找,发现
推测这两个break会造成购买失败,也就是说,之后要编写的破解器传回的intent中一定要有“requestId""amount"这两个内容。
至此,游戏中调用支付插件并获取返回信息的部分就分析结束了,我们回到YeepayPlugin类中来分析
在onCreate()方法中,我们发现:
先后调用了a(Context paraContext)和a(),而a(Context paraContext)会产生寻找"com.yeepay.android.service"并产生PackageManager.NameNotFoundException,a()会寻找"com.yeepay.android.plugin"并产生ActivityNotFoundException,方便起见,我将a(this)处的跳转直接改成相反,直接执行a(),而a()会启动"com.yeepay.android.plugin"这个action,因此之后编写的内购破解器的activity设置为这个名字就好了
也就是说如果找到了这个activity,就不会执行setResult(0)。下面开始编写内购破解器:
在AS新建一个工程,要写的内容之前都分析到了,因此直接上代码:
打包生成APK,安装在手机上即可。运行效果如图:
至于高分辨率的适配,由于做的不是很好,所以在此就不发分析过程了,破解的成品在原创发布区,详见:
https://www.52pojie.cn/thread-638261-1-1.html
我还是菜鸟,这是我独立破解的第一个APP,如有分析不对或者不恰当的地方还请大佬们指正~~~{:1_914:}{:1_914:}{:1_914:} guidao 发表于 2017-8-24 23:02
支持,学习一下,顺便问下,这java要学到什么程度才能做到啊?
emm...其实我java也没学得多好..我觉得把基础知识看懂了之后要用的时候再查一查{:17_1066:} hyc199844 发表于 2017-8-25 13:14
emm...其实我java也没学得多好..我觉得把基础知识看懂了之后要用的时候再查一查
哦哦,谢谢啦 支持 学习了 这样玩手游,简直飞一般的感觉 学习学习 能发个大气点的游戏吗 单机还是网游? 支持了 学习看看 谢谢分享 x280368646 发表于 2017-8-24 16:53
能发个大气点的游戏吗
233333;www 429645667 发表于 2017-8-24 16:54
单机还是网游?
单机。。