作者; 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)函数
[注意]APP应用上架合规检测服务,协助应用顺利上架!