修复96号封包的BUG - 神奇石器时代技术研究交流
神奇石器技术研究交流网 - 业务联系QQ:420004208

修复96号封包的BUG

  • 内容
  • 相关

在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;

FIX96fengbao.png


总结:大多数封包BUG都是利用服务端没有限制实现的,理论上不是刻意利用工具发送封包,在正常游戏的情况下是不会发送其他值的,在写代码的时候一定要考虑周全。

版权声明:若无特殊注明,本文皆为《sa60》原创,转载请保留文章出处。

本文链接:修复96号封包的BUG - http://sa60.com/post-128.html

本文标签:

修复96号封包的BUG