Creative Commons License
本Blog采用 知识共享署名-非商业性使用-禁止演绎 3.0 Unported许可协议 进行许可。 —— Fox <游戏人生>

游戏人生

游戏人生 != ( 人生 == 游戏 )
站点迁移至:http://www.yulefox.com。请订阅本博的朋友将RSS修改为http://feeds.feedburner.com/yulefox
posts - 62, comments - 508, trackbacks - 0, articles - 7

网络游戏安全思考——反外挂篇

Posted on 2008-02-26 16:04 Fox 阅读(2483) 评论(10)  编辑 收藏 引用 所属分类: G游戏编程

Author: Fox

//-----------------------------------------------------------------------------------------------------
此篇仅是对反脱机外挂的一点思考,其他安全问题如登录验证、消息验证等更多的是涉及逻辑功能。
//-----------------------------------------------------------------------------------------------------

春节刚回来的时候,回公司去和Soft聊到了自己的毕业论文的问题,因为专业的关系,我必须给出一些安全方面的考虑,正是因为这一点,我当时开题时就立足对安全的无缝游戏世界进行思考。只是在游戏本身的安全性上,一直也没有一个好的出发点,这两周还是在考虑这个问题。

这一点,有我入行时间不长,对于游戏本身、玩家与开发者(含游戏及外挂、木马开发者)之间的关系并没有一个很好的把握,更多的是由于我对游戏中的可用的安全技术不了解,尤其是对应用层安全协议不了解,对破解技术也不了解,导致无所适从。

《游戏编程精粹1》中Andrew Kirmse在《在线游戏的网络协议》一文中对常见的篡改报文、报文重放和逆向工程有讲述。预防报文篡改的有效防御是哈希校验,现在大多游戏是使用MD5算法,而且网上开源的MD5代码也很多。对于报文重放,Andrew提到了使用线性叠加随机数的状态机,具体原理和实现方式因为没有提到太详细,还要针对实际应用继续学习L。然而,由于客户端既是报文的接收者也是发送者,因此,客户端包括了完整的加解密算法。一旦客户端被逆向,上述措施就变成了破解者背后的烟雾弹,完全失去意义。

提到反外挂,Joe的看法也是说这个东西和具体某一个技术关系不大,还是要从机制上去看。加不加密对于普通玩家没有意义,对于专业从事逆向的人更是也没有意义,所有单纯考虑加密是没有效果的。对于免费游戏,外挂往往是打钱公司的工具,你封他的号,他再建就是了,代价几乎为0,而一般付费游戏(像魔兽世界)一个帐号对应一个CDKey,一个CDKey就要几十块钱,这个封起来就有点咬牙了。

说到这里,不妨换个思路:为免费游戏加入CDKey。我一款游戏从内测、封测到公测,让玩家充分参与体验,在被逆向且外挂横行之前,按正常逻辑运营。进而假定我这一款游戏在公测之后,让玩家感觉魅力十足。引导玩家并实施CDKey,一个CDKey大约会需要玩家付出些许Money以示诚意,在玩家游戏过程中,会阶段性向玩家赠送部分增值道具。老玩家在进入新区时,需要申请继续使用原CDKey。这样一来,外挂就不会肆无忌惮了。

BTW,这个思路没有从技术角度解决问题,下面再来看一种略微关乎技术实现的解决方案:动态验证。在游戏运行期间,会不定期的向玩家发送验证码,客户端在收到消息后,必须在一定时间内响应,向服务器确认收到的验证码,否则将被强制下线,再次登录后将更加频繁的收到验证码,直到用其良好的回复次数累积消除其不良记录为止。为了尽量减少因此给玩家造成的不友好体验,在任务场景、重要PK场景或者高等级玩家活动场景,验证码的发送和确认可适当放宽

当然,如果外挂中加入了图形识别,这一招也未必奏效。

不知是道高还是魔高,可以肯定的一点是:大家都是在利益的驱动下绞尽脑汁。

//-----------------------------------------------------------------------------------------------------
春节回来之后,一直比较忙(确切的说是比较懒),没有更新,宜更加勤奋。
最近工作涉及到数据库编程,一点点对数据库的读写居然耗掉我3天时间,汗!
//-----------------------------------------------------------------------------------------------------

Feedback

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-26 20:52 by Yule Snow
加油啊!

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-26 21:16 by Fox
听一位网友提到WOW的ascent,有时间查查资料:)。

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 01:20 by eating
验证码,防篡改这些都没用,技术手段要想封死脱机几乎是不可能的事情。

唯一有效的办法就是加一些验证封包,每次升级都要变动命令字以及验证算法。这个封包不定时发送给客户端,如果是正确的游戏客户端自然有回应。

脱机一般都不会分析的过于细致,对这些小包都不会太过关注。辨认出来以后封号就是了。

或者辨认出脱机以后不掉东西,不涨经验,呵呵,这个是打币外挂最烦的。

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 01:21 by eating
ascent貌似是wow的服务端吧?跟脱机有啥关系?

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 08:56 by Fox
@eating
ascent和脱机挂没有关系,提到这个纯粹是为了提醒自己找时间查查。

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 09:22 by abettor
我觉得千防万防,家贼难防。
如果一个网络协议被公开了,就啥都不好办了。但是,一个网络协议就那么容易通过抓包分析出来吗?所以,应该考虑防内鬼。

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 10:53 by Fox
@abettor
一旦客户端被逆向,分析网络协议是很简单的事情了,因为对协议的解读是在客户端也有的。

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 20:09 by ood
这两天玩了一下你们的游戏,挂机的还真是挺多的:)

我觉得你提出的第一个方法很好,而增加不定时验证的方法可能不会有太大的作用,那些靠这个吃饭的专业工作室在挂机时是有人职守的,你的验证图片发过去,他会人工回答问题,连OCR的东西都不用。

增加CDKey并付费的想法如果协调好了大概可以起到一定的作用。现在游戏里的挂机号一般都是1~50级的,工作室的人就是靠这50级打怪所暴的物品来卖钱的(他的目的就是钱),如果能计算出一个号到50级时能为工作室赚多少钱,按这个标准来收费,那他这50级就算白挂。如果他50级以后还挂机,那他的运作成本就会直线上升(装备、药品消耗),而且封他这样的号会很有震慑力。

不过在具体实施时需要仔细考虑对各个层次玩家的影响,比如对已注册的号可以不收费,这样对老玩家就不存在影响。新注册的号如果选择不缴费也可以让他玩,但1~50级这个阶段的物品暴率降低10倍,经验收益不变,这样如果是真玩家,那对他也没什么影响(他在这个阶段主要是为升级),但这对挂机号就是致命的。如果新号选择缴费,那么暴率恢复正常(但对挂机号来说也是白挂),同时可以赠送给玩家同等或几倍缴费价值的道具(关键一点是这些东西不能交易,包括变相交易)。

玩家在达到50级后可以将暴率恢复正常(包括缴费的和没有缴费的),真正的玩家这时就可以攒钱买60的装备,而挂机号也会在这时花钱买装备(这个级别没装备他挂机不合算),而GM就可以集中精力处理50~60级的挂机号,而对那些小号可以不用去理,反正他挂也是白挂。

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-02-27 21:10 by Fox
@ood
分析的很有道理!
根据玩家情况(支付CDKey费用与否)调整爆率,这个思路更加灵活,3X!
:)

# re: 网络游戏安全思考——反外挂篇  回复  更多评论   

2008-06-29 11:46 by 车门龙
我一直想刷拉

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理