牛博威:成熟的反外挂系统一般企业未必能承受

来源:互联网 发布:windows xp镜像文件 编辑:程序博客网 时间:2024/04/29 23:08
腾讯科技讯 3月18日消息,在今日举行的腾讯网络安全技术峰会上,游戏安全和反外挂方面的专家牛博威表示,反外挂系统并非越成熟越好,成熟的反外挂系统会让一般公司很难承受,大大增加了运营成本。同时,越是成熟出名的反外挂系统越被人研究得多,反而增加了被攻破的几率。

牛博威说游戏本身就是一个堡垒,或许把这个门做得很好,用金装门或者用铁门,把锁加得特别重,把门做得再先进,却没有发现别人已经从窗户里跳进来了。所以越成熟的反外挂系统不一定最好,最重要的是要适合自己,要做到运营和成本的平衡。

以下为牛博威讲演实录:

牛博威:我今天主要讲的是反外挂技术,如果有时间的话我再讲一下游戏漏洞。我叫牛博威,主要是研究病毒、反病毒;木马,反木马。外挂,反外挂。

我们今天讲反外挂技术,我根据我自己的总结,把当前国内包括韩国、日本、美国、台湾和一些经常被使用的反外挂技术,包括其他方面的策略给大家稍微谈一点。

这是大体的提纲(图),外挂的种类。我们先知道外挂有什么种类、什么类型然后才能去反外挂,然后是策略的选择,有一些常见手段和方法的分类,当然这个分类是我大体的分类,因为方法之间往往是有重叠的,我只是大体分类。对于一些技术方面的误解决,最后我再做一个比较简单有效的反外挂系统,最后有时间的话把游戏漏洞方面说一下,怎么防范游戏漏洞稍微谈一下。

外挂的种类一般来说是分为内挂。首先它依附游戏,首先你开内挂的时候得开游戏,游戏开起来以后再把内挂开起来,是在同一个进程上的,或者是互相配合运行的。它的注入方式,有的是注入到游戏本身,有的不是同一个进程,但是也是有相互的牵连。还有一种它是模拟按键的,它跟游戏本身不是同一个进程,但它们也是互相配合的。

脱机,第一个特点是脱离游戏,像很多做得好的脱机可以在一台机器上跑很多,多的可以达到上百个。当然,它运行的时候根本与游戏无关。这是一个脱机的地图编辑(图),编码很复杂,相对内挂来说,开发时间要长一些。这是一个脱机的功能(图),它有自动补血等等。再就是开发时间长,它比较难做,开发的时间长,所以开发的时候需要考虑到这一点。对反外挂来说如果不知道外挂是怎么做的,这是比较飘渺的。最好对自己的反外挂对象,对这个外挂要了解,然后才能去反外挂。然后是策略的选择,我们今天主要讲的是反外挂技术,但是反外挂本身不仅仅是技术方面,还有法律方面,可以对外挂做分类,包括散播外挂和制作外挂对他们进行法律制裁,再就是人工识别,包括一些非技术方面的,比如GM、玩家去查,还有就是技术检测,我们虽然讲的是技术,但是不应该仅仅立足于技术,应该考虑到配合,要对他们提供震慑。不应该只立足于外挂产品本身,常见的反外挂手段很多,包括早期常用的,常见的反外挂手段,外挂窗口。还有就是查外挂进程的名称,比如内存特征码,还有外挂的模块大小。虽然开发很简单,但是对外挂来说基本也不算什么,查一下窗口,查一下乱码更新一下就可以了。还有就是采用安全产品,比如安博士,MP等一些比较成熟的系统,用它们来做也可以达到比较好的效果。

我们今天主要讲的是自主开发反外挂系统。自主研发反外挂系统,国内包括盛大、网易、完美世界,韩国的一些很出名的,他们也有自己的反外挂系统,像金山。每个公司都希望有他自己的系统,然后利用自己的系统进行反外挂、保护、杀毒。

反外挂方法的分类大概有这么几种,当然这不是很严格,但是对我们今天来讲,大体分了一下,包括暗桩,还有不定时检测、验证码检测、数据加密等等。

下说一下暗桩,是指隐蔽的检测方法,比如走路、攻击、捡物品、保护等相关封包数据被特殊处理,像这些封包被单独处理,这个单独处理有什么好处呢?对所有的封包都进行特殊处理的话,网络负担率比较大。例如我只对攻击进行相关的保护,网络负担就可以降低。另外我做得比较隐蔽,这个外挂看上去注意不到,他发出去以后,玩家一旦使用了攻击就会被查到。

另外一种是不定时改变暗桩,虽然它很隐蔽,但是如果总在那里使同一种暗桩肯定会被发现,一旦发现你这个暗桩就没用了,所以应该不定期的改变,改变之后会增加外挂的心理负担。因为外挂开发也是人脑,他们有自己各方面的压力。

暗桩的技术不一定复杂,比如可以在某一个封包对某一个字符进行加密,但是可以保障它很隐蔽,再就是不定期的改变。

不定时检测,跟上面的差不多,比如同一种检测手段我不连续使用,比如七种反外挂封包,但不同时出现,我一天只用一套,比如我今天用这一套,星期一用一套,星期二用一套,一共有七套,来回换,从外挂开发人员来讲,他就很难同时把这七套东西全搞出来,他的外挂产品一旦被用出来或者一旦发出去之后,他星期二、三没事,但到星期五、星期六可能就被查处来了,所以我们的检测手段最好轮换使用,最好不要采用同一种手段。比如网易,据说他有一套自己的协议生成器,用生成器把脚本改一下,整个游戏的协议全部变了,当然这只是传说,我没有看过,大体是这样的思想。还有就是检测周期长,比如我这个服务器查外挂的时间,一般来讲比如我半分钟查一次,查外挂的封包半分钟查一次的话很容易把问题看出来。但是我一天看一次,对外挂开发人员来说就很难做到。还有天晴数码他们搞反外挂检测周期特别长,每检测一次,检测完以后当场不采用什么反应,但是过一周以后,我对查出来的使用外挂的人进行封号也好,进行处理也好,我虽然进行处理了,但是我这个反外挂封包不发了,这样的话可能就找不到,就很难查到在一星期内到底采用了什么服务措施查到的,因为时间已经过去了。像网易也是采用此类方法。

还有是验证码现在比较流行,例如图形、数字验证,这里是一个汉字识别的,你得打这个鸟字,从里面挑出来(图)。还有是与游戏相关的,比如梦幻的(图),你要挑出来与你相同的角色,说实话我就没找出来,我都查不出来,外挂就很难处理了。目前图样识别技术非常完善,比如汉字包括一些英文字母就更不用说了,对图象进行一定程度的扭曲都可以转换过来。还有一种是影响游戏的正常操作,比如这个他要找出跟这个角色一样的,我就不找出来了,这是我最后一次不换人物。还有一种是如果处理不当会造成漏洞,比如以前有一个游戏,它会弹出码,弹出码的时候正在跟人家 PK,这时候你一弹他就死了,所以一旦出现乱码就成无敌,就被外挂制造者利用了,就一直保持无敌状态。所以尽量不要做那种很容易被识别的,还要尽量保证你这个系统不要被人家恶意利用。验证码可以作为辅助检测手段,比如你发现游戏不正常以后再发,用其它手段发现不正常。我给整个游戏里面做一个外挂炸弹,我这个服务器不主动给外人发,但是你周围的人,他如果发现我就同时在什么地方,我发现你的动作很不连贯,或者我作为一个玩家我可以给另外一个玩家发送炸弹,这时候就会出现验证码之类的。

下面是敏感数据加密,这不是指协议上的加密,不是封包里面的加密,而是内部的数据加密系统。比如我加密的是游戏内部一些很敏感的东西,比如游戏帐号、密码、血量、金钱、坐标,我对这些东西进行加密有什么好处呢?比如就可以进行防盗号,我对密码进行加密之后,你用金山游侠之类的就查不出来。它的缺点是如果加密做得不好的话可能会被人家利用,比如游戏里面所有的敏感数据,像里面的关键数据都采用了同一套,因为不可能帐号采用一套,所有的这些敏感数据采用同一套数据,这样的话根据返回地就很容易找出各种敏感数据,包括HP、MP、密码。这些东西看起来虽然跟外挂关系不大,但是对游戏分析来说很重要。因为做外挂少不了对游戏分析,你如果要对这个游戏分析的话就需要分析各种数据的漏洞,如果把解密机制给瓦解的话,等于你需要被保护的数据全部正好被拿下来的,基本就把你里面的内部信息拿出来了。像这种内部加密系统主要是保护内码、防盗号码。

剩下的是服务器下发代码,反外挂的编码、代码是通过服务员动态下发的,跟服务器连接,这时候服务器才会把反外挂代码发下来。这是Server(图),这是客户端(图),Server发一些代码给客户端运行,它这个编码是用笼统的概念,首先它可以是可执行代码,服务端发下来一些可行的代码直接对接,或者是发送脚本代码,客户端有一个脚本引擎,拿这个脚本引擎服务器发的脚本必须解释,客户端必须把服务器发的脚本解释完以后进行必要的反馈。还有就是可执行文件,服务端发一个可执行文件让服务器执行。客户端一旦执行以后,就与客户端进行配合,如果执行不了的话,就无法进入游戏。这种东西可以说是比较流行或者说比较高级的技术。

我主要是讲一下服务器下发代码,它涉及到一些内容,包括很多技术,它下发的编码,你肯定要下发一些很重要的编码,我这个编码每次都处理过了,每次都是不一样的,客户端必须给我执行,不执行的话就不让进游戏。然后还有一些环境校验,一查内存代码不一样就反馈为错误信息,环境校验比较有用,可能查出类型也可以查出游戏的相关环境,有没有外挂,游戏本身是不是跑起来了。还有就是代码被放入动态内存,每次代码发下来以后不是放在固定的局部变量,而是动态内存,这是一个技巧,对分析人员来说很麻烦,因为每次分析这种编码就需要重新定位它的内存地址,当然也可以采用一些方法来避过,但也算是一种技巧,我这里讲的就是技巧。还有就是加入一些反调试、多线程、多进程等外壳技术,还有一些多线程,里面有两个线程代码,把这种代码发过来以后让客户端运行。尤其是脱机,这样的代码正确执行的话是很困难的。

下面是外挂的对应策略,这种东西听起来很高级,其实也很高级。一般来说,第一是使用虚拟机,你给我发来的编码,外挂里面自带虚拟机,把结果正确地计算,然后再反馈,这种虚拟机可以说是做得很高级的,首先它可以执行汇编语言,这也是虚拟机必备的功能。在编码里面如果加入对这个游戏的内存校验,脱机就不需要游戏内存,因为脱机是跟游戏无关的,在虚拟机里面必须得模拟出来游戏的环境,包括一些SAH,还有一些高端代码、高端内存全部模拟,像这个体系最出名的是盛大,像国内从技术来讲最强的是盛大。盛大的反外挂系统做得也是比较早,人也比较多。像他们开发的这种系统,加入了编码,不会是那种很简单的。包括一些APR统统可以模拟。这种东西有它的好处,但是开发比较复杂。

另外一种外挂应对策略是的直接调用。外挂可以以一些很特殊的方式让游戏去执行这种代码,然后他把反馈结果接收回来,我指的是脱机而不是内挂。外挂可以采用一些技巧,比如我发一个脚本,让游戏只是把这个脚本给我解释出来,其他的统统不要,解释出来以后把内容发给我,然后我脱机直接发给你。像这种反外挂系统的好处是反外挂的代码是动态下发的,比如今天我这个代码是这样的,明天我觉得不爽就改成另外一张,就不需要每次更新反外挂系统的时候还需要给其它系统,我需要先停一下服务器之类的,任何外挂出来以后我可以两小时之内搞定,主要一个特点,我搞定你之后服务器不需要重启,否认外挂每次一更新,反外挂一更新,就要重新换服务器。但是这种动态下发代码又不存在这种问题,因为它中间不需要关闭服务器。另外很重要一点,外挂就很难正确的执行。国内像盛大这种系统一发布就能跑起来的就有两家,现在应该还是有外挂的。像韩国的新游戏他们也是采用这样的系统,他们的下发代码的思路跟盛大是一样的,但是它的特点很容易被外挂执行,很容易被外挂给干掉。

这种系统的缺点是它的开发特别复杂,加大服务器、网络负担。像具体开发这种系统来说要考虑很多东西,它的代码是动态下发的,就需要保证一定的代码量,你的代码写得再精巧,再隐蔽、再高级,你只要是在五十或者一百以内,可能对一些简单的搞不定,但是对有些人来说五十台代码不算什么,五十台的代码到我这里差不多一个上午就完了,你必须得花大量的五百台、六百台。这也是反外挂的优点,外挂很难分析,但是有一点是加大了服务器的负担,每次一登录都要发五、六百台东西下来,对网络负担来说很严重。

这种技术目前来说盛大等都采用这种,它虽然没有完全杜绝但效果很好,至少可以打下来大部分外挂。你做外挂时间长了以后,或者你做病毒时间长了以后,做杀毒时间长了以后,比如你做反外挂时间长了以后肯定就知道我这套系统发出去以后有谁可以搞定,谁搞不定,然后你就很有针对性。

这个地方可以稍微说一下策略,像盛大采用的在国内来讲技术是比较先进的,但是国内另外一家网易,他的反外挂也做得很好,其实它主要是云峰网,云峰主要的能力是写代码,但是网易的产品,像梦幻西游、大话西游,做反外挂做得很不错,主要是策略而不是技术。同样是反外挂,如果策略做得好的话,虽然技术不好,但是我可以采用一些策略,让你的外挂没法放。举个例子,像云峰采用封号,它的封号也是有一定的行为的,它采用一些开发特别简单的技术,成本也很低,却达到了盛大这种开发很复杂,但效果也不一定见得非常好的效果。它打击外挂的策略成本很低,而达到了比较好的效果,虽然没有完全杜绝,但是从技术上来讲技术成本是很低的。

下面是一些非常规手段反外挂。可以把它理解为一些很猥琐的,也可以理解为策略。比如可以采用非常规的语言编程,举例来说,游戏里面的反关机,脱机的一个重点是登录,如果你做脱机连登录都进不去的话就很难跑起来。但是我登录这部分就可以采用一些非常规的编程语言,比如用Flash、java,搞这方面的人很少,韩国的游戏的登录是采用网页登录的,它从事实上进行了反外挂,网页登录脱机不会落。像 java用的人比较少的,一般的人都是搞驱动,很少搞外挂的人是写java的,像Flash搞外挂的人也没有专门去搞Flash的。如果用这种非常规语言编程的话,对这种外挂开发人员来说他就无从下手,虽然技术本身很简单,但是他们没有碰到过,对他们来说是一种挑战。

另外一种是服务器检测数据库异常。这种检测手段在韩国用得比较多,它主要是直接查出漏洞,比如韩国很多游戏是直接查出用户里面哪个人,我发现你每天的收入,比如你正常情况下从一级可以升到四级,但是你使外挂的话我一看一天就从一级搞到三级去了你就不正常,我就直接停掉你,不管你是不是用外挂。另外一点,它的异常数据检测很多情况,比如可以检测经验,经验每天涨得过多,获得的游戏币过多,也可以认定你用外挂。然后在同一个数据库里面、同一个服务器或者同一个网吧、同一台电脑挂了一百个帐号,你这一百个帐号是同一个IP我认为你不正常,就可以把你 IP停掉。这些是属于策略,这种策略虽然做起来很简单,但是很有效。

还有一种是策略限制,比如有些游戏的系统可以被外挂利用,比如有一些任务,做完之后给你奖励,这种任务很枯燥,比如送信任务,每天送信送十回,就很累,但是外挂的时候可以一天二十四小时送信,我为了防止你用外挂就直接把你送信次数减到十次,每天达到十次就不能送了。像这种情况在梦幻西游就体现得很敏感。在游戏里面一些策略、一些任务,包括一些经验来进行修正。这是属于策略性的。像QQ打击木马也是这样,除了在技术上进行打击之外,还采用一些其它的模型,效果还是比较好的。

下面是反外挂技术误解。加密算法越复杂越好?很多人认为加密做得越强就好,或者用一些比较隐蔽的算法,他认为算法用得越复杂越好,但其实不是这样。并不是说算法越复杂越好,自己开发一套是不现实的,凡是复杂的算法都是公开的。你用这种算法以后,虽然加密很复杂,但是去网上一搜就搞下来了。你用这种复杂的加密算法降低了游戏的可玩性。

还有一个问题是越是强保护性壳越好?我们做外挂,做游戏,游戏之后中木马病毒,对一个做木马的来说它是没有办法采用强保护性壳,这是受木马本身的特征所限制的,但是对游戏就不是这样,游戏可以采用一些比较高级的私家壳,越是强的壳研究的人越多,拿到脚本一跑就脱掉了。

另外,壳越强稳定性越差,比如加了驱动以后稳定性很差,对游戏本身的玩家是一种限制。但是壳用得好,像定做的并且用得比较稳定,壳的选择,一方面要选择一些很强的,这是肯定的。另外,要保证它的稳定。

另外,越是成熟的反外挂系统越好吗?其实它有它自己的好处,但是成熟的反外挂系统对公司来说,一般的公司承受不起,比如每年要给多少钱,运营都受它的控制,反外挂增加了你的运营成本,另外,越是成熟出名的反外挂系统越被人研究得多。例如NP,但是NP本身有很多漏洞。因为它里面有500道串口,包括一些别的漏洞,像外挂,我经常说游戏本身就是一个堡垒,不管是把这个门做得再好,用金装门或者用铁门,把锁加得特别重,但是你把门搞得再先进,却没有发现别人已经从窗户里跳进来了,比如像NP对游戏进行保护,比如内挂,完全可以做得让你查不出来,你这个NP可以对内存进行校验,对简单的外挂开发人员很难做到,但是在不修改程序的情况下做代码也是很正常的,你对游戏进行保护我就不破代码。然后你查我进程、查我的窗口,我也可以采用一些操作系统的漏洞让你没有权限。比如二围空间的虫子永远看不见上围空间的虫子在干什么。我虽然存在,但是你没那个权限查我,对你来说我是隐蔽的。所以这种情况下用NP,对这种外挂就没有办法。所以越成熟的反外挂系统不一定最好,比如你是一个项目经理要选择反外挂系统,让你去选IPO的、选NP的或者自己研发的,你不能说看到人家都选择NP你也上NP的,上了NP之后没过几天就被人家搞定了,那你就白投入了。

我这里讲一道很简单的反外挂系统,它的目标一是防止游戏明文被截获;因为做外挂的人截获不了的话就没办法做外挂。还有就是实现简单、占用资源少,不会产生任何负担。再就是系统独立,与游戏低耦合。另外一点是可以防脱机、查内挂。这套系统实现,我只是把思路说一下,首先实现服务端下发代码,每次玩家登录服务器,加密算法都是由服务器动态下发下来的。另外,加密算法每次更换,这个很简单。另外我这个服务器代码里面有内存校验,我要随机对内存进行抽查。另外,客户端无解密函数。这几点都很容易做到。

做这么几点就可以达到我上面说的目的,首先纺织游戏明文被截获。我说的加密代码只是针对加密算法而不是减密算法。比如我要对算法那部分进行Hook掉,我动态代码有一个内存验证,如果是hook的话我就查出来。另外一点,我这个系统代码是从下发来的,我每次更新,这个游戏不需要更新。另外一点,不存在减密算法,这样的好处是加密和减密算法不是同一个,一两句话我也解释不清,但如果是加密算法和减密算法采用不同的算法的话,在配合某些手段,它的效果会非常好,比如加密算法,他就没法利用减密函数进行减密。这只是一种思路,不是说拿出去以后没人搞得定,但是会很有效。

下面我说一下游戏漏洞。有几个比较常见的漏洞,比如QQ飞车为什么会产生穿墙呢,是因为服务端没有对角色所在的位置进行障碍判断。我对客户端直接发了一个穿墙的信息,服务器不进行判断而直接认可,那就穿墙了。像攻击加速这些都是很简单的。还有复制,主要是利用对物品处理的时间延迟,服务器对物品的操作有一个时间延迟,我说我是快速对某一种物品进行操作,如果网络不好的话就会造成延迟,而且这个延迟如果处理不好的话就会对物品产生一些复制或者其它的不可测的事情。刷墙漏洞有很多方式,外挂不停地给攻击发送任务,某个任务成功地封装就刷墙了。

漏洞的防御,比如我这里写了服务端代码(图),服务端接受玩家的请求。这个脚本存在什么问题呢?你可以先判断一下,给他宝珠以前判断一下这个任务是不是完成了,如果这个任务在进行中,你才给他宝珠,其他情况下你不要给他,这样他每次在发送接收宝珠的时候就不用去管它了。但它还存在一个什么问题?在检测任务的时候首先要接触这个任务,如果玩家的请求是接收任务,直接把任务就给他了。这种出现什么问题呢?它如果不断给服务端发请求,告诉服务端我要接收任务,客户端每次说我要接收任务,客户端就把任务给他,就会产生上面的接收宝珠的情况,你看看它是不是做过这个任务,如果没有做过才给他,如果做了就不要给他。这种逻辑除了任务的产生,首先是服务器产生的,其次像服务器很多这种逻辑,你要有一个处理不对就可能全盘被利用了。比如说游戏服务器一般不是一个人选,有很多人选,就不能保证每个人写代码都很优秀,只要一个人写代码不对,游戏BUG就会被利用。

现场问答:

问:请问你对ACG游戏和迷你游戏这种休闲类的小游戏有什么看法,如果长时间的话肯定是检测不到的,比如描杀怪物?

牛博威:是因为你把描杀怪物的任务权给他了。把好几套算法都加上,虽然你可以做,但就很难去做。你只要把这个怪物控制权给客户端,就等于给了外挂。

问:就是说对动态代码没有什么效果了?

牛博威:很难避免。

问:QQ游戏里面的小游戏,我模拟按键我截图,根据图样判断?

牛博威:一般来说做这种外挂的人要散发出去,不可以说做了这种东西自己应用,他既然要散发出去你可以把它的外挂拿出来,查它的进程、特征码。像这种外挂是很好对付的,我可以不客气地说做这种外挂的人他们水平很低。

问:就是因为他们水平低所以很难对付?

牛博威:他们做很多。比如对截屏进行一些处理,进行一些Hook,例如验证码之类的。

问:你好,刚才听到牛博士谈到天晴的反外挂,能不能介绍一下?天晴是如何做这一块的,刚才你说它做得比较成功。

牛博威:它的技术含量其实很低,但是它每次检测很隐蔽,比如星期一检测一次,检测以后发现谁用了外挂放到数据库里面先不动,一星期之后把游戏代码去掉,把谁使用了外挂全部封掉,这种情况下做外挂的人就发现不出才一个星期就被人家封了,做外挂的人不可能只用一个数据,他把策略靠后。

问:如果真想解决外挂,如果所有的东西都通过服务器来运行怎么解决?魔兽世界你有没有分析过?

牛博威:没有分析过。

问:我对它的了解,它的结构包括所有的运算是全部在服务器端?这种可以防止漏洞,真的有外挂也是那种案件经营形式的,因为没办法控制语言的东西。玩家是必须得登录到页面进行点击的。但外挂只能模拟成玩家的点击。虽然可以模拟出一个外挂的,但是你在服务器端的运行依然要符合规则,我相信外挂能快速做一些事情。

牛博威:不是,像韩国的游戏机市场特别火爆,他们的要求是外挂要跟人一样,我用你们的外挂就是跟人一样,你啥都跟人的一样,就是你游戏干什么我也做什么,打怪兽的时候你打一个怪,人工打的时候可以三分钟发一次,怪物少,那你的外挂也是三分钟发一次,全部跟游戏一样。

问:那等于是机械上面的控制了,对游戏公司来说没有大的损失?我们看来对游戏公司来说,点卡什么的都还是在消耗状态。因为我主要在想这个问题,因为你没有分析过魔兽世界,我想问问它在这方面的亮点,因为我看他他所有的运算都在服务器端,包括技能的释放都在服务器端进行运算。

牛博威:这可以防止漏洞但无法防止外挂,像魔兽它也是往客户端发。

问:我知道有外挂,但没有你说的那种很夸张的外挂。谢谢。