
也许您注意到了4月1日,Google将交互式游戏“ Snake”添加到了适用于Android和iOS的Google Maps应用程序中。
Check Point专家通常致力于研究最新的网络威胁,但他们对这款游戏非常感兴趣,但是由于损失,他们感到非常沮丧……所以有一个合理的想法:为什么不破解它!
因此,我们最顽皮的员工开始考虑使用远程调试进行应用程序的反向开发。 总的来说,他们做到了,不久我们就成功完成了永不丢失的任务-甚至添加了一个可以玩游戏的简单AI。
在本说明中,我们将详细介绍该hack。
首先,我们通过Genymotion在虚拟设备上打开了应用程序,并启动了“ Snake”,它位于右上角的菜单中。
游戏似乎正在WebView中显示,因此我们在Chrome开发人员工具中开始了远程调试:

然后他们转到该站点,并在“源”选项卡上找到了v18.js文件,其中包含一些有趣的功能。
首先,
fa()函数启动20×20字段:
this.height = this.width = 20;
我们的主要目标是找到并更改一个函数,该函数确定蛇何时撞向墙壁或撞向自身,以防止丢失蛇的可能性。
width和
height变量表示运动场的尺寸,因此我们在源代码中查找
宽度和
高度 ,并找到
F(a,b)函数:
看起来
F(a,b)正在检查蛇的身体坐标是否在该字段内。 一种选择是完全消除函数中的条件,以便它始终返回真相,从而将我们转移到“上帝的政权”,在这里我们可以不死而穿过墙壁。
为此,我们按下了远程控制台中的“
检查”按钮,并将功能
F(a,b)更改为以下内容:
现在我们可以穿过墙壁了:
图 1.神模式这一切都很好,但是我们仍然必须玩游戏,亲自接人来赚取积分。 下一次破解将解决此问题。
在调用堆栈中有许多对
wa(a)的调用。 如果我们研究此功能,我们将看到它是递归的,并且负责查询动画帧。
wa(a)调用函数
xa(a,b)和
ya(a) ,分别显示游戏片段(火车,人)和场。
考虑函数
xa(a,b) :
它有两个参数:“ a”和“ b”。 第一个是全局变量Q的一部分,它包含有关我们游戏的有趣信息,包括表示运动场的数组(图2),在其中我们看到火车(M),人和物体(K)。 该函数还计算分数并将其存储在ci中,这也等效于Qb
图 2.比赛场地的排列此数组对应于此字段:
图 3.比赛场地xa(a)也指图中的函数
sa(a) 。 4,每次创建新人员时都会生成随机坐标。 如果多次调用该函数,则可以根据需要创建任意数量的人(图5)。
图 4.调用函数sa(a)像这里:
图 5.函数调用,在地图上创建任意数量的人请注意,即使您多次致电
sa(a)并接过该人,分数也不会改变。 选择乘客时,图1中的函数
ka(a,b) 6.因此,需要对其进行更改,以便她每次通话都可以增加10分并在屏幕上更新分数。
图 6.更新的功能火车各部分的坐标在Qbob中指示,其中第一个元素是火车中的第一个拖车。
图 7.货车车厢这将是创建简单AI所必需的。 让我们从他的逻辑开始:
图 8. AI逻辑蛇是状态机(state machine):
- 在X = 19时,我们下降到Y = 19。
- 在X = 19和Y = 19时, 左移至X = 0。
- 我们将之字形传递给状态机:
- 向上一个单元格, 向右至X = 18。
- 向上移动一个单元格,然后剩下 X = 0。
- 返回步骤A。
- 在Y = 0处, 右转到X = 19。
- 返回步骤1。
完整的代码发布
在GitHub上 。
影片: