传奇沙城主奖励脚本漏洞分析及完整修复方案

来源: 作者: 点击:
一、核心漏洞成因拆解(无限领取根源)

1.变量操作逻辑错误(最关键漏洞)

老区奖励脚本[@yd]中,扣除变量写为“decg2121”,但控制领取权限的变量为g211。脚本通过g211=1判定可领取,却递减无关的g212变量,导致g211始终保持1,无领取次数限制,沙城主可反复触发领取。同时变量未声明存储,重启后自动重置,进一步加剧无限领取问题。

2.条件判断结构缺失

[@lqc1]标签下仅通过“EQUALg2110/1”分支跳转,无#ELSEACT兜底逻辑。若变量出现异常值(如未赋值),脚本会跳过所有判断直接执行领取逻辑,绕过权限校验。且条件判断未合并,存在逻辑断层,可通过指令绕过变量校验。

3.奖励领取无身份唯一性校验

仅用ISCASTLEMASTER判定沙城主身份,无领取记录绑定。若多名玩家先后成为沙城主,或沙城主更换角色,均可凭借身份重复领取,无单人领取限制,导致奖励多发、滥发。

4.时间校验与变量重置不同步

脚本仅限制领取时间为22:01-22:59,但无时间结束后自动重置变量的逻辑。若当日未领取,变量状态保留至次日,叠加变量操作错误,形成跨日无限领取漏洞。

5.注释与指令冲突及冗余问题

脚本中大量注释未规范书写,部分注释符号与指令混淆,可能导致引擎解析异常;多处重复发送全服提示,占用脚本执行资源,同时无奖励领取后变量清零逻辑,进一步放大漏洞。

二、完整修复脚本(适配主流引擎,可直接替换)

修复核心:校正变量关联、补充身份绑定、完善条件逻辑、添加变量存储与重置,彻底杜绝无限领取,同时优化脚本结构。

[@main]
#IF
ISADMIN
#SAY
<新区清除所有奖励数据/@qc><合区首次奖励清理/@qlsc>
<老区每日奖励清理/@qllq><提交所有行会于今晚攻城/@jwg>

<查看奖励/@lq>
#ELSEACT
goto@lq
Break

[@qc]
#ACT
MOVg2111//开启新区奖励领取权限
SAVEVARg211..\Envir\QuestDiary\CastleReward.txt//存储变量,防止重启重置
SENDMSG5新区奖励数据已重置,领取权限开启!
Break

[@qlsc]
#ACT
MOVg251//开启合区奖励领取权限
SAVEVARg25..\Envir\QuestDiary\CastleReward.txt
SENDMSG5合区首次奖励清理完成,领取权限开启!
Break

[@qllq]
#ACT
MOVg2111//重置老区每日奖励权限
MOVU10//初始化当日领取标记(个人变量)
SAVEVARg211..\Envir\QuestDiary\CastleReward.txt
SENDMSG5老区每日奖励已清理,当日领取权限开启!
Break

[@jwg]
#SAY
所有行会将于今晚同时攻城!
#ACT
AddAttackSabukAll0
SENDMSG0全服通知:所有行会将于今晚开启攻城战,胜者可领丰厚奖励!
Break

[@lq]
#SAY
攻城奖励请当天晚上攻沙结束11点之前来领取,未领取过时间后果自负!
开区第3天奖励1套顶级+8000点+城主2套+1.8倍坠一个
<两个沙城主只能有一个可以领取,领取后请自行分配/@lqc1>

合区首次攻沙奖励10000易点<领取/@lqc>
老区每日城主奖励200易点<领取/@lqc1>
Break

[@lqc]//合区奖励领取
#IF
EQUALg251//仅权限开启时可领取
HOUR2222//限定时间22点
MIN159
ISCASTLEMASTER//验证沙城主身份
#ACT
GameGold+10000
DECg251//关闭领取权限
SAVEVARg25..\Envir\QuestDiary\CastleReward.txt
SENDMSG0沙城主〖<$USERNAME>〗已成功领取合区首次攻沙奖励10000易点!
#ELSEACT
#IF
EQUALg250
messagebox沙城主奖励已发放完毕!
#ELSE
messagebox您不是沙巴克城主,或已超过领取时间(22:01-22:59)!
#ENDIF
Break

[@lqc1]//老区/新区奖励领取
#IF
EQUALg2111//权限开启
HOUR2222
MIN159
ISCASTLEMASTER
EQUALU10//验证未领取(个人变量绑定角色)
#ACT
goto@yd
#ELSEACT
#IF
EQUALg2110
messagebox沙城主奖励已发放完毕!
#ELSEIF
EQUALU11
messagebox您已领取今日奖励,不可重复领取!
#ELSE
messagebox您不是沙巴克城主,或已超过领取时间(22:01-22:59)!
#ENDIF
Break

[@yd]//奖励发放核心逻辑
#ACT
//发放奖励道具
give城主之刃2
give城主战甲(男)1
give城主战甲(女)1
give1.8倍坠1
give秒杀一切㊣盾1
give秒杀一切㊣盔1
give秒杀一切㊣镯2
give秒杀一切㊣戒2
give秒杀一切㊣靴1
give秒杀一切㊣带1
give秒杀一切㊣石1
give秒杀一切㊣链1
give绝对防御甲1
give无敌秒杀刃1
GameGold+8000

//标记已领取,关闭权限
SETU11//个人变量标记,绑定当前角色
DECg2111//全局变量关闭领取权限
SAVEVARg211..\Envir\QuestDiary\CastleReward.txt
SAVEVARU1..\Envir\QuestDiary\CastleReward.txt

SENDMSG0沙城主〖<$USERNAME>〗已成功领取攻沙奖励,实力大增!
Break

[@wb]
#ACT
messagebox沙城主奖励已经发放完毕!
Break

//新增每日凌晨重置脚本,自动开启次日领取权限
[@OnTimer9]
#IF
HOUR00//凌晨0点重置
MIN05
#ACT
MOVg2111//重置老区每日奖励权限
MOVU10//清空所有角色领取标记
SAVEVARg211..\Envir\QuestDiary\CastleReward.txt
SetOnTimer986400//每日重复执行(86400秒=24小时)
Break

三、关键修复点详解

1.变量关联校正与存储优化

将[@yd]中错误的“decg2121”改为“DECg2111”,使变量递减与权限控制对应,同时新增变量存储指令(SAVEVAR),将变量数据写入文本文件,避免重启后变量重置。添加个人变量U1绑定角色,实现单人领取唯一标记,杜绝多人重复领取。

2.条件判断逻辑完善

在[@lqc1]标签下合并多条件判断,新增#ELSEACT兜底逻辑,按“权限状态-领取记录-身份时间”分层校验,覆盖变量异常、重复领取、身份不符等所有场景,避免逻辑断层导致的漏洞绕过。

3.新增每日自动重置功能

添加[@OnTimer9]定时器脚本,每日凌晨0:00-0:05自动重置g211(领取权限)与U1(领取标记),并设置24小时循环执行,实现老区每日奖励自动刷新,无需手动清理,同步解决跨日领取漏洞。

4.身份与领取记录绑定

通过个人变量U1标记领取状态,绑定当前角色,即使沙城主更换角色,原角色领取记录仍保留,新角色需重新验证权限;同时删除冗余提示,优化脚本执行效率,避免解析冲突。

5.注释与指令规范

清理混乱注释,规范//注释格式,确保不与指令冲突;补充功能注释,明确变量用途与脚本逻辑;合并重复全服提示,减少资源占用,避免引擎解析异常。

四、额外防漏强化设置

1.变量权限管控

在服务端M2主程序中,进入“脚本命令设置”,勾选“自定义变量需存储验证”,强制变量写入文件后生效,防止通过内存修改变量绕过校验。同时限定变量取值范围(g211、g25仅0/1取值),避免异常值触发漏洞。

2.沙城主身份二次校验

在[@yd]与[@g2sc]标签中补充行会校验,示例代码:“CHECKGUILD沙巴克”,确保领取者所属行会为沙巴克,避免非行会成员通过身份bug领取奖励,双重保障身份合法性。

3.奖励发放日志记录

在奖励发放脚本中添加日志写入指令,示例:“WRITELOG..\Log\CastleReward.log沙城主<$USERNAME>于<$HOUR>:<$MIN>领取奖励”,便于后续核对奖励发放记录,及时发现异常领取行为。

五、脚本部署与测试要点

1.部署步骤

将修复后脚本替换原文件(路径:Mir200\Envir\market_def\QFunction-0.txt),在对应路径创建CastleReward.txt文件(用于变量存储),保存后在M2中执行“重新加载所有脚本”,同时设置9号定时器启动(SetOnTimer986400),无需重启服务器即可生效。部署前备份原脚本,便于异常回滚。

2.针对性测试方案

(1)重复领取测试:沙城主领取奖励后,再次点击领取,验证提示“已领取今日奖励”,无法重复领取;更换角色成为沙城主,验证无权限领取当日奖励。

(2)时间校验测试:在22:00前、23:00后尝试领取,验证提示“超过领取时间”;在22:01-22:59内领取,确认奖励正常发放,变量同步递减。

(3)重启测试:重启M2主程序后,查看变量文件,确认g211、g25、U1数值保留,领取状态不重置,无权限开启漏洞。

(4)权限清理测试:管理员执行老区每日奖励清理,验证变量重置,当日未领取角色可重新领取,已领取角色仍受限制。

六、常见问题排查

1.领取后变量未递减

排查变量存储路径是否正确,确保CastleReward.txt文件存在且权限可写;检查DEC指令格式,变量名大小写一致(如g211不可写为G211),部分引擎需提前声明变量,可在脚本开头添加“DECLAREg2110”。

2.自动重置功能失效

确认M2中已开启定时器功能,9号定时器无冲突占用;检查HOUR、MIN指令参数,确保重置时间设置正确,定时器循环周期为86400秒(24小时)。

3.个人变量绑定失败

排查变量前缀是否正确,个人变量用U1、U2等(全局变量用g、N等),部分引擎个人变量需加前缀“USER.”,可改为“SETUSER.U11”,确保变量与角色绑定。

七、总结

本次沙城主奖励脚本无限领取漏洞,核心源于变量操作错误与条件逻辑缺失。修复后通过“变量校正+身份绑定+存储重置+分层校验”四重逻辑,彻底杜绝漏洞,同时优化脚本稳定性与易用性。脚本适配主流传奇引擎,可直接部署使用,搭配引擎层面防护与针对性测试,能实现沙城主奖励精准发放,保障玩法公平性。后续可根据版本需求,拓展奖励分级、多人领取权限分配等功能,进一步完善玩法体验。
[顶部]