石器时代LA官方

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1277|回复: 1

[源代码] 修复石器时代96号封包BUG

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
25322
石币
14842
发表于 2019-5-26 15:08:52 | 显示全部楼层 |阅读模式
在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;这句话的下面加上如下代码
  1. if(nPet > 4 || nPet < 0)return;
  2. if(sPet > 4 || sPet < 0)return;
复制代码

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

回复

使用道具 举报

0

主题

85

帖子

89

积分

注册会员

Rank: 2

积分
89
石币
4
发表于 2020-8-27 07:32:06 | 显示全部楼层
谢谢你的好资料。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|石器时代LA官方

GMT+8, 2020-9-21 11:50 , Processed in 2.603772 second(s), 24 queries .

快速回复 返回顶部 返回列表