免责声明:本文只是从技术的角度去探讨游戏当中的缺陷,任何组织与个人不得利用本文中的内容从事非法活动,请不要传播或利用本文中提到的漏洞,否则后果自负。
Pokemon Go是最近比较流行的基于AR和LBS的收集向游戏,老牌IP号召了一票玩家。游戏目前bug较多,这里讨论的是0.29.0版本以及在安卓平台下的反mock GPS的机制。
在未阅读过源码之前,一下的分析都基于实际测试结果,也就是黑盒测试。
目前已知的情报有:
1.游戏中存在检测伪造gps信息的机制,目前来看是只在客户端,至于服务端有没有无从而知
2.当游戏检测到用户正在使用mock gps之类的软件的时候会显示“failed to detect location”之类的字样,并终止与服务器端的交互
3.重启游戏可以解决上述问题
4.游戏的检测程序应该是写在了resume事件里,也就是当你从其他程序切换回游戏的时候会检测
5.游戏代码中有多个地方进行了gps定位,一类是定时的,也就是每隔一段时间定位一次,一类是事件出发的,也就是再你抓完精灵或者点完商店后定位
基于以上几点推断,可行的hack方法有很多,这里只介绍一种可行的:
先上一个图
由上图我们可以看出:
1.这个hack是利用了伪造软件修改完gps缓存和系统重新获得当前位置的时间差
2.伪造gps软件的开关时机很重要,如果关闭后系统重开了gps服务,则缓存中伪造的位置将被新的真实位置覆盖。
3.如果hack成功,游戏会显示“gps signal lost”之类的提示,即当前的gps服务正在重启中,游戏会读取缓存的位置,也就是我们伪造的位置
4.如果hack失败,游戏会显示“failed to detect location”之类的提示,也就是伪造软件关闭的慢了,在切换回游戏的时候被游戏发现了,遇到这种情况只能重启
5.总而言之,这种方法并不能保证100%的成功,伪造软件的开关时机很大程度上决定了是否能成功。
最后谈一下如何防范这类hack:
如果用户一直hack成功,这类hack是比较难防范的。对服务器而言,用户的行为是gps信号丢失后出现在了另一个地方,这种情况很常见,例如用户进入了建筑物或者信号差的区域,所以很难从逻辑上筛选出哪些用户是伪造了gps。如果以用户在一定时间内的移动距离作为依据也不妥,伪造者可以在小范围内伪造位置,而且也会有正常用户进行换号互刷的情况(例如你在中国,让美国的的朋友帮你玩)。
如果hack失败,目前的惩罚是重启游戏,这并不耽误太多时间。合理的措施应该是禁止登陆一段时间。目前看来可能是游戏厂商还有许多的debug和feature要做,所以只是简单的防范了一下一直开着伪造软件的用户,并未想到有用户利用gps缓存去hack。
有疑问加站长微信联系(非本文作者)