前一段有个微信小游戏特别火爆,很多朋友都在玩儿,当然各种游戏修改攻略也是满天飞,有的是修改了小程序的源码,有的是爆破了协议等等。
这次脱离代码,单纯从抓包的角度分析一下该小游戏。
一、抓包
Android、iOS皆可,这里我用iPhone和charles进行分析。具体怎么配置抓包的过程就不写了,网上很多详细的介绍。
数据相关的请求都在这个域名,所以我们可以过滤下域名,只看想要的结果。
二、分析
开打小程序后,可以发现上图中的这些请求。比较重要的是下面几个:
获取id的接口: /api/auth/get_openid
获服务端数据的接口: /api/auth/get_openid
上传数据的接口:/api/archive/upload
请求类型为POST
接下来试玩一局,当游戏结束后,会继续请求上传数据的接口。那么到这里,我们就可以根据请求大概了解它的数据存储了过程了。
打开小程序 >>> 获取id >>> 获取服务端数据(无数据给默认值,相当于新用户) >>> 更新本地数据 >>> 上传新的数据。
通过对比,可以发现,第一次打开小程序时,返回的数据和上报的数据内容是一致的。所以如果这里的校验不充分的话,就会造成数据被随意修改的“漏洞”。通过实地测试发现,本地数据是可以覆盖掉服务端的数据,至此数据的修改就可以分为两个方向,一是request的修改,二是response的修改。
1、request修改
修改request其实就是模拟协议请求,需要得到用户的id以及app的secretKey和加密方法等。就是文章开头说的彻底扒掉小游戏的底裤,迁移出关键key和加密算法,用其他语言实现。这种方法比较彻底,可以远程批量操作,并且不需要登陆微信账号。这也是一些淘宝店刷金币、改钻石的方法。
2、response修改
利用charles,修改返回值,然后利用客户端上报数据。这种方法的好处就是不用关心请求的加密过程,不要知道内部逻辑,只修改数据即可。不足之处是,只能单个抓包进行,不能大范围批量应用。
三、实例
先看一下具体的返回值,可以看到主副武器级别、伤害值、最高关卡、金币、钻石等数据。
利用charles的rewrite或者map local功能,可以轻松的对这些数据进行修改。比如该实例中,将主副武器飙到满级1280,射速360,90亿金币等等。
最后,看一下实际的运行效果:
主武器和射速
副武器、金币、钻石等
玩了几把,成功实现了“防沉迷”,因为等级高、武力强、金币多,显得略微无趣。
四、总结
通过这个例子,最主要的收获是注意到什么样的方式存在风险。例如自己的产品有一个新功能开发出来,会不会也存在类似的“漏洞”。相反大家都看的到的“漏洞”又是不是真的漏洞呢。。。。。。