(新人)某兔子游戏 内购破解教程
今日偶然看到一个还算热门的游戏,看到里面有内购的方法。尝试破解一下
1、拖入AK后重打包,安装到手机上后发现黑屏了
2、然后安装原版测试下,正常运行,那排除手机适配问题,应该就是有验证了
3、既然这样那我们为了确定到底验证的哪里,先只签名测试下,重新安装下,安装手机后还是黑屏。到这里我猜测十有八九是签名验证了
4、祭出四哥的工具,kstools拿出来一顿操作,然后自信满满的再次安装到手机上。发现还是黑屏,这就尴尬了,看来应该不仅仅是签名验证了。这时候没什么捷径可走了进代码分析吧
5、游戏包太大,使用jadx单独打开dex文件
6、然后使用Android killer打开apk。找到入口类后在jadx中打开
https://upload-images.jianshu.io/upload_images/12162430-a6c44aea22b64a9e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/599
这个类通过类名不难看出只是一个闪屏,我们要分析的应该不在这里,所以不用太关注,大致看下代码就行
https://upload-images.jianshu.io/upload_images/12162430-a42f589dce7f9154.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/674
在oncreate最后执行了这个方法,看来是跳到了
https://upload-images.jianshu.io/upload_images/12162430-65b42c3f7961d37a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
https://upload-images.jianshu.io/upload_images/12162430-9d15e07a9c139032.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
定位到SplashScreen类中
https://upload-images.jianshu.io/upload_images/12162430-96a1d4f6f050011c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
看起来也是一个闪屏,但是里面有一些初始化和加载so的操作,进入到MobileAuth.init(this);发现走进了这个native方法里。
https://upload-images.jianshu.io/upload_images/12162430-79ea06a3d2668b06.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/498
暂时先不管他了,继续往下一个activity看。也就是OnyxActivity类;先看onCreate方法中:
https://upload-images.jianshu.io/upload_images/12162430-9072fe309d9ee59e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
也没有什么可以一看看出来的验证方法。懵逼,因为游戏并没有闪退,只是黑屏,看异常看不出有哪里出了问题,所以我在这些方法下面插入log,看执行到哪一个时候卡住了。
https://upload-images.jianshu.io/upload_images/12162430-10f3a75740820dd2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/415
为了防止寄存器使用乱掉出错,这里直接在原来基础上+2,增加两个寄存器,增加自己的log代码
https://upload-images.jianshu.io/upload_images/12162430-7201847f658a06d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
然后再次打包运行,发现卡在了10之后,11没有被打印出来,而且前面的日志重复输出,说明一直循环卡死了。invoke-virtual {v2, p0},Lcom/ubisoft/OnyxEngine/OurpalmChannel;->Init(Landroid/app/Activity;)V进到这个方法看看
https://upload-images.jianshu.io/upload_images/12162430-63a182f3774c5e59.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
看着像是广告和支付的初始化,这个方法里有两处初始化地方,在这两处加完log信息后发现卡在了Ourpalm_Entry.getInstance(mActivity).Ourpalm_Init("2","1.0", "1.0", mListener);进去之后我的内心是崩溃的,这么多代码看的我头大,真的不想再一个个打印了,还好猛地看到了RunSign这个jni方法,熟悉的味道,先看看这个方法
https://upload-images.jianshu.io/upload_images/12162430-40db2a92fa9f6584.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
就是他
https://upload-images.jianshu.io/upload_images/12162430-3e33e597fd0c4a2f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/364
打开IDA拖入so,方法在libourpalm_sdk_a.so内
https://mmbiz.qpic.cn/mmbiz_png/YaEr5ib6GPqWb0ZYVoBujAYImlGrOTzEnIMJprwicP2b8qSia6uHKhI2SuXrdgnOA13ypfiaP8XSicWF10MGf3RWQyQ/640?wx_fmt=pnghttps://upload-images.jianshu.io/upload_images/12162430-14c1ebfaecedb5b3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
到这儿几乎一目了然了,是做了dex+签名的效验
https://upload-images.jianshu.io/upload_images/12162430-9f8746a1e5ed4731.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
在checksign这个函数内也发现了退出游戏的代码位置,既然这样我们直接选择简单的操作方式给两个跳转nop掉。
https://upload-images.jianshu.io/upload_images/12162430-3cb5e5595afdc89d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673
https://upload-images.jianshu.io/upload_images/12162430-6d71ebc1b06ceac1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/541
把上面的两条改为:C0 46(也就是NOP)
https://upload-images.jianshu.io/upload_images/12162430-8d14df8618063c88.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/567
改完后,再次重签名,安装,完美运行。
https://upload-images.jianshu.io/upload_images/12162430-8bcb0b1c29577de0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/326
接下来定位支付位置:其实刚刚分析代码时候已经大致看到支付位置了。为了确定还是分析下。刚刚分析到OurpalmChannel类时候,可以看到这里他自定义了一个 ourpalm.tools.android.logs.Logs类
https://upload-images.jianshu.io/upload_images/12162430-d93b26195c9f1aa9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/476
https://upload-images.jianshu.io/upload_images/12162430-1973df3249297a66.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/445
这里我们把isShowLog的赋值改下
https://upload-images.jianshu.io/upload_images/12162430-cc80247e502528be.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/628
这里初始化时赋值改为true,再次打包运行游戏,点击支付,成功打印日志:
https://upload-images.jianshu.io/upload_images/12162430-f2244bc2b03a3855.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/338
支付页面,我们没登录
https://upload-images.jianshu.io/upload_images/12162430-db73031bd76af961.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
log日志页面
https://upload-images.jianshu.io/upload_images/12162430-d92a1eae85fbb18b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/467
下面这个pay方法也是这个类中
https://upload-images.jianshu.io/upload_images/12162430-2215063b5067481a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
这就对上了,说明是这个支付方法。写过支付的人应该都知道,支付的回调一般在handler或者提供的接口中,这里可以看出来他传入了mListener这个回调接口,我们看下这个接口初始化的地方
https://upload-images.jianshu.io/upload_images/12162430-34041e7d5d089b4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/546
https://upload-images.jianshu.io/upload_images/12162430-4e5cdc4e54cd7a46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
点进去OurpalmIAPListener中看下
https://upload-images.jianshu.io/upload_images/12162430-24cde4c24b085ce8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
这里就能看到支付成功的位置了,就是OurpalmChannel.PayResultCallBackNative(true);和上面的支付失败也就是true/false的区别。至于为什么不是下面的那一堆。我看了下方法内部走到最后是一些统计的东西。然后我们在执行pay的那里,执行这个成功方法就行了。
https://upload-images.jianshu.io/upload_images/12162430-d6fa0ae1f274354e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
再次打包运行。点击购买,成功获得
https://upload-images.jianshu.io/upload_images/12162430-f6cf45cb3c0585fc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/340
本文的目的只有一个就是学习逆向分析技巧,如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系!
第一次发帖,不足之处大家多多指教。
kstools工具下载:https://github.com/fourbrother/kstools
游戏下载链接:https://pan.baidu.com/s/1Wq8NXgEaNnSZ7sgpvMsB-Q 密码:2g9h
看了很多遍,就是IDA那段看不懂,不知道如何修改。能出个详细点的视频就好了。
现在很多单机的游戏都需要签名验证,自己打包了好几个签名都是闪退。
用了四哥的工具又不好使,一个都不能破解 本帖最后由 翼国游者 于 2018-5-30 12:03 编辑
额,图片无法放大,看的比较吃力,总算知道登录支付界面咋整,虽然不会……
PS:是不是一般有登录才能出现支付界面的是不是都有mListene这项?~ 刚刚忘记放下载链接,布局也全乱了,现在把游戏破解前后的下载链接都放在百度云里了。 谢谢楼主分享
谢谢楼主分享 谢谢分享{:1_893:} 感谢楼主分享 大赞!部分截图看不清,思路是很好的借鉴!{:1_893:} 厉害厉害,来学习学习。 O(∩_∩)O谢谢 感谢楼主大大!