本帖最后由 听鬼哥说故事 于 2014-8-22 10:55 编辑
从开发转到逆向 破解,开始准备写博客后,朋友们说,想看一些好玩的游戏分析过程,简单一点,最好是会开发的人员能完成的,那么本篇就不讲反编译追踪代码实现方式了,写给一些开发者朋友来对自己喜欢的小软件进行破解。 在flappybird火了一阵子之后,又出来一些小游戏,使得部分人爱不释手,欲罢不能,在游戏出来以后,我也玩了好长一段时间了,看着空间里面整天有人晒着自己的得分,那么咱们就一起来看一下,如何实现刷分的过程。
0x01:简单试玩一下,体验游戏乐趣我们试玩的图,简单记录一下相关数据。
界面清新,操作简单,是我们休闲娱乐的消遣品,那么我们就开始分析一下分数上面的控制了。
0x02:游戏分数的相关设定通过我们试玩了一下,了解到游戏分数是根据玩的时候的数字相加得到。例如最初只有两个方块数值为2,那么这两个方块合成一个方块后数值为4,那么当前的得分也就是4,所以我们明白这个之后,就可以想一下是不是可以通过将初始化的数值变大一点,那么相加后分数自然后变大了,分数不就更高了嘛。 通过玩了几次游戏以后,我们可以发现,在游戏未失败情况下推出游戏,再次打开会还原到上次玩的游戏进度,所以了解到这一点很重要,因为我们这样就可以推测出游戏是通过数据储存来恢复上次游戏进度的,那么我们就开始继续分析了。 数据存储方面,我们首先是观看当前包名下的,data/data/com.aa ,类似这样的,用到这里就是data/data/com.estoty.game2048。那么我们在shell下进入查看一下:
可以到到files文件夹,对开发者朋友来说,那么很容易理解这个文件夹所代表的含义。我们在程序中如果往本地存储一些文件,一般都会存储到这里的。如: FileOutputStream fop=null; fop = c.openFileOutput("love", Context.MODE_PRIVATE);
这样就是简单的在本地files目录下创建一个名称为love的空文件了。 好了,言归正传,我们就切换到files下查看一下相关内容:
看到这个图,发现文件下面还是有很多内容的啊,那么具体是哪一个呢?本文暂时不讲反编译从代码中找如何储存,那么我们就全部拿出来。 使用cat命令来复制吧,如果手机安装了busybox的话,试试copy是不是更方便。如: cat saveOriginal.plist>/sdcard/l.plist 将文件创建在sd卡上 然后直接从sd卡pull出来,或者用第三方工具如应用宝之类拿出来即可。 通过查看所有文件,我们发现了目标:
通过这个图,我们可以发现这是简单的xml文件方式来储存数据。 一个个键值对形式的,还是比较容易读懂的。 上下文浏览一下这个文件,可以推测出红色标注的key为游戏中每个方块中代表的数值,而array为这16个方块数值放到的一个数组。 我们对照试玩的图来看一下,游戏前两行:
第一个数据存在,为4,对应:
推测:第一个string为位置,第二个string为方块的数值,即2的次方。 验证:我们拿第一行第三条数据来验证: 数值为2
我们可以看到我们的猜测好像是正确的。 但是我们要保持严谨,继续验算,将后面的数据都验算一遍。 最终发现我们的推测是正确的,那么也就证明这个文件,是存储数据的核心文件。 下一步,我们就讨论如何来进行操作。
0x03:准备动手操作通过前两步的分析,我们已经渐渐有了眉目。 我们需要做的,就是把这个文件进行修改,然后重新替换到那个文件夹下即可。 那么我们就先进行修改,将每个dict中第二个数值进行修改,这里要记得数值的计算是2的次方,所以这个数值不要太大,写个10就行了,也就是1024。 首先就是创建安卓工程了,这里不多叙述那些,直接进行核心方法的讲解。 我们因为是需要替换文件的,所以得先把原文件放到一个位置,一般都是放到assets目录下。
看到这个方法,相信已经明白了我们已经进行的操作了。
0x04:将代码加入到原游戏中其实不管是开发还是破解,掌握一点反编译的小技巧还是很有用的,比如项目中使用到图片资源之类,查看下对方软件是如何使用的某种效果,模仿一种算法,都是需要自己动手操作的。 上面那个算法写好后,我们调用一下:
调用是很简单的,然后我们就运行一下这个apk,查看是否正确,文件生成是否可用。 测试正常后,我们拿出来这个apk,在bin目录下是未签名的:
将其反编译,对应到刚才那个类里面找到算法:
从这里开始复制,到end结束
然后我们反编译2048的游戏文件: 从AndroidManifest.xml文件中找到游戏的主类,进去 Lcom/estoty/game2048/game2048: 找一个空白位置复制进去我们的算法
然后回到我们写好的软件中,找下这个方法的调用:
这样复制过去以后,我们需要注意一下刚才复制的内容,因为一些方法的调用是this,也就是当前类,我们直接复制过去肯定是空指针,所以需要修改Lcom/ggz/cunda/MainActivity为当前类,也就是替换所有为Lcom/estoty/game2048/game2048,好了,这样弄完后,我们回编译软件,安装测试一下即可。效果图如下:
0x05:其实我们有更简单的方法的
1.既然我们有root权限,那么我们就可以更加简单的在命令行下来操作文件的替换过程了 2.我们要写代码,那么直接new一个process执行下命令就行了
第一种方法很简单,我们就不叙述,下面说第二种,写好的代码如下,很简单: 我们先将那个文件复制到sd卡上面即可。
看完代码,大家也都明白了,代码很短,不再讲解了。 使用这个方法的好处,就是我们可以自己玩游戏,然后想刷分的时候,直接执行我们另外一个软件来操作2048即可,简单,实用。
0x06:结束语
写了这么多,结束语就不说了。。。
小游戏消遣玩玩而已,想刷分的话,就可以直接自己操作了,无聊的时候还是可以打发时间的~
博客没啥内容,顺手贴上一下了,不符合此版规定删除即可:
http://blog.csdn.net/guiguzi1110
|