| 案例1: QUERYVAL 0 1 9 @发红包 请输入你本次红包元宝的数量! //这个命令就是属于玩家通过客户端写入值然后发送给服务端!这个值同时水上漂也可以修改成任意值! 这个脚本后面的触发普遍的GM都是这样写。 [@发红包] #IF CHECKGAMEGOLD < $STR(M10) #ACT SENDMSG 5 元宝不足,无法发送红包! break #ELSEACT GAMEGOLD - $STR(M10) .......(扣除元宝后的其他操作省略) .......(扣除元宝后的其他操作省略) break 从这触发脚本M10的值是玩家任意输入,虽然字符长度可限制,但水上漂可将M10改成任意值,也可超过21亿,甚至几百亿! 重点来了,如果CHECKGAMEGOLD 的值超过21亿,引擎判断就会出现问题,因为引擎执行出错,都是false, 所以上面的脚本如果检测元宝超过21亿,引擎会去执行GAMEGOLD - $STR(M10) 。 同样的道理,GAMEGOLD 给玩家减少元宝的值超过21亿。那么引擎也就不会去减少玩家元宝! 这样就造成水上漂工具修改M10的值超过21亿,玩家不用一个元宝,就可以给全服任何玩家发元宝! 那么我们现在从脚本检测上严谨杜绝的正确写法! [@发红包] #IF SMALL M10 1 #ACT SENDMSG 5 你输入的元宝不正确! break #IF LARGE M10 2100000000;// SMALL、LARGE、MOV、DEC等支持42亿以上数值运算; #ACT SENDMSG 5 你输入的元宝不正确! break #IF CHECKGAMEGOLD < $STR(M10) #ACT SENDMSG 5 元宝不足,无法发送红包! break #ELSEACT GAMEGOLD - $STR(M10) .......(扣除元宝后的其他操作省略) .......(扣除元宝后的其他操作省略) break 我们要在前面对M10变量进行检测,防止水上漂将M10的值改成负数,或者超过21亿,这样就可以防止元宝! 案例2: QUERYMSG 本服有人发红包啦,大家点击确定领取吧! @领取红包 //这命令也是属于玩家通过客户端点击确定后发送给服务端!水上漂可截取@领取红包后重复多次直接发送这标签! 这个脚本后面的触发普遍的GM都是这样写。 [@领取红包] #IF RANDOM 1 #ACT GAMEGOLD + 5000 SENDMSG 5 你领取了5000元宝红包 break 从这个触发脚本,@领取红包 水上漂可以发多少次,就加多少次元宝。 那么我们现在从脚本检测上严谨杜绝的正确写法! #ACT MOV D10 1 ;//发送这个弹窗的时候,我们给一个D变量赋值 QUERYMSG 本服有人发红包啦,大家点击确定领取吧! @领取红包 [@领取红包] #IF EQUAL D10 1 ;/领取元宝的时候,我们检测这个D变量 #ACT MOV D10 0 ; //领取完元宝我们还原这个D变量 GAMEGOLD + 5000 SENDMSG 5 你领取了5000元宝红包 break #ELSEACT SENDMSG 5 领取红包错误... break 这样才能杜绝水上漂利用客户端发送给服务端的包来刷元宝。 最后想说的是,客户端所发送的东西是不可信的,只有我们自己的脚本才是可信的! 案例3 案例4 |