1. 前言
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情”
最近微信小游戏「羊了个羊」非常火爆,火爆的原因不是因为它很好玩,而是第二关难度非常高,据说只有 0.1% 的人能通关。我也尝试了下,第一关非常容易,第二关玩到对自己的智商产生了怀疑:真的有人自己打通关吗?既然不能常规方法通关,能不能通过别的方式通关呢?答案是可以的,我们可以使用抓包工具进行通关,如果你不知道抓包是什么,可以看看《前端人必须掌握的抓包技能》,里面有较详尽的解释。本文主要讲述羊了羊的通关原理以及使用 whistle 进行抓包通关。
2. 通关原理
2.1 游戏玩法
羊了个羊是一个消消乐类的游戏,只不过主角是羊,点击要消除的蔬菜类食物,三个进入槽内就可以消除。
一共有两关,两关都通关后即可获得一套新羊装皮肤,并加入自己所属省份的羊群去,为自己的省份排名出一分力。
可以看到第一关是非常容易的,一般都不需要使用任何道具就可以轻松过关。第二关显然要难得多,
既然如此,能否通过抓包的方式,篡改第二关的地图数据,让它加载第一关的数据呢。
2.2 环境配置
只要地图数据是通过服务端返回给客户端的,就可以通过抓包工具抓取篡改,现在先做好环境的配置:
whistle 是基于 Node 实现的跨平台抓包免费调试工具,可以使用 npm 进行安装
-
先安装 node,建议用 nvm 管理
-
全局安装 whistle
npm i -g whistle & w2 start
成功启动服务后,就可以通过浏览器访问 http://127.0.0.1:8899/ 查看抓包、修改请求等。
- 由于羊了羊客户端与服务端的通信是 https 协议,需要把 whistle 的 https 根证书安装到手机证书管理处并信任。
-
此时,再在与电脑连接了同一个 wifi 的手机上配置代理指向 PC 电脑的 IP 和 whistle 监听的端口即可在电脑上截获数据包。
-
通过电脑抓包,可以发现地图接口请求路径如下:
# 第一关地图数据
https://cat-match.easygame2021.com/sheep/v1/game/map_info_new?map_id=80001
响应数据:{"err_code":0,"err_msg":"","data":"046ef1bab26e5b9bfe2473ded237b572"}
# 第二关地图数据
https://cat-match.easygame2021.com/sheep/v1/game/map_info_new?map_id=90019
响应数据:{"err_code":0,"err_msg":"","data":"fdc2ccf2856998d37446c004bcc0aae7"}
知道了地图数据的请求路径,就可以改写响应了。
2022-09-20 更新
地图接口请求的数据变更为:
https://cat-match.easygame2021.com/sheep/v1/game/map_info_ex?matchType=3
3. 通关方式
3.1 改写响应体
在 whistle 中添加过滤规则,拦截第二关地图的请求,返回第一关地图的响应数据。
先在 rules 面板添加一条过滤规则,然后再 values 添加一条返回值,注意要检查是否对应清楚,否则会请求会一直卡住无法响应。
规则设置完后,删除小游戏,重新进入,即可看到抓取的第二关地图请求返回的数据时第一关地图的。
在测试过程中,发现第二关地图的请求 id 以日期递增,比如 900018、900019,注意修改,具体以抓取到的地图请求路径为准。
2022-09-20 更新
上面这种方式已被官方优化,不再有先有第一关和第二关先后请求,但原理是一样的。
添加 whistle 规则:
https://cat-match.easygame2021.com/sheep/v1/game/map_info_ex?matchType=3 resBody://{ylgyV2}
对应的 values 设置为:
{
"err_code":0,
"err_msg":"",
"data":{
"map_md5":[
"046ef1bab26e5b9bfe2473ded237b572", // 第一关
"046ef1bab26e5b9bfe2473ded237b572" // 第二关,用第一关的值替换第二关
],
"map_seed": [4208390475,3613589232,3195281918,329197835]
}
}
3.2 302 重定向
客户端与服务端是通过 https 通信,传递 HTTP 报文,HTTP 报文包括起始行、首部和主体。
HTTP 请求报文中包含命令和 URL,HTTP 响应报文中包含了事务的结果,而响应的状态码为客户端提供了一种理解事务处理结果的便捷方式。其中 300 ~ 399 代表重定向状态码,重定向状态码要么告知客户端使用替代位置来访问目标资源内容,要么就提供一个替代的响应而不是资源的内容。
如果资源已被移动,可发送一个重定向状态码和一个可选的 Location 首部来告知客户端资源已被移走,以及现在可以在哪里找到它。
常见的重定向状态对比:
-
301:表明目标资源被永久的移动到了一个新的 URI,任何未来对这个资源的引用都应该使用新的 URI
-
302:所请求的页面已经临时转移到新的 URI,302 允许各种各样的重定向,一般情况下都会实现为到 GET 的重定向,但是不能确保 POST 会重定向为 POST。
301和302跳转,最终看到的效果是一样的,但对于 SEO 来说有两个区别:
-
301 重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
-
302 存在网址URL劫持,一个不道德的人在他自己的网址A做一个302重定向到你的网址B,出于某种原因, Google搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B上的内容,这种情况就叫做网址URL劫持
知道重定向的原理后,请求第二关地图时,就可以通过返回重定向响应状态码,告诉客户端,资源已被移动,可以去请求第一关地图数据,
在 whistle 添加 302 重定向规则如下:
https://cat-match.easygame2021.com/sheep/v1/game/map_info_new?map_id=90019 redirect://https://cat-match.easygame2021.com/sheep/v1/game/map_info_new?map_id=80001
2022-09-20 更新,上面这种方式已被官方优化,不再有先有第一关和第二关先后请求,此方式不再可行。
要实现了羊了个羊通关,除了更改地图数据还可以篡改道具数据,但尝试时发现它获取道具的方式不是通关网络请求,而是通关转发朋友圈/看广告后获得回调,前端直接做的逻辑处理,因此作罢。
4. 总结
本文是《前端人必须掌握的抓包技能》的案例实践,简单地讲述如何使用 whistle 实现羊了羊通关。考虑到羊了个羊的官方不断更新迭代,现在的漏洞很快会被修复,本文的通关策略会很快失效。如果你能学会到本文的抓包技巧,能给你在日常的开发调试工作中提供一种思路,本文的目的也就达到了。
感谢 Kagol 大佬的建议,才有此篇文章的延生。
声明:本文所述相关技术仅供学习交流使用。