一个简单的安卓游戏内购破解
作者:互联网
综述
一个简单的安卓游戏内购破解,主要用于熟练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重新安装,打开游戏后,我们发现游戏内钻石购买机制被破解,即使购买失败,也能获得相应的钻石。
注意因为此游戏的购买机制全部在客户端判断执行,即所谓的内购,所以这种简单的方法可以达到目的,如果对于购买机制在服务端判断执行的游戏,如果要破解,就需要抓包分析其数据包结构,从而构造指定结构的数据包发送给服务端。
标签:内购,case,游戏,安卓,Killer,破解,apk,购买,smali 来源: https://www.cnblogs.com/hell--world/p/11964398.html