Android逆向之旅--疯狂兔子无敌跑跑 内购破解教程

感谢「一块硬币」同学投稿,也热烈欢迎其他同学来投稿,分析是一种快乐,也是一种精神!


今日偶然看到一个还算热门的游戏,看到里面有内购的方法。尝试破解一下

1、拖入AK后重打包,一切顺利安装到手机上后发现黑屏了

2、然后安装原版测试下,正常运行,那排除手机适配问题,应该就是有验证了

3、既然这样那我们为了确定到底验证的哪里,先只签名测试下,重新安装下,安装手机后还是黑屏。到这里我猜测十有八九是签名验证了

4、祭出四哥的工具,kstools拿出来一顿操作,然后自信满满的再次安装到手机上。发现还是黑屏,这就尴尬了,看来应该不仅仅是签名验证了。这时候没什么捷径可走了进代码分析吧

5、游戏包太大,使用jadx单独打开dex文件

6、然后使用Android Killer打开apk。找到入口类后在jadx中打开

640?wx_fmt=png


这个类通过类名不难看出只是一个闪屏,我们要分析的应该不在这里,所以不用太关注,大致看下代码就行

 

640?wx_fmt=png

在oncreate最后执行了这个方法,看来是跳到了

640?wx_fmt=png


640?wx_fmt=png

定位到SplashScreen类中

640?wx_fmt=png

看起来也是一个闪屏,但是里面有一些初始化和加载so的操作,进入到MobileAuth.init(this);发现走进了这个native方法里。

640?wx_fmt=png

暂时先不管他了,继续往下一个activity看。也就是OnyxActivity类;先看onCreate方法中:

640?wx_fmt=png


也没有什么可以一看看出来的验证方法。懵逼,因为游戏并没有闪退,只是黑屏,看异常看不出有哪里出了问题,所以我在这些方法下面插入log,看执行到哪一个时候卡住了。

640?wx_fmt=png

为了防止寄存器使用乱掉出错,这里直接在原来基础上+2,增加两个寄存器,增加自己的log代码

640?wx_fmt=png

然后再次打包运行,发现卡在了10之后,11没有被打印出来,而且前面的日志重复输出,说明一直循环卡死了。

invoke-virtual {v2, p0},Lcom/ubisoft/OnyxEngine/OurpalmChannel;->Init(Landroid/app/Activity;)V

进到这个方法看看

640?wx_fmt=png


看着像是广告和支付的初始化,这个方法里有两处初始化地方,在这两处加完log信息后发现卡在了

Ourpalm_Entry.getInstance(mActivity).Ourpalm_Init("2","1.0", "1.0", mListener);

进去之后我的内心是崩溃的,这么多代码看的我头大,真的不想再一个个打印了,还好猛地看到了RunSign这个jni方法,熟悉的味道,先看看这个方法

 

640?wx_fmt=png


就是他

640?wx_fmt=png


打开IDA拖入so,方法在libourpalm_sdk_a.so内

640?wx_fmt=png

640?wx_fmt=png


到这儿几乎一目了然了,是做了dex+签名的效验

640?wx_fmt=png

在checksign这个函数内也发现了退出游戏的代码位置,既然这样我们直接选择简单的操作方式给两个跳转nop掉。

640?wx_fmt=png

 

640?wx_fmt=png

把上面的两条改为:C0 46(也就是NOP)

640?wx_fmt=png


改完后,再次重签名,安装,完美运行。

640?wx_fmt=png


接下来定位支付位置:其实刚刚分析代码时候已经大致看到支付位置了。为了确定还是分析下。刚刚分析到OurpalmChannel类时候,可以看到这里他自定义了一个 ourpalm.tools.android.logs.Logs类

640?wx_fmt=png

点进去看下

640?wx_fmt=png


这里我们把isShowLog的赋值改下

640?wx_fmt=png

这里初始化时赋值改为true,再次打包运行游戏,点击支付,成功打印日志:

640?wx_fmt=png

支付页面,我们没登录

640?wx_fmt=png

log日志页面

640?wx_fmt=png

下面这个pay方法也是这个类中

640?wx_fmt=png


这就对上了,说明是这个支付方法。写过支付的人应该都知道,支付的回调一般在handler或者提供的接口中,这里可以看出来他传入了mListener这个回调接口,我们看下这个接口初始化的地方

640?wx_fmt=png


640?wx_fmt=png


点进去OurpalmIAPListener中看下

640?wx_fmt=png


这里就能看到支付成功的位置了,就是

OurpalmChannel.PayResultCallBackNative(true);

和上面的支付失败也就是true/false的区别。至于为什么不是下面的那一堆。我看了下方法内部走到最后是一些统计的东西。然后我们在执行pay的那里,执行这个成功方法就行了。

640?wx_fmt=png


再次打包运行。点击购买,成功获得

640?wx_fmt=png

 

严重说明

本文的目的只有一个就是学习逆向分析技巧,如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系,本文涉及到的代码项目可以去编码美丽小密圈自取,长按下方二维码加入小密圈和作者一起学习探讨技术

640?wx_fmt=png



手机查看文章不方便,可以网页看

http://www.520monkey.com


《Android应用安全防护和逆向分析》 

 点击查看图书详情

640?wx_fmt=jpeg

长按下面

猜你喜欢

转载自blog.csdn.net/f0ed9czn4ly992g/article/details/80504442