石器时代LA官方

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

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

[复制链接]

9979

主题

1万

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29439
石币
18832
发表于 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都是利用服务端没有限制实现的,理论上不是刻意利用工具发送封包,在正常游戏的情况下是不会发送其他值的,在写代码的时候一定要考虑周全。

回复

使用道具 举报

1

主题

9

帖子

11

积分

新手上路

Rank: 1

积分
11
石币
2
发表于 2021-7-27 11:44:22 | 显示全部楼层
总结:大多数封包BUG都是利用服务端没有限制实现的,理论上不是刻意利用工具发送封包,在正常游戏的情况下是不会发送其他值的,在写代码的时候一定要考虑周全。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

14

积分

新手上路

Rank: 1

积分
14
石币
5
发表于 2021-10-27 11:12:22 | 显示全部楼层
学习了,刚才看了一下源码这个BUG已经处理过了
回复 支持 反对

使用道具 举报

5

主题

261

帖子

462

积分

中级会员

Rank: 3Rank: 3

积分
462
石币
201
发表于 2021-11-2 14:02:12 | 显示全部楼层
原來以前還有這東西,我都不知道呢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2021-12-2 21:02 , Processed in 0.521709 second(s), 34 queries .

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