ViLoot.txt (v1.2.8) 深度技术审计与改进建议报告(附完整 PDF 报告) #1
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📎 完整排版 PDF 审计报告附件
BH.dll机器码反汇编与pd2data.mpq数据表,对最新主分支ViLoot.txt(v1.2.8, commit1a84a315c4)进行了全量静态词法、AST 语法树与游戏内语义审计,整理出以下问题定位与修复建议供参考。一、量化缺陷总览(按严重度分级)
Alias前缀子串覆盖污染(无词界匹配)L94..98的AMACRAFT/BARCRAFT/ASNCRAFT定义在L128..130的SHOW_*CRAFT之前,将SHOW_AMACRAFT撕裂为SHOW_(am7 OR amc),导致大院长弓对全职业强行无视开关开启,而有形刺客爪/野蛮人投掷底材在L6786/L6788下被泄露的ETH彻底误杀!Alias反向引用永不展开(沦为恒假FalseCondition)L5455 GOODCIRC引用前序L5180..5186的SKAMA..SKASN,7 大职业技能别名全部未展开并编译为FalseCondition,L5456与L5527未鉴定亮金职业头环规则 100% 恒假报废;L3914 CORR_SM3引用L131 IS_SOE同样失效。L6751德鲁伊狼头底材少 1 个)致BuildConditionAST失败(root_idx = 0xffffffff整条永久死亡);L91 GOODBASE中段ELT)提前闭合外层括号,前半段普通/扩展级底材被ELT误杀,后半段逃逸出NMAG !RW把黄/蓝/暗金/符文之语误标为“符文之语底材”。[NIMA]符文之语底材总表复制粘贴灾难L6808..6816)FORMULAASNSK,导致这 5 大职业高技能白板底材失去保底,在 20 级后或FILTLVL>=3下直接跌入L6824 JUNKITEM被静默屏蔽!>=条件运算符被Condition::Parse静默丢弃L859、L877、L895(T1~T3 地图 A 级评分)6 处>=4被静默丢弃,低分地图(0~3分)误标橙色A级;L4248..42504 处SOCKETS>=2同样被静默丢弃。AND/OR等优先级逻辑反转L5560 GOODSOR中PREFIX=453 ORPREFIX=968粘连插入隐式AND FALSE,火/电/冰三大单系法杖/法珠前缀全灭;L332..3387 种无瑕宝石在地面不显示配方、放进背包却无视开关强行刷屏。%跨{奇偶错位L3577误将%TIPRTS%写为%PTRLTS%,悬浮窗原样输出字面量"%PTRLTS%";L183小紫瓶35%{%PURPLE%r触发加载期正则错位,将{...}内小写r原地篡改为大写R(R35%+)。{...}吞属性L1251、L4430混入隐形 BOM (U+FEFF);cm4(33 条)与tm1i..tm9i(99 次展开)在标准 S14 中不存在;L360红白珠与L381..394全系彩虹刻面暗金珠宝在背包内悬停时原版词缀属性被彻底抹除!4,366条规则性能优化%gray%/%Orange%/%Coral%/%Red%依赖加载期正则兜底;L133 IS_XXX0 引用;743 KB/4,366条规则每帧线性扫描开销比同类过滤器高约 70%。二、P0 级引擎底层解析缺陷深度剖析(
BH.dll机器码实证)2.1
Alias前缀子串无词界覆盖:AMACRAFT/BARCRAFT/ASNCRAFT摧毁面板开关与 5 条规则在
BH.dll的ItemDisplay::Initialize(0x101708ac..0x10170cc9) 中,引擎对每条ItemDisplay条件串按Alias在文件中的定义行号从前向后单遍执行std::wstring::find原文子串替换(不检查单词边界)。在
ViLoot.txt中,底材集合别名定义在L94..98,而对应的 BH 面板开关却定义在后方的L128..130:Alias[AMACRAFT]: (am7 OR amc)➔ 先于 L128Alias[SHOW_AMACRAFT]: FALSE执行!Alias[BARCRAFT]: ((glv OR 9gl OR 7gl OR tsp OR 9ts OR 7ts) ETH)➔ 先于 L129Alias[SHOW_BARCRAFT]: FALSE执行!Alias[ASNCRAFT]: ((axf OR 9xf OR 7xf) ETH)➔ 先于 L130Alias[SHOW_ASNCRAFT]: FALSE执行!0x101730c0➔0x10178e32➔0x10172e90指令级推演):SHOW_AMACRAFT被替换为SHOW_(am7 OR amc)。SHOW_(am7落入0x10178e32 FalseCondition,但右侧OR amc对所有大院长之弓 (amc) 恒为TRUE——即便面板开关默认FALSE,非亚马逊职业在任何过滤等级下都会被强制显示所有未鉴定蓝/黄及白板 0 孔amc!SHOW_ASNCRAFT/SHOW_BARCRAFT被撕裂后,内层右括号提前闭合了(ASSASSIN OR FILTLVL=5 OR ...),导致末尾泄露出的ETH被隐式AND到整条规则顶层——所有有形 (!ETH) 刺客爪 (axf/9xf/7xf) 与投掷武器哪怕是刺客/野蛮人本职业或手动勾选开关也永远无法匹配!OR 9xf OR 7xf绕过SHOW_ASNCRAFT=FALSE,对全职业强制显示无形9xf/7xf。L116..133的全部SHOW_*/HIDE_*/IS_*长名称面板开关移动到L94短名称底材别名之前(长名称优先展开即可彻底根除前缀覆盖)。2.2 单遍
Alias反向引用失效:GOODCIRC(L5455) 与CORR_SM3(L3914)BH.dll在加载Alias[key]: val(0x1016f984) 时绝不展开val中的其他Alias;在对ItemDisplay展开时也仅从索引0到N-1正向遍历一次。因此,后定义的Alias一旦在条件体中引用了先定义的Alias,被引用项将永远无法展开:Alias[GOODCIRC]: (SKAMA OR SKSOR OR SKNEC OR SKPAL OR SKBAR OR SKDRU OR SKASN):SKAMA..SKASN全部定义在前方的 L5180..5186!L5455将L5456与L5527中的GOODCIRC替换为(SKAMA OR ... OR SKASN)时,L5180..5186早已遍历完毕!残留的SKAMA..SKASN(长度均为 5 字符,非 3~4 字符物品代码)在Condition::Parse(0x10178e32) 中全部被编译为恒假FalseCondition!FALSE,彻底瘫痪!Alias[CORR_SM3]引用前序 L131IS_SOE:CORR_SM3末尾的(IS_SOE BOOTS)在展开进L4248..4250后,IS_SOE(长 6 字符)未展开并沦为FalseCondition,即使玩家在面板中开启IS_SOE=TRUE,鞋子腐化孔数分支也永远不生效。BH.dll单遍架构下,被引用的子Alias必须定义在引用它的父Alias之后(例如将GOODCIRC移至SKAMA..SKASN之前,或直接内联展开)。2.3 括号失配:
L6751整条规则永久死亡与L91 GOODBASE条件逃逸污染%RW_BASE_GOOD%)少写 1 个右括号���DRU后的(((开启了 3 层外括号,但在!INF前仅闭合了 2 层(整行左括号 10 个、右括号 9 个)。ConvertToRPN(0x10172fb5) 在末尾遇到未闭合'('提前中断,导致首词DRU与后续条件树未能通过AND合并,BuildConditionAST(0x10171b05) 校验ast_stack.size() == 2 != 1失败,将root_idx置为0xffffffff——整条L6751规则对所有物品恒返回false!Alias[GOODBASE]漏写左括号导致中段ELT)提前闭合外层括号(污染 L6803 & L6804):2.4
[NIMA]底材总表复制粘贴灾难(L6805..6816):5 大职业全部误写为刺客FORMULAASNSK在文件末尾紧邻
JUNKITEM垃圾底材屏蔽规则之前的[NIMA] NMAG Items Master总表兜底区(L6805..6816):L2384..2389定义好了Formula[BARSK]、Formula[DRUSK]、Formula[NECSK]、Formula[PALSK]、Formula[SORSK],但L6808..6816的 5 条规则全部原封不动粘贴了FORMULAASNSK!这导致上述 5 大职业总技能>5或>8的白板底材在[NIMA]区完全无法命中,一旦未被前序特定规则接住,在角色CLVL>19或FILTLVL>2时将直接跌入L6824(JUNKITEM) 被静默隐藏!FORMULABARSK(限定BAR)、FORMULADRUSK(限定DRU)、FORMULANECSK(限定NEC OR WAND)、FORMULAPALSK(限定DIN OR SCEPTER)、FORMULASORSK(限定SOR OR STAFF)。2.5 非法
>=比较符被静默丢弃(6 条规则)与等优先级/粘连缺陷(9 条规则)>=条件比较符被Condition::Parse静默丢弃(共 10 处):FORMULAXPC>=4、FORMULAMFC>=4等 6 处>=4在ItemDisplay[...]中属于非法多字符运算符(右值"=4"整数转换失败后直接丢弃该原子条件),导致下限>=4消失,经验或 MF 仅为0~3分的低收益地图被错误评为橙色A级!应改为>3(或~4-6合并上下界)。SOCKETS>=2同样被静默丢弃,应改为SOCKETS>1。ORPREFIX=968粘连摧毁亮金法珠/法杖核心单系前缀(L5560 ➔L5561、L5605):Alias[GOODSOR]末尾(PREFIX=447 OR PREFIX=450 OR PREFIX=453 ORPREFIX=968 OR PREFIX=969 OR PREFIX=970)中ORPREFIX=968漏写空格!Condition::Parse在PREFIX=453与ORPREFIX=968之间自动插入隐式AND,而未知键ORPREFIX求值恒假;结合BH.dll从左到右等优先级求值,((PREFIX=447 OR PREFIX=450 OR PREFIX=453) AND FALSE)恒为FALSE——导致+2 火系 (447)、+2 电系 (450)、+2 冰系 (453)与968四组核心词缀在未鉴定 3★ 法师武器规则中全军覆没!只需改为OR PREFIX=968。(SHOW_CRAFT OR FILTLVL=5 STASH OR INVENTORY)实际从左到右求值为(((SHOW_CRAFT OR FILTLVL=5) AND STASH) OR INVENTORY)!SHOW_CRAFT也不显示配方;(2) 一旦捡进人物背包 (INVENTORY),无论SHOW_CRAFT是否关闭、过滤等级是多少,全部无条件强行显示长串配方!应加括号修正为(SHOW_CRAFT OR FILTLVL=5) (STASH OR INVENTORY)。三、P1 ~ P4 级动作宏、编码卫生、S14 覆盖度与性能优化
3.1 动作宏拼写错误(
L3577)与%跨{奇偶错位(L183)%PTRLTS%:%NAME%{%TIPLTS% %RED%Hi%ORANGE%g%YELLOW%h %WHITE%SK %CORAL%IAS %PTRLTS%%CL%%NAME%}%CONTINUE%将右侧花边别名%TIPRTS%(定义于L17)误敲为%PTRLTS%。经核对BH.dll.rdata全部 534 个宏常量表,全文件仅此一处未注册宏,游戏内物理攻速项链悬浮窗会直接打印刺眼的字面量"%PTRLTS%"。rvs悬浮窗小写r被篡改为大写R:%PURPLE%r %WHITE%35%{%PURPLE%r%WHITE%35%+ ...中,Action::Parse(0x10171e50) 在切分{之前先执行小写宏转大写正则;地面名字末尾35%的%与{后%PURPLE%的首%配成一对%{%,导致后续%配对全部错位一位,将%PURPLE%r%WHITE%中间的字面量%r%当作小写宏原地改为大写R(渲染出R35%+,与大紫瓶R65%符号混淆)。在r后加空格或转义避免夹在两个%之间即可修复。3.2 中段隐形 UTF-8 BOM、无效物品代码与 22 条悬浮窗吞没原版属性
U+FEFF):L1251 与 L4430 行首存在0xEF 0xBB 0xBF位于//之前(多文件合并时子文件带 BOM 所致),导致BH.dll无法将其识别为注释行。cm4;L75SOEMAPS及L736..801包含 SoE 私服专属代码tm1i..tm9i(共展开 99 次无效比较);lmal(拉苏克之槌)、rtmf、cm1p/cm2p/cm3p(PvP 护身符)的专属高亮规则,且缺少类似BadWolfL4330的未知新版本道具高优提醒兜底。%CONTINUE%规则在{...}中漏写%NAME%吞没装备原版面板(高影响体验问题!):!GROUND规则):在{...}内未写%NAME%且行尾无%CONTINUE%!玩家在背包或仓库内把鼠标移到暗金电珠/火珠/冰珠或 40/15 珠宝上时,原版词缀明细、需求等级、镶嵌部位说明被完全抹除,仅剩一行彩色星号!L181(pvpp)、L615(90+ 级重洗板子)、L5066&L5073(手工项链/戒指配方)、L6782..6784、L6786、L6790、L6792、L6794(恰西注入底材,注意同组的L6789与L6796正确写了%CL%%NAME%,唯独这 7 条漏写)。3.3 编码规范与
4,366条规则的帧率性能优化路线图L3546..3552(%gray%)、L5624..5625(%Orange%)、L5626..5628(%Coral%)、L5648..5650(%Red%) 共 14 处大小写混写宏为全大写(减少0x10171e50加载期std::wregex循环开销);清理 0 次引用的幽灵面板开关L133 Alias[IS_XXX]及L3894..3905中 3 组完全重复的常量别名SC_CAS*/PHY*/DEF*/UTL*。4,366条规则瘦身):ViLoot.txt规则总数达4,366条(体积743 KB,约为BadWolf2,561条的 1.70 倍)。在高密度 T3/T4 地图百件战利品同屏时,BH.dll对地面每件物品每帧线性遍历全部规则:L542..572按单个PREFIX拆成 30 条的超大护身符规则、以及腐化词缀说明中重复匹配相同前置条件的数百条%CONTINUE%规则按物品大类合并或收敛为Formula查表,可将热路径规则数削减约 25% ~ 35%,显著提升高密度刷图帧率稳定性。