最近老有人问我是不是出了改dota英雄技能的外挂,什么月骑无限大,剑圣无限斩,巫妖无限弹之类。
我在这里一并回答一下,并且稍微说说原理。因为我对地图方面其实是一窍不通,如果有说的不对的地方,还请指正。
其实这些现象都是使用了作弊地图导致的。本来魔兽争霸是有一个地图验证的,如果你跟主机的图不同,是进不去的(要下载地图)。但是魔兽对地图中的war3map.j文件是进行bcc(block check character)校验的,bcc不同于md5,bcc一般只是用来排错的,并不是加密算法。所以就有人写出了这样的代码,可以在b文件末尾添加上一些不起作用的字串,来让b文件的bcc校验码等于a文件(具体代码我就不贴出来了,很容易搜到)。于是呢,我们就可以做到随意修改地图中的war3map.j ,然后再处理一下,使之跟原来的war3map.j的bcc校验码相同。再把改过并处理后的war3map.j文件替换原来的,这样做出来的作弊地图,暴雪的验证会因为bcc校验相同,而把它认为和原版图是相同的。达到的效果就是,别人用正版图建主机,你可以进入,你用盗版图建主机,别人用正版图也可以进入。但是别以为可以为所欲为的修改war3map.j ,虽然你突破了验证这一关进入了游戏,但是魔兽的联机机制是没有办法突破的。
在这里稍微谈一下魔兽的联机机制,没兴趣的请略过这一段。魔兽联机时,一直有个同步机制,每个联机的玩家都会同时计算所有数据,一旦有不一致,就会导致掉线,这也是为什么用金山游侠之类的游戏修改器单机时可以改钱,联机时一改就掉线。因为你只能修改你自己的机器上的数据,而无法改别人的,单方面修改的结果就是造成你跟其他人不同,你就会掉线。当然,如果所有人同时修改的话,仍然是不会掉线的,所以现在有一些联机修改器,参加游戏的几个玩家一起开这个修改器,可以在玩rpg时改钱什么的,我几个同学就老是用这种修改器来通关一些很难打的rpg图。顺便说一下,这样玩下来保存的replay是无法正常播放的,因为replay只记录动作,你使用修改器的改动不会被记录,播放replay时会因为你并未像你游戏时那样修改数据,造成replay不合逻辑而出错。再顺便说一下吧,为什么所谓的人品外挂并不能实现。曾有人发帖抱怨,怎么蓝胖子次次放招都多重施法,怎么某人每次都暴击,他们是不是用了人品挂。其实这是不可能的,有人以为魔兽中的随机数据都是由主机计算的,这样主机就可以找到办法来修改随机数,造成每次都对他有利的结果。但是实际中并非如此,随机数也是所有人一起计算的,也就是说魔兽里的随机是个伪随机。在一局游戏一开始时,主机会发给每个玩家一个随机数种子(这个种子很有可能就是主机从建立主机到游戏开始所经历的毫秒数),之后的一整局中,所有的随机数都根据这个随机数种子,依照事先定好的算法计算出来,这样也就保证了所有人计算出同样的“随机”结果。另外,这个随机种子也会记录进replay,这也从一个侧面说明了魔兽里的随机是伪随机,如果是真的随机,replay就无法重现了。说的有点多了,下面回到正题。
因为魔兽联机机制的存在,你要是随意改了war3map.j,例如改成给自己增加10000的钱,但是别人是按照的没有修改的war3map.j,在别人机器中你是没有那么多钱的。这时你买一个8000的物品,在你自己机器上是可以的,因为你有10000的钱,但是在其他人机器上,你钱却根本不够!这样的不合理动作就会造成你跟其他人断开连接。
也就是说,你只能修改那些不会造成冲突的地方。例如有些作弊图可以显示出地图全开的效果,因为这些显示的东西只是在你本地机器上显示出来的,并不会对其他玩家照成冲突。类似这样的修改都是可行的,不会掉线。
那么,为什么会出现这种有变态技能效果的dota作弊图呢?我刚开始也很困惑,这么夸张的改动怎么竟然没有掉线?我跟朋友要了个作弊图玩的replay,在我的机器上,用正版dota地图播放,竟然完全再现了那些变态效果!因为我对地图方面并不了解,所以开始上网找资料,并通过qq向某些搞地图的高人请教,又下载了那个变态版dota作弊图和某平台私自山寨的所谓“原版”dota图,提取出来war3map.j来进行对比。经过n久的努力,总算搞明白他是怎么改出来这种效果的了。
原来是因为dota使用到了game cache,而作弊图是单方面修改了game cache中的数据,然后通过函数同步给了所有的玩家。通俗点说,game cache相当于一个池子,所有玩家共享这块区域,任意一个玩家都可以修改这个池中的数据,也可以发出通知,让所有人都来同步这个池子,这样就变相修改了其他人的数据。举个例子,例如dota里黑曜石的放逐技能,它可以减少一个人的智力,一分钟后再归还给他,dota里关于这个技能的函数,把目标和要归还的智力值记录在game cache中,1分钟之后会再从game cache取出目标和智力值,给目标加上相应的智力值,就完成了归还这个人的智力的过程。但是在作弊图中,这里增加了代码,先进行一个判断,如果黑曜石是本机玩家,会把game cache中记录的目标改成本方随机的一个队友,然后把game cache中记录的智力值改为500,然后通知所有玩家同步game cache中的这两个值,这样就完成了对所有人game chche中这两个值的修改。1分钟一到,dota就会向这个目标“归还”智力,这样,本方的一个玩家就凭空增加了500智力。(那个被减少智力的倒霉玩家就无法被归还了,可怜)
大致的原理就是这样了,具体细节我就不详细叙述了。不过dota用到game cache的地方其实并不多,所以能改的地方也就那几个。这也是为什么作弊图要专门改这几个地方,而不是改成例如加钱或者加攻击力或者直接胜利之类的,不是不想改,而是无法实现。另外,暴雪官方的地图是不会这样使用game cache的,所以不用担心对战地图被改(另外对战图还有暴雪标志的保护)。其他的rpg地图,如果本身没有用到game cache的,也就改不出来什么花样,最多显示个全图之类。
暴雪将会在1.23修补这个地图验证漏洞,目前1.23的补丁已经在测试中了,相信升级之后,这种改图作弊将不复存在。只是不知国内玩家到时是不是还要继续死守bug频出的1.20呢?
强行插入广告一则:浩方平台会再对地图进行自己的验证,md5验证,作弊图是无法通过的。
至于做山寨dota图的某平台嘛,就我目前来看,它是没有任何地图验证的,唉。
应广大群众强烈要求,这里给出山寨版dota 6.57c的作弊图链接地址,请大家自行围观(话说我参照这个做出了58b和59c的作弊图,活活活):
http://sc2dota.com/news/310.html