Android逆向之旅—破解”穿靴子的猫”游戏的收费功能

BrigidaFent 7年前
   <h2>一、游戏收费分析</h2>    <p>游戏收费很正常的,但是玩游戏最恶心的就是你还没玩就要充值,很恼火,其实我不怎么玩游戏,主要是给小孩子们弄,比如现在好多小屁孩们喜欢玩水果忍者这个游戏,但是这个游戏在没有开始玩的时候就弹出个收费的界面:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bd4872559f5c53be1c3ced0eed46a827.png"></p>    <p>这个是不可忍受的,虽然支付费用不是很多,但是还是不想支付。这个对话框是强制性的,当点击取消就退出游戏了,所以这里必须支付成功了才可以继续玩耍。</p>    <h2>二、寻找破解入口</h2>    <p>前面已经看到了这个游戏入口收费场景,下面咋们就把这个功能给去掉即可,从以往的破解经验来说我们有几百种方法把这个东西干掉,比如:不然这个收费解密展示,修改取消之后的逻辑代码不让其退出游戏等。都是各种手段。本文就简单点做,直接让这个界面不展示。操作很简单,这个游戏没有加固,首先用apktool工具反编译,因为要找到这个界面入口,我们可以通过字符串进行搜索即可,反编译之后在 <strong>values/strings.xml文件中找到“好友代付”这个字符串</strong> 内容:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c65d7ec7fface3d64837ba9484043ab5.png"></p>    <p>找到之后,看到这个字符串的id是:gc_billing_net_contacts,这里可以不用在通过public.xml中的id值转化得到对应的int类型值,再去搜索了,可以直接到jadx中进行搜索即可:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c6c59b0547db4855e0a405736c53814f.png"></p>    <p>这里看到有一个BillingView类,从命名可以猜想这个应该就是上面那个收费的页面:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/99d92e32f77edcb4b0ce6f6c40808059.png"></p>    <p>这个视图继承了LinearLayout布局,具体实现这里就不截图,从View的代码实现可以确定就是上面的收费页面,在看看这个类在哪些地方有调用:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c26972bc75c0be81be924d14ad5d4e35.png"></p>    <p>到这里看到应该是两个地方,一个是BillingActivity类,一个是GameInterface类,那么就有两个分析路线了,这里用一个巧妙的办法直接定位到是哪个类,假如是BillingActivity类,那么当前的topActivity就是他,我们用命令查看当前设备的topActivity看一下: <strong>adb shell dumpsys activity top</strong></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/897c161107f44e7d3a06970ea9c2258b.png"></p>    <p>这里看到并不是BillingActivity类,所以可以断定,处理收费的页面是在GameInterface类中,那么直接进入这个类的getBillingView方法中:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f547a63950cd16cf25dd1232edb384b6.png"></p>    <p>然后查看这个方法在哪个地方被调用了,这里如果发现Find Usage菜单不好使,也可以直接全局搜这个方法:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9d42541715ed8bfce6cae93de9f3c1f1.png"></p>    <p>这里看到有两个地方用到了这个方法,依然是按照上面那个topActivity判断,不可能是DGCPaymentActivity这个类了,所以直接看下面那个类,点击进入即可:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/222d642057608ecf5fdb4c0ff0810de6.png"></p>    <h2>三、屏蔽收费入口功能</h2>    <p>到这里就清楚了,这里通过一个Dialog来进行展示的,设置Dialog的contentView即可。所以找到展示的入口了,干掉这个入口就简单了,找到对应的smali代码,直接注释这行show代码:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/79e7db975a3b5ae46e9d398707017f28.png"></p>    <p>然后在回编译重新在打包即可,不过可惜的是,运行时报错的:</p>    <p><img src="https://simg.open-open.com/show/135994e76858466ed092f5dddd100ca5.png"></p>    <p>这里搜了一下,没有好的处理方法,最后直接把整个方法代码全部干掉,让这个方法称为一个空方法,直接用一个指令替换原来的代码即可: <strong>return-void</strong> ,直接方法返回:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d137da83a627e53a1999f4a4ed4ffb84.png"></p>    <p>然后再次回编译打包即可。这次就看不到那个收费的对话框了。</p>    <p>严重声明:本文的目的很单纯只是为了介绍逆向技术,绝没有任何商业目的,如果有人将此文技术用于商业目的带来的任何法律责任将由操作者本文承担,和本文内容作者没任何关系,也由衷的希望各位能够秉着技术学习的态度阅读此文,非常感谢!</p>    <h2>四、总结</h2>    <p>本文就简单的介绍了如何去除游戏中的收费功能,顺利进入游戏玩耍,可以看到本文的篇幅很短,其实这个破解流程非常简单,适合初级逆向爱好者入门练习功能。</p>    <p> </p>    <p>来自:http://www.androidchina.net/6275.html</p>    <p> </p>