我在一家小众的大型多人在线游戏(MMO)公司工作。我们的团队不大,预算有限,但有一群忠实的玩家。这是一款完全靠技巧而非常规道具取胜的游戏,玩家们享受着挑战的乐趣。然而有一天,我们听说游戏里出现了一个作弊软件,玩家们顿时变得愤怒。由于只有四位程序员,我主动请缨去调查此事。大家坚信在游戏中杀死他们的人都是因为使用了作弊工具。我们尽力安抚他们,但我们对这种现象的严重程度一无所知。
要知道,我在这里描述的情况可能早已过时。我们支持Windows和Mac,但Windows似乎是主要目标;不过,当时只有10%的玩家使用Mac。
我发现这个作弊软件是由印度的一家公司销售的,但很快发现他们并非源头,而是窃取了别人的成果再转售。经过深入调查,我发现这家公司还售卖其他热门游戏的作弊软件,考虑到我们玩家基数小,我疑惑他们为何会对我们感兴趣。
于是,我回家买了一份。我不想让我们的IP地址与购买关联起来。我有一台Windows电脑,可以安装并查看它提供了什么。那时我对Windows内部机制了解不多,因为主要负责Mac版本和跨平台的核心游戏开发(那是一个基于OpenGL的游戏)。
作弊软件通常包含常见的功能:透视墙、无限弹药、地图扩展和自动瞄准。作为用户,我还能够访问他们的论坛,看到客户们对我们游戏的评价(他们认为我们太笨,抓不到他们)。我发现发帖的人寥寥无几,大概十几个,希望这意味着使用人数不多。作者也在论坛上活跃,但他主要是陈述事实,没有太多猜测。这家公司似乎只有两个人,一个负责编写所有作弊代码,另一个负责商业运营,每月收费大约30美元,比我们游戏的价格还要高。
我决定从几个方面入手。首先,我要学习如何在Windows上破解游戏,然后计划如何让游戏更难被破解,或者至少减慢作者的进度,最后找出真正使用作弊软件的人。
说实话,这是我做过的最有趣的“项目”之一,两个月的时间与一个聪明的对手斗智斗勇!接下来的几天,我研究了如何让Windows游戏变得更难以破解,阅读了各种技术文档,避开那些针对大型公司的复杂游戏。
通过论坛,我知道作者是玩家,但身份不明。所以,为什么会有作弊软件的问题并不只是金钱那么简单,他其实是为了自己使用!任何额外的收入都是附带的,像《使命召唤》这样的大作能带来更多的利润。
研究了一段时间后,我开始考虑如何让更新作弊软件变得更困难。游戏的核心循环中有一个数组,记录了所有可见的人物或车辆(最多128个)。这个固定结构包含大部分动态游戏内容,显然对黑客来说是个攻击点。然而,如果服务器没有及时接收到心跳网络包,游戏就会在短时间内断开连接,因此在游戏运行时调试几乎是不可能的。我们有离线模式,玩家可以在其中练习各种操作,游戏逻辑与在线模式相同,但无需网络连接。作者在离线状态下构建他的作弊代码。
游戏是在十年前我加入前用C、C++、Lua和JavaScript混合编写的,代码既丑陋又难以维护。但有了C宏,事情就简单多了。我首先区分了离线和在线的数组,对程序员来说透明,然后为常见数据类型如位置创建了混淆宏,改变其内容并引入偏移。每次构建都有不同的偏移值,还添加了阴影值,复制重要数据并以不同偏移显示。通常,黑客是通过观察游戏内存变化来制作作弊工具的。
这些措施不能完全阻止作弊,但每次发布更新后,黑客需要投入更多时间,直到修复问题,现有的作弊工具才会失去效用。知道只有一个作者,意味着他在赚取微薄利润的同时还要花时间更新。我还对OpenGL管道进行了修改,使得透视墙作弊变得痛苦。
游戏中有一种特殊的“车辆”,用于管理员和公司监控玩家,通常是不可见的,但可以启用吓唬违规者。我在论坛上看到他们总是能看到“车辆”,所以知道它在场时要表现正常。我和服