一个简单的安卓游戏内购破解

综述

一个简单的安卓游戏内购破解,主要用于熟练smali汇编以及相关工具的使用

使用工具

夜神模拟器v3.8.3.1

Andriod Killer v1.3.1.0

分析过程

使用夜神模拟器安装该游戏程序,打开游戏商城,发现本游戏主要货币是钻石,钻石需要通过话费充值获取,在未破解的情况下,点击购买,钻石购买失败,具体情况如下图。

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

 

使用Andriod Killer v1.3.1.0打开该程序,通过初始页面工程信息选项卡下的入口链接,可以直接找到该程序的入口类对应的smali文件。

一个简单的安卓游戏内购破解

 

点开工程管理器选项卡,可以看到整个apk文件解压后的文件结构,其中可以找到很多重要文件,比如保存着app配置信息和全局信息的AndroidManifest.xml文件

因为本次破解目标是游戏的购买机制,所以在工程搜索选项卡下搜索"购买"字符串,需要注意的,需要将字符串转为unicode码进行搜索才会有用。具体过程如下。

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解一个简单的安卓游戏内购破解

 

搜索到只有一个文件,该文件中有三个地方的字符串与购买相关

一个简单的安卓游戏内购破解

 

将鼠标移动到smali代码的中的字符串上,工具会自动将unicode解码出来,发现该三处字符串分别与取消购买、购买成功,购买失败相关,并且如果将鼠标移动到smali指令上,工具还会给出该指令的解释,从而方便理解smali代码

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

 

此时可以通过Android Killer提供的反编译工具,将当前smali文件转换为JAVA源码,以方便阅读,注意此时得到的JAVA可能存在问题,可以多尝试使用几个反编工具(如JEB、GDA)对smali进行反编译,从而得到更好的JAVA代码。

从JAVA代码中,我们看到整个函数的是一个switch-case结构,根据函数参数(paramInt)的不同,从而执行不同的分支,而购买成功与购买失败的字符串就出现在相邻的分支中,如下图。

一个简单的安卓游戏内购破解

 

回到Android Killer的smali汇编中,我们发现购买成功对应的case值为pswitch_0, 购买失败对应的case值为pswitch_1

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

 

此时我们大胆猜测,能否通过将两个case值呼唤,从而让购买失败情况下执行购买成功的代码呢?

一个简单的安卓游戏内购破解一个简单的安卓游戏内购破解

 

如上图,我们将两个case值互换,ctrl+s保存修改,因为改变了程序原有的代码,所以需要将apk程序重新打包,此时可以使用Android Killer中的编译功能,该功能可以将app重新编译打包,并重新签名,从而生成一个新的apk文件。

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

 

根据生成路径,找到新的apk文件,将模拟器中原本的app卸载,然后使用新apk重新安装,打开游戏后,我们发现游戏内钻石购买机制被破解,即使购买失败,也能获得相应的钻石。

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

一个简单的安卓游戏内购破解

 

注意因为此游戏的购买机制全部在客户端判断执行,即所谓的内购,所以这种简单的方法可以达到目的,如果对于购买机制在服务端判断执行的游戏,如果要破解,就需要抓包分析其数据包结构,从而构造指定结构的数据包发送给服务端。

上一篇:如何通过代码插桩的方式在任何apk添加自己的逻辑代码


下一篇:android-Dalvik字节码中的“输入”和“输出”是什么?