本文已参与「新人创造礼」活动, 一起敞开掘金创造之路。

前两天和同事谈天,同事A说,同事B也在玩羊了个羊啊!当时的我一脸懵,羊了个羊?是个啥?

羊了个羊?

可能我不太关注微博,从他人那儿才听说到这个游戏,那我有必要紧跟潮流啊!于是我就翻开微信小程序搜了一下《羊了个羊》这个小游戏。不得不说,这游戏真上(xia)头。刚翻开的时分,我心里想的是:“就这?”,然后进入第二关,一开始还没觉得什么,直到后面,我感觉到了不对劲。大约刷了七八次,我就抛弃了。然后过了一个小时…不可,我今天必定要把它通了!大约又刷了七八次,这什么破游戏!坑爹呢!

说实话,这个游戏,一开始我是看不上的,我以为这个游戏的真实厉害的当地,在于方块堆叠的规划,看似没有多少层,可是扒开一层,却发现还有下一层,当你觉得你越来越接近最终一层的时分,实则还在差的老远了;其他,看似随机打乱的方块,实则也需求精打细算每一步。我不知道真实通关这个小游戏的人有多少,但至少,我是没那个耐性的,大家尽可放心,不能通关这个游戏,只能证明这个方块的随机性和摆放的规划非常奇妙,并不能证明智商高低,至少从程序的角度来看,无非便是随机打乱而已。

直到后来,无意中看了他人的通(po)关(jie)教程,才发现本来这个游戏,还有另一个玩法

漏了个洞?

老实说,尽管我是做服务器的,可是在我印象中,以为微信小游戏仍是相对比较安全的,究竟有微信的加持,小程序的代码加密,混淆,加壳之类的安全确保应该会有吧?服务器端的话,接口的发送频率,幂等性判断,token校验,重发包,数据防护,包体加密等的防护也应该会有吧?可万万没想到的是,我在网上刷视频的时分,竟然也会刷到这类的破解视频,而且破解刷分的原理,也是简单到离谱。我猜想,可能人家小团队,也没有想到这么小的游戏会有这么高的热度?

本地修正

这是我第一个看到的破解方法,办法简单到离谱。几年前,我也用cocos写过一些微信小游戏,赚了一些小零花钱,尽管过去了一段时刻了,但也还记得一部分。这个破解办法,也让我一眼看出来它是cocos写的。

直接通关

本地修正尚且需求修正文件,而且还要手动玩一下才干通关,接下来这个缝隙,就稍显严峻了。
微信小程序实质是基于html+js的h5应用,只不过经过微信的一层封装,摇身一变,成了微信小程序。它的实质仍然是h5应用,既然是h5应用,那么恳求和获取服务器的数据就必定是经过http恳求。http的抓包工具又遍地都是,所以咱们很容易就能抓取到咱们在玩羊了个羊的进程中的一切恳求数据。
假如咱们通关一次羊了个羊,并进行抓包,就会发现,整个游戏进程都是单机进行,而且在游戏完毕后向服务器恳求了一个接口,这个接口姓名叫做game_over。这就相当于,咱们在自己手机上通关之后,再告诉服务器“我通关了”,服务器再记载下你的通关信息。

既然这样,咱们岂不是能够省去手机上通关的进程,直接告诉服务器“我通关了”

还真就能这样!乃至直接运用get恳求就够了!经过抓包咱们能够看到,它的通关恳求里,实际上是有带有一些参数的,为了不让服务器发现反常,咱们也无需修正这些参数,只要让它帮咱们记载通关数据即可。可是这些参数里并没有玩家相关信息,那么它怎么知道我是谁的呢?

这一点还算稍微有一点门槛,“有一点门槛,但不多”。在web开发中,最常用到的一个表示用户身份的东西叫做token,这个东西是一个临时身份认证,就像一个临时身份证,在它失效前,你用这个临时身份证,就能够代表你是谁,一旦过期,那么我就不知道你了。在羊了个羊这个游戏中,也有一个用户token,这个token是由微信给你分配的,不过它并没有放在恳求参数中,而是藏在了http恳求的header中,一切的恳求的header中,都有一个叫t的值,它乃至不用token来作为变量名。不过看着这个乱序的字符串,大致也能猜出来, 它便是token。

而通关这个接口,就需求带上这个“t”的值。这样一来,服务器就能记载上你通关了。而这个接口,你恳求几回,服务器就给你通关几回

其他破解

以上两种是我见到的最常见,操作也相对简单的破解办法。其实还有其他的破解方法,我就没做太深化的了解,因为大致原理其实是差不多的。比如有看到说能修正小程序的js代码,具有无限道具的。乃至有能经过接口修正其他任何人的省份的(假如你发现的归属羊群一直在变,很可能是他人在反复修正你的定位)。
总的来说,办法都迥然不同,关键在于游戏自身有没有对这些安全性做维护。

反了个思!

打趣归打趣,文娱归于文娱。看见其他bug,咱们总是很高兴的,可是咱们也要时刻经过这些bug反思咱们自己。假如是我,我要怎么防范这些破解和刷分?
从羊了个羊这个游戏来看,对这个游戏的破解无非就分为两大类:本地修正客户端,和假造音讯给服务器

本地修正客户端

就算是说破了天,单机游戏想要破解都只是时刻迟早的问题。别说微信小游戏了,主机游戏乃至游戏主机,都难逃命运,不是破不了,只是时刻成本的问题。但我以为,咱们仍是能够经过以下方法来做安全防护:

1.资源文件加密处理

这也是我用到的第一个修正方法——修正关卡配置,可是假如配置文件自身做加密处理,或许打包成二进制文件等,机器知道,人不知道,那么也就很难做修正了。

2.内存防护

我之前项目有用到过腾讯提供的客户端加壳维护,一旦发现你经过内存修正器修正内存等违规操作,维护程序会立即杀死程序来做自我维护。以前我玩腾讯PC游戏的TP子程序,大致也是这个作用。

3.服务器校验

一般来说,就算是单机游戏,咱们最好也需求有服务器来进行校验。
往简单了说,咱们至少能够经过剖析玩家的行为,比如通关时刻过短,经过次数过多,或许点击次数过快等剖析出玩家的反常行为。
往复杂了说,咱们把单机改成服务器运行逻辑,或许单机和服务器别离运行逻辑,服务器来做数据校验
总归,服务器参与的越多,本地修正数据的可行性越低

假造音讯包

这种方法需求抓包客户端和服务器的交互数据。一旦玩家发现了交互逻辑,则能够经过假造相同的音讯包来到达相同的作用。而这种方法,咱们需求在服务端做好各种非法恳求的校验。
从通用点来说,咱们能够经过接口恳求频率,ip访问限制,参数篡改校验等阻拦一批非法恳求。
从逻辑点来说,咱们仍然能够经过玩家的反常行为,来阻拦玩家非法恳求。

一键通关

一键通关的接口随意发送通关音讯,就能无限通关,它的维护做的是远远不够的。从游戏逻辑上来说,羊了个羊每天是只能通关一次的,至少从这一点来说,假如对每天通关次数有阻拦的话,就算是假造音讯,也只能一天通关一次;其次,重复假造音讯就需求重发音讯包,只要对音讯包加上时刻戳或许事物id,确保同一个包只能恳求一次,这也能阻拦一大批重发的假造音讯包。

修正恣意玩家地理位置

其他需求要点说的是,能经过接口恳求修正其他人的定位地址,绝对是归于很严峻的缝隙了。它的原理是直接恳求修正地理位置的接口来到达修正玩家定位的作用,可是丧命的是,它只需求传玩家的uid,就能够修正对应玩家的定位,但偏偏游戏大厅能恳求到一切玩家的uid。这样的话,修正恣意玩家的定位就显得非常容易。在这个接口中,最基础的,咱们不能走漏玩家的关键信息在公共接口中,有必要确保恳求这个接口的必定是玩家本人;其次,修正地理位置这个操作理应也做一些限制,比如有必要一天或一周或一个月才干修正一次。