游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10944|回复: 0

《糖豆人》的外挂为什么这么多?从它的安全性设计说起

[复制链接]

8364

主题

8525

帖子

1万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
14833
发表于 2020-8-27 11:21:17 | 显示全部楼层 |阅读模式
30.jpg
“糖豆人的关卡设计特别棒,真的,我在天上看得一清二楚”

《糖豆人:终极挑战赛》是一款令人捧腹的多人竞技闯关类游戏。虽然一局游戏近60名玩家仅有一名可以赢得最后的王冠,但游戏中糖豆人"沙雕"的动作、有趣的关卡和充满童真的背景音乐,都极大程度地降低了它的竞技感。

《糖豆人》在上线初期就得到了众人的关注,甚至在开服的一段时间内由于游玩人数超出预期,服务器难以承载众多的玩家而频繁处于宕机状态。

一款如此火热的多人联机游戏,或早或晚都会遭受外挂军团的攻击,这其实也算是玩家意料之内的事情。但是对于《糖豆人》来说,外挂的大潮似乎来得有些过于快了。游戏上线还不到一周,直播弹幕中就已经有玩家开始反馈遇到了“仙豆”,B站上关于外挂的视频也开始陆续出现。大家可以注意看下图视频的上传时间,要知道《糖豆人》在8月4日才正式发售:

31.jpg

打开《糖豆人》的Steam商店链接,你会看到几乎所有玩家的评论都和外挂有关。

32.jpg

是什么导致“仙豆”这么快就出现在了这个缤纷多彩的世界中?本文将暂时不去探讨玩家为什么会在《糖豆人》这么休闲的游戏里开挂,而是从游戏逆向的角度,去分析这款游戏的在安全方面的脆弱性。

0x01 初步分析

多人联机游戏一般需要对客户端进行保护,防止攻击者分析、篡改游戏客户端。这一步骤虽不能保证100%防护所有的攻击,但至少可以一定程度提升攻击门槛。我们首先测试《糖豆人》游戏是否具有客户端保护。

使用未自定义的官方版Cheat Engine,打开目标进程,调试目标进程,设置断点:

034.jpg

可见《糖豆人》游戏没有设置任何客户端保护,仅仅使用最常见的游戏分析工具就可以查看游戏内存、设置断点进行调试。这说明对该游戏的逆向分析没有任何技术门槛。

既然没有客户端保护,那如果使用通用的加速齿轮是否能够加速游戏,实现人物的加速移动呢?启动CE的加速齿轮功能,设置倍率5,结果如下:

034.gif
“逮虾户!”

Voila! 我们糖豆人的时间能加速流逝,而其他的糖豆人在我们看来慢得就像没吃饭一样。我们只需几秒就可以快步追上领先的糖豆人们!

由此可见加速外挂开发的成本非常低,普通玩家其实并不需要付出金钱购买外挂,仅需要一篇教程就可自主实现加速了。

0x02 进一步分析

我们仅在初步分析阶段就完成了一款实用的《糖豆人》外挂,但本文不将止步于此。我们继续进行信息收集,进入游戏的文件目录,可见以下的文件结构:

35.jpg

该目录结构说明该游戏是使用Unity引擎进行开发的。进一步查看游戏目录,发现目录中没有找到Assembly-CSharp.dll等托管的Dll文件,但在目录中发现il2cpp相关文件夹。因此判断该游戏在开发阶段使用C#进行游戏逻辑开发,然后通过il2cpp技术将C#代码转换成cpp,编译成native代码进行发布。

il2cpp处理后的代码可以通过相应工具进行还原,将native代码对应至c#代码。同时,由于C#语言的反射特性,开发者在进行游戏开发时使用的包名、类名、方法名和成员名称都可以被准确地还原。

使用相关工具后,我们得到以下的东西:

36.jpg

可以看到各种开发者自定义的名称被忠实地还原,这极大地帮助了我们进行游戏逻辑的逆向分析。图中红框处的函数从名称上来看应该是开发者在开发阶段留下的用于调试游戏的函数,例如取消重力、玩家瞬移等。这些函数本应在发行时被删除,但是并没有。

借助DebugTeleportPlayer这个调试方法,我们可以逆向此函数,分析该函数是使用什么方法瞬移糖豆人的。

37.jpg

上面的代码基本比较清晰了,可以仿照上述过程开发糖豆人瞬移外挂:

38.gif

通过对客户端逻辑的分析,我们还可以实现几个比较有意思的外挂功能,比如降低重力:

039.gif

或者停止比赛中的障碍物(仅对外挂玩家有效,其他玩家依然会被障碍击倒):

040.gif

0x03 网络通信分析

在上述分析后,我们已经实现了多个和玩家坐标有关的恶性外挂功能。可以合理猜测,游戏服务器并未对玩家的坐标位置进行合理性检验,导致攻击者可以在本地任意修改玩家坐标,随后该坐标会被服务器同步至其他玩家的客户端上,导致其他玩家看见飘在空中的糖豆人。接下来,我们分析游戏的网络通信机制来确认这一点。

通过栈回溯和查找关键字的方法,定位到游戏内的一个与通信高度相关的函数UnityNetworkingGameConnection__SendUnreliable。在此位置获取传入的参数,并通过C#反射机制获取该参数的对象名称,最终定位到一个与对局内玩家运行高度相关的游戏协议。

41.jpg

NetMotorTaskSnapshot会记录当前玩家的坐标、朝向、速度和玩家动作等一系列状态,然后通过封装后被送至SendUnreliable函数发送至服务器。游戏服务器理应对玩家发送的坐标信息进行校验,但糖豆人游戏并没有,而是直接同步至其他玩家的客户端,导致飞天等恶性外挂出现。

另外,虽然游戏目前没有开放修改角色名称的功能,但通过对网络协议的分析,我们发现在游戏开始阶段客户端会向服务器上报玩家角色的昵称。通过修改上报的昵称,可以实现玩家角色改名。修改后的名称在普通玩家视角中可见。

42.jpg


0x04 总结

通过以上分析我们可以发现,目前在游戏的安全性上,《糖豆人》还存在着非常高的风险。游戏的分析门槛很低,而且游戏的一些基础设计也存在安全隐患:游戏过度依赖客户端的计算,服务器端缺乏对客户端上报信息的校验。毫无疑问,《糖豆人:终极挑战赛》是一款非常有趣且好玩的游戏,游戏在上线一周内的200万份销量也足以说明这款游戏的成功;但对于一款多人联机网络游戏而言,游戏的安全性是游戏是否能够长期稳定运营的一个重要因素。在这一点上,可爱的糖豆人可能要尽快成熟起来,正视黑产军团带来的巨大风险,拿起合适的武器保护自己。


来源:腾讯游戏学院
地址:https://club.gamersky.com/activity/429060

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-4-19 22:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表