作者; Yaara Shriki,Roman Zaikin
有些人可能注意到今年的愚人节上,谷歌在IOS和安卓的谷歌地图上添加了一个贪吃蛇的小游戏。
我们的研究团队在研究最新安全威胁外,也沉迷在这个小游戏中,在不断的Game Over之后我们开始思考——能否修改游戏来获得胜利~
所以我们当中有人决定逆向分析一下APP,简单来说他们很快就取得了成功——既永远不会死亡,又弄出了一个简单的AI来自动进行游戏。
在这篇文章中,我们会具体讲解下实现的过程:
首先我们在Genymotion虚拟机中运行APP,然后找到位于菜单右上方的贪吃蛇游戏。
初步来看游戏是通过WebView渲染的,所以我们通过Chrome开发者工具来远程调试它
然后我们跳转到网页中发现只有sources标签中的一个名为v18.js的交互Javascript文件。仔细研究这个文件,我们发现了一些有趣的函数。
首先是函数fa(),表明地图共有20*20个格子
this.height = this.width = 20;
我们的主要目标是找到并修改判断我们撞到墙或者吃掉自己的游戏失败的函数,从而使我们不会Game Over。正如我们之前看到的一样,width和height变量对应了游戏地图的大小,所以我们搜索源码中的width和height可以看到F(a,b)函数
F(a,b)函数看起来是用于判断我们贪吃蛇的身体是否在地图内的,一个思路是移除判断条件使得返回值永远是真,从而让我们穿过墙也不会死亡。
要验证这个思路,我们首先将控制台中的F(a,b)函数修改成如下:
现在玩游戏的时候穿过墙旧不会死亡了。
上帝模式效果
尽管这里已经解决了游戏失败的问题,但我们还需要考虑下怎么玩游戏的时候顺便得分,所以逆向分析调用栈,可以看到多次调用了函数wa(a),如果我们仔细看下这个函数,可以看到它是个递归请求动画框架的函数。Wa(a)调用函数xa(a,b)和ya(a),渲染了游戏中的部件(地形和人物)以及地图。
来看一下xa(a,b)函数
可以看到它包含了两个参数a和b。a对应的全局变量Q包括了游戏的各种信息,比如表示地图大小的数组和地形M,人,地标K。这个函数也负责计算我们的得分并存储到c,i(对应Q,b)中。
地图数组
对应着的游戏地图
游戏地图
Xa(a)函数还调用了函数sa(a)来生成随机的人物坐标。如果我们同时调用多次该函数,那么我们可以创建多个我们想要的人物模型。
调用的sa(a)函数
就像这样:
多次调用后的效果图
注意如果我们同时调用多次sa(a)函数,那么贪吃蛇碰到人的时候,分数不会变化。这是因为ka(a.b)函数还调用来判断吃到人的得分。所以我们还需要需要这里的函数,使得它每次调用的时候都会给我们加10分并显示到屏幕上。.
更新函数
训练的数据列为Q,b,o,b,第一个元素对应第一个训练数据
训练集数据
然后我们来创建一个简单的AI脚本
AI逻辑图
代码下载:
https://github.com/romanzaikin/Google_Maps_Snake_Hack
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法