以高速通关玩法(Speedrun)闻名的经典作品《塞尔达传说:风之杖》(The Legend of Zelda: The Wind Waker)近期被发现存在一个可实现任意代码执行(Arbitrary Code Execution,简称ACE)的程序漏洞。这一发现彻底改写了该游戏的速度竞赛格局,原有世界纪录被大幅刷新,但与此同时,游戏速通社区也不得不紧急应对这项颠覆性技术带来的规则挑战。

任意代码执行(ACE)指攻击者(此处即玩家)利用程序漏洞使游戏执行特定代码的技术。在速通领域,ACE常被用于直接触发游戏结局,堪称“任何手段通关”(any%)类别的终极杀手锏——这类比赛只要求用最快速度抵达结局,不限制达成方式。
尽管此类漏洞并非普遍存在,但ACE与《塞尔达传说》系列速通有着深厚渊源。《时之笛》(Ocarina of Time)和《梅祖拉的假面》(Majora's Mask)均曾发现过ACE漏洞。这类发现对速通生态的影响堪称颠覆性,甚至可将两部作品的速通史划分为“ACE前”与“ACE后”两个时代。如今,《风之杖》也终于迎来了它的ACE时刻——或许用“终究未能幸免”来形容更为贴切。
常规操作仅需两分钟
根据目前公认的世界纪录保持者JTown2909发布的16分48秒通关视频,可以清晰观察到ACE技术的实施过程。操作起始阶段,玩家运用《风之杖》速通中常见的高速游泳漏洞获取风之杖,随后立即前往塔乌拉岛获取核心道具“相机”。此后通过一系列精密的位置调整(即“setup”步骤)对特定树丛进行拍摄。
完成拍摄后执行存档读取操作返回初始岛屿,继而运用相机与风之杖实施更多非常规操作。经过又一次精确的位置调整后,玩家在海滩特定地点启动相机,随后看似寻常地推开小屋门扉——结局动画竟随之触发。整个流程中仅有最初两分钟(即在监狱获取相机的阶段)属于常规游戏操作范畴。
技术原理深度解析
尽管涉及高度专业化的知识,我们仍尝试解读ACE的实现机制。其核心在于“文本堆叠”(Text Stacking)技术:《风之杖》中NPC对话框只在角色进入视野时才会生成,而相机相册界面切换时存在极短的可操作间隙。通过组合这两种特性,可创建出处于“待触发状态”的对话框(因NPC未进入视野而实际不显示)。
当多个NPC的对话框同时处于待触发状态时,若使这些NPC在同一帧进入视野,将导致多个对话框生成代码同时运行引发异常。具体表现为:两个proc_msg(对话框管理对象)同时生成,而本应共享的静态指针sScreen(指向屏幕显示对象)被第二次生成覆盖。当首个对话框结束调用dMsg_Delete函数释放内存后,sScreen仍指向已释放区域(形成悬垂指针),最终导致已释放内存被重新调用(Use-After-Free漏洞)。
精密操作的连锁反应
实施过程中,玩家先通过文本堆叠技术预约NPC A和B的对话框引发sScreen覆盖。随后单独触发B的对话框,其结束时释放sScreen指向的内存(因A的proc_msg仍存在,sScreen保持地址值)。接着触发A的对话框后立即使其离开视野,导致其终止处理函数未被调用。
最后通过精确调整林克位置,在启动相机的同时使A进入视野。此时相机相册的像素数据会加载到sScreen指向的内存区域,而随后触发的dMsg_Delete函数会将该区域数据作为代码执行。通过事先在第三张相册照片的特定像素写入特定值(80ABBDFF),可诱导程序跳转至指定地址(80ABBE07——该地址对应林克X坐标的第四字节)。
此前精确调整坐标的操作正是为此服务:通过坐标字节数据引导程序跳转至控制器2-4的输入存储区(803F0F3C)。该区域连续字节序列可通过特定按钮组合构造成“直接调用结局”的指令链,最终实现任意代码执行。
人力难以逾越的壁垒
虽然游戏内的所有操作(树丛拍摄、位置调整、文本堆叠)理论上均可人工完成,但控制器2-4的输入精度要求极高,目前必须依赖外部工具预设。现行《风之杖》速通规则禁止使用实时输入显示器等外部工具,但未对预设操作明令禁止——玩家可通过在控制器2-4端口依次预设输入数据(拔除控制器后输入状态仍保留于内存),在游戏开始前完成全部准备工作。
这种钻规则空子的行为目前未违反明文规定,但已在社区引发激烈争论。此外,未来很可能出现无需多控制器输入、完全依赖人工操作的新漏洞利用方案。
速通生态的重构
ACE技术对any%类别堪称降维打击,以往积累的所有技巧体系瞬间归零。参照《时之笛》与《梅祖拉的假面》的先例,《风之杖》速通社区势必需针对ACE技术重新规划类别划分与规则体系。尽管这意味着现有体系的颠覆,但时间记录的飞跃式突破同样彰显着速通玩家永不停歇的探索精神——即便GameCube时代的作品也难逃技术革命的洗礼。下一部被“攻破”的《塞尔达传说》作品将花落谁家?这场技术革命既令人敬畏,更充满期待。



