您的位置:首页 > 移动开发 > Android开发

破解安卓软件中金币数量的限制以及反编译安卓软件的思路

2013-06-13 18:43 591 查看
依然是我们信息安全大赛的题目,那道题给了一个安卓APK程序,安装完毕后打开有一个你当前的金币数,你需要修改你拥有的金币数到所需要的数量购买题目的key,修改到所需金币数后购买key,即可达到题目的要求,获得key。

既然是修改金币的数量,那在这个程序中肯定会有一个比较大小的语句

如果是某些安卓软件的功能限制,那我猜测一般应该是某些功能被该软件默认设置为“false”,或者是把功能限制的语句设置为“true”。但是在商业软件中我认为应该不会在程序文件中做手脚,应该在程序的配置文件中做修改,就像破解ios的软件一般都是修改.plist文件一样。

现在进入正题

要修改一个编译后的应用程序,无论是电脑还是手机,第一步肯定是反编译。

还好安卓只是把一堆资源文件和程序文件封包为APK文件,比电脑上EXE文件简单方便多了。

网上有很多反编译APK的程序,比如APKTool、ApkIDE等,不过我觉得最方便快捷的还是ApkIDE。因为APKTool只是一个单独的编译、签名的工具,而且是运行在命令行界面的。ApkIDE拥有友好的用户界面,而且它集成了APKTool、jd-gui等软件,一站式处理。


        


上面是两款软件的界面。

我个人更偏爱APKIDE,因为使用方便功能多。。不用手工再去找一堆工具。

现在那我就以APKIDE为例来说一说。

1.首先用该软件打开需要修改的APK文件(废话)PS:使用这个需要安装JDK,如果没安装绿色版也可以。

2.打开软件并且等待软件反编译完成后,会在左边的项目那里显示以下一些文件或文件夹:res文件夹、smali文件夹、AndroidManifest.xml。res文件夹显然是资源文件夹,里面存放了程序的图片和显示的文字等各种信息,程序文件夹在smali内。

3.逐级展开smail文件夹,发现里面又有android、syclover文件夹,据我推测程序文件应该在syclover文件夹内,android文件夹应该是程序正常运行所需的基本代码。那就打开syclover文件夹。

如图:


4.在修改之前,我们必须要熟知该程序的运行效果,所以我们先看看这个程序。



需要999个金币购买,但是我们现在只有99个金币,那试试看输入999点击购买会发生什么。



说明在判断语句中将程序跳转到了显示信息,而不是购买key处。那现在我们来寻找判断处在哪里吧。

5.我们打开java源码后搜索那句提示看看那句话在哪里,于是在a.class中找到了这句话。



那没错的话就是这里了,由于jd-gui智能查看代码不能编辑,所以需要编辑a.smali文件,但是smali文件不是标准的代码也不是机器码,好像是一种中间语言,看不懂,那怎么办?



在这个smali中发现有很多0x开头的东西,这个明显是16进制,那么既然有16进制数那我们也搜索16进制数。由于我们需要把99个金币改为999或者更多的金币,那我们先找到这个值在哪里。

99的16进制数是0x63,那我们搜索这个16进制数。不出所料,找到了



既然要改成999个金币,那么将这里修改为999的16进制数即可,999的16进制为0x3E7。



修改完毕后保存再进行编译。

6.将编译完成的APK文件进行安装。在手机上或模拟器中运行,得到key。



购买成功。

可能有人会问为什么上面写得余额还是99?因为我没有修改res文件夹里的xml文件,屏幕上显示的一些信息是存放在res文件夹里的xml文件里,就比如说这个99



这些屏幕上直接显示的文字存放在这里,但是你修改这里的值是没有用的,他不包含在程序里。

至此这个修改金币的程序就破解完毕了。

破解安卓软件要比EXE文件简单很多,因为这个可以直接反编译成源代码,可读性比EXE反编译成的汇编要容易很多。

这道题目的思路就是既然有判断金币数量这个功能,那必然在程序中有比较大小,然后跳转的地方。整个反编译的过程不难,拿工具打开就行了,重点就是找到这个跳转点,然后修改这个值。由于不能直接修改反编译出的java源码,还需要想方法修改这部分源码。

这些大致就是破解金币数的思路了,我相信修改一些游戏的默认金币数什么的也是差不多的一个思路。

要是有不正确或者不妥的地方欢迎各路大牛之处,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息