某团“袋鼠快跑”游戏自动合车的研究与实现

前言

最近某团搞活动,刚好挖一下,看到这个“袋鼠快跑”游戏就忍不住玩了一下…

游戏规则

先熟悉一下游戏规则,这个小游戏主要的目标是升级车辆等级,玩法如下:

1、购买车辆,购买后车辆会出现在格子里面

2、将相同的车辆合成新车(升级),比如两个6级车辆合成7级车辆。

3、将车辆放入跑道,每跑一圈会获取相应的金币,金币用来买车。

4、购买车辆时只能买低于当前最高等级4级的车辆,比如16级,只能购买12级车辆。

自动化游戏

明白规则以后,我们就可以确定这个“外挂”的功能了,预期实现功能如下:

1、购买可以购买的最高等级车辆

2、将车辆升级

3、将车辆放入跑道。

自动化买车

那么我们一步一步进行实现,首先抓取购买车辆的数据包如下:

1
2
3
4
POST /api/player/buy_car HTTP/1.1
Host: daishu.meituan.com

{"level":"6","pos":"7","userId":"","gtoken":"your_gtoken"}

数据包中的level指的是购买车辆的等级,pos表示购买后的位置,这个位置不用管,测试发现pos不影响买车。

那么我们需要知道当前车辆最高等级是多少,然后去购买车辆最高等级-4级的车辆(PS:也可以一直买低级车合,但是这样升级速度太慢)。

问题来了,现在需要知道当前车辆最高等级是多少,那么继续抓包,找到获取车列表的数据包,然后将里面的最大等级的车取出就可以了。

反复测试后发现,只有登录时的报文里面会显示车列表:

1
2
3
4
5
6

POST /api/login/login HTTP/1.1
Host: daishu.meituan.com


{"userId":"1","uuid":"","token":"your_token","fingerprint":"","gameType":"1","app":"10"}

分析返回包,其实返回的车列表很详细:

那么接下来,实现买车的功能:

自动化合车

买了车以后,需要做的是将车合成高级车,这里我们为了方便理解,先假设目前的车辆状况如下:

8级车停在1号车位,8级车停在2号车位,7级车停在3号车位,7级车停在4号车位,7级车停在5号车位。

合成高级车其实就是把两个相同等级的车拖到一块就可以了,比如把2号车位的车拖到1号车位与1号车位的车合成,则会生成一个9级车。

于是抓包,合车的数据包如下:

1
2
3
4
5
6

POST /api/player/levelUp HTTP/1.1
Host: daishu.meituan.com


{"f":"2","t":"1","uuid":"","userId":"","gtoken":"your_gtoken"}

那么要想完成合车的操作,就要先获取相同车的位置,我是这么实现的:

然后合车函数进行:

还有处理合车的函数:

将闲置车辆放入跑道

将车辆放入跑的数据包为:

1
2
3
4
POST /api/player/run HTTP/1.1
Host: daishu.meituan.com

{"i":"7","userId":"1056086","gtoken":"your_gtoken"}

实现这个可以直接遍历列表盲放入,也可以判断哪些车没在跑道就放入,我们用后者实现,效率较高。

还是先获取carList,看哪些车未在跑道,然后将车放入跑道,实现如下:

总结

到此,所有功能都已经实现了,只要在主函数中一个死循环不断调用上面的函数即可。

运行效果如下:

最后

大家好,我们现在创建了“川云安全团队”公众号,很多好的文章都在该公众号上发表,欢迎大家关注我们的公众号。