在2012年-2014年的时候,石器SF里非常盛行一个BUG,那就是任何玩家都可以使用GM命令,还可以让玩家随机带走地图上任意NPC移动,又或者造成NPC消失的BUG,这就是著名的96号封包BUG。目前市面上的服务端应该都修复过了,所以大家都可放心。 这里先说下石器里服务端96号封包的作用,接收客户端传来的宠物状态,休息,待机,战斗,骑宠,邮件这5个状态。 BUG的原理是这5个状态分别以01234这5个整数传送给服务端,但是服务端并未限制只能这5个参数,所以通过封包发送可发送小于0和大于4的参数。在此封包的最后一句是写入CHAR_WORK_PET0_STAT+状态的数值,结果就会出现如果写入大于4小于0的数值,就会溢出到其他函数并赋值里,这就导致了任意账号可以是GM账号并且可使用GM命令和玩家可以随机带动站在地图上的NPC。 最开始并不知道这个BUG的触发条件,而且只是个别几个大服才出现,大多数人没在意。直到大范围出现并有人写了个工具来实现。 修复的方法有两种 1、在没有源码的情况下,只要服务端支持ablua,可以对指定的账号限制使用GM命令即可。不过在当时只有一个服的GM做了,在没有源码的前提下,只靠LUA来勉强屏蔽这个BUG,我还是非常佩服的。而且当时也没有太多人会LUA,所以这个方法我只看到就这么一个服用。 2、通过源码修复,有源码就非常方便了。我(神奇的牧羊人)在创建神奇社区的时候,最开始也是并不知道触发BUG的方法,直到有人发了工具,才通过工具发送来的封包值找到问题所在,然后修复了,下面说下源码修复的方法。 ①打开callfromcli.c ②搜索void lssproto_PETST_recv( int fd, int nPet, int sPet ) ③在if (!CHAR_CHECKINDEX( charaindex ) ) return;这句话的下面加上如下代码 - if(nPet > 4 || nPet < 0)return;
- if(sPet > 4 || sPet < 0)return;
复制代码
总结:大多数封包BUG都是利用服务端没有限制实现的,理论上不是刻意利用工具发送封包,在正常游戏的情况下是不会发送其他值的,在写代码的时候一定要考虑周全。
|