作者Append (鸦片)
看板Emulator
标题[讨论] TAS的任意代码执行(ACE)(上)
时间Wed Sep 2 13:13:13 2020
╭────────────╮
│ 前言 ── 什麽是 ACE? │
╰────────────╯
TAS 的全名是 "Tool-Assisted Speedrun/Superplay",
也就是「用辅助工具制作的通关/游玩影片」,
他们可以透过不断的存档读档、监控记忆体、放慢速度录制动作...等等辅助工具,
达成非人力可及的操作技巧,
进而完成「最快速度通关」或是「某些指定目标」。
大概在 2008 年左右,
网路上出现了不少「不务正业」的TAS,
他们看起来不太打算破关,
像是在 Pokemon 黑白版里面努力的阻碍交通,
https://youtu.be/crb-qQ58EGo
然而这些「不务正业」大致上都还是在游戏设计的范围之内。
过了几年之後这现象越发严重,
大约在 2013 年左右,
我发现 TAS 开始不务正业,
开始做一些「跟目前这个游戏本身没什麽关系」的事;
同时,这些TAS的标题上,大多都会写上
"
Arbitrary Code Execution" (ACE, 任意代码执行)。
我大概能想像这个词汇好像有些抽象,
不太容易马上看懂这想干嘛,
所以让我们来看一个例子──也就是「ACE」这个技术真的红起来的瞬间。
2014年的一月,
在全世界的游戏快速通关社群一年一度的盛会
AGDQ2014 之中,
由 DwangoAC 带领的团队设计了一台机器人 "
TASbot",
让他们能够在实机上现场表演TAS。
他们在当时玩了几个游戏,
其中最让人印象深刻,
甚至我觉得震惊世界的
,
是超任的
Super Mario World 玛利欧世界。
https://youtu.be/Uep1H_NvZS0?t=31m48s
游戏开始之後,可以看到玛利欧骑上耀西,
沿路像杂耍一样的玩弄一些路上的物件,
然而大约在影片的 33:28 处,
事情变得不太一样,画面开始出现一些不太对劲的东西 ...
几秒钟後,画面上出现了两个
可以操作的小游戏,
就在一台实机超任的玛利欧世界里面。
非常明显,这两个小游戏绝对不是任天堂当初设计的部分。
没错,这就是他们自己写的。
他们在实机超任的玛利欧世界中,
利用一些游戏的Bug,
在超任的记忆体里面写了这两个小游戏的程式码,
然後执行他。
於是这时候可以回到我们这次的主题,「什麽是ACE?」
看过上面的例子,应该大致能够想像,
他们在游戏中「
执行了一段由他们自己决定的程式码」,
这就是所谓的「任意代码执行」。
题外话,在节目里面他们说,
他们原本想要写一个红白机玛利欧一代,
然後再来跑他的 TAS,
但是实在是赶不上节目,
光是这两个小游戏就是表演前一天晚上才作好的。
於是,一年後,有了充裕的开发时间,
他们就在
AGDQ2015 现场端出来
红白机玛利欧了。
https://youtu.be/HvCoNSq3GEM?t=5m48s
GDQ 後来几年也都会有 TAS Block,
TASbot 团队也经常端出稀奇古怪的东西,
非常精彩,极度强烈推荐喜欢TAS的人们都可以看看。
------
╭─────────╮
│ ACE 影片范例精选 │
╰─────────╯
「任意代码执行」从字面上理解,
他几乎能够做到任何事情;
那麽大家究竟用ACE做过哪些事情呢?
这里提供一些经典的ACE影片,
包含了许多不同方向的作法。
(1) 最早期的 ACE TAS
我最早注意到的 ACE 是 2012 年年底的
Pokemon 黄版。
https://youtu.be/p5T81yHkHtI
他在10分47秒开始花了一分半的时间用按键进行大量输入,
最後放出了
彩虹小马的主题曲。
当时出现的时候,
圈子内的大家多少都知道一些很严重的记忆体bug,
「我们可以透过一些 bug 来改变记忆体的数值,达成奇怪的效果」。
就这个概念上,直接写一段 code 来执行好像也不算是太奇怪的事情,
但是真的作出来还是非常惊艳。
(2) 手动输入的 ACE
「任意代码执行」不见得需要透过 TAS。
事实上有些游戏只凭人力输入,
就能够控制好一整段的记忆体代码,
然後只要有触发执行的手段,
就能够不倚赖 TAS 的方式完成ACE。
SethBling 在 2015 年在实机超任的
Super Mario World 中,
透过 ACE 的手段执行了 Credits Warp,
也就是
直接跳到破关画面结束游戏,总时间花费 5 分 59 秒。
https://youtu.be/14wqBA5Q1yc
後来有许多游戏有找到类似的手段作出 Credit Warp,
在游戏开始不久之後直接跳到破关画面,
让这成为 Speedrun / TAS 的一种常见的分类。
我自己平常也很喜欢 Pokemon 黄版的 Save Corruption,
自己打一轮通常不用五分钟的时间,很适合当小游戏调剂身心。
https://youtu.be/VlmoEpNNiVI
(3) 手动输入了一整个新游戏的 ACE TAS
同样是
SethBling,
同样在实机超任上,
同样是
Super Mario World,
2016 年他花了一个小时用人力输入了
由
p4plus2 撰写的
Flappy Bird 程式码并执行他。
https://youtu.be/hB6eY73sLV0
这就是很大的工程了,
能够不依赖 TAS 就做到这麽复杂的 code 真的非常非常不容易。
(4) 推卡车抓梦幻 @ AGDQ2016
AGDQ2016 有一段节目 "
Pokemon Glitch Showcase",
表演很多 Pokemon 第一世代游戏中的各种游戏漏洞花式表演,
其中我觉得最震惊世界的一段:
https://youtu.be/mCoQm8bIyyw?t=24m
他利用存档转向之後读档冲浪穿过 S.S. Anne 号游艇的剪票员,
然後走到了传说中的卡车旁边。
这卡车非常有名,
我想不少人小时候大概听过谣传,
「
听说用劲力推这个卡车就会跳出梦幻」。
於是,跑者
Shenanagans 就这麽说了,
「我想我在这边可以澄清一个谣言,
我知道很多人说在
对着卡车使用劲力可以获得梦幻,
但是这并不是真的,(手上一边按劲力),
我可以现场示范一下这并不是...真的...What??」
(
画面上跑出一只梦幻,对话框"Mew!",全场欢声雷动
)
这在节目上没有解释是怎麽做到,
显然也没有时间特别详细解释,
但现场、聊天室还有当时的 Reddit 都快暴动了。
毕竟推卡车已经有无数人亲手试验过了,
那应该只是个谣言,
因此许多人怀疑这是改造的 ROM。
跑者後来在推特上解释,
这并不是一个改造 ROM,而是 ACE。
当然,节目上其实没有太多时间可以让跑者操作ACE,
所以这个ACE其实是
在「游戏存档」中预先安排好所有需要的程式码,
让跑者打开游戏就自动启动的。
比较详细的原理讨论可以参考我的另外两篇文章:
#1R5j0WyX (PokeMon) [ptt.cc] [讨论] 梦幻卡车@AGDQ2016 (上)
#1R5j5WKM (PokeMon) [ptt.cc] [讨论] 梦幻卡车@AGDQ2016 (下)
(5) 用超任玩 N64 / 传送门 / Skype @ AGDQ2017
AGDQ2017 的
TASbot - 对,又是 TASbot。
这次他们选择的游戏是
超任上的
萨尔达传说。
https://youtu.be/7CgXvIuZR40?t=1400
前几分钟看起来还像是在玩游戏,
但影片27分5秒左右画面淡出,
几秒後回来的是 N64 上的
Super Mario 64,
竟然是比他
高一阶的主机上的游戏,
而且还花了五分钟跑了一次 Speedrun;
然後马上接着的是另一次的
传送门 Speedrun,
然後接上来的是──他们现场打了一通
Skype。
好,看到这里大概能够想像,
上面这些非常非常明显的超出了超任这台主机的性能;
所以实际上这很明显不是以超任为主来执行的内容。
在这个 ACE 中,他们实际上作的是,
「把画面资讯通过八只手把传给超任,
然後
把超任当作一个萤幕」。
超任实际执行的程式码,
其实只有处理「
把画面显示出来」的工作。
------
╭───────────────╮
│ 所以 ACE 到底是怎麽发生的? │
╰───────────────╯
TASvideo.org 有一篇对於 ACE 的介绍,
对ACE的原理描述大概是这样的:
http://tasvideos.org/ArbitraryCodeExecutionHowTo.html
每个游戏系统都会有一格记忆体去纪录「
现在要执行的程式码」;
这是理所当然的,不然游戏也不知道自己现在执行到哪里了。
通常游戏的程式码会存在游戏卡匣/光碟/磁片这些唯读装置中,
在正常游玩下,这些部分通常是没办法被更改的。
然而,如果我们能够去写入
「现在要跑哪一段程式码」的那一格记忆体,
把它指向某个我们能够比较
自由操作的记忆体空间──
例如 Pokemon,他有比较大的
背包/携带道具的系统,
因此玩家可以透过更换队伍顺序/物品顺序的方式,
在那一段记忆体中
安排好「要执行的程式码」,
然後让游戏去执行他。
然而,TAS 常常更倾向,
把「要执行的程式码」指向「
按键输入」的记忆体位址。
只要能够办到这件事,程式码多长都不怕──
用所有手把上的所有按钮打进去就是了。
当然有时候这件事情很难一步到位,
所以你可能会在一些 ACE 的 TAS的投稿纪录中,
可以看到作者 Comment 的栏位中写着,
他们做了不同阶段的记忆体调整,
一开始先用比较容易达成的方式,
然後再写一小段程式码让游戏去读取手把输入,
甚至用更高频率读取。
好,我知道上面这些句子仍然有些抽象,
可能不太容易看懂这怎麽连到实际运作方式,
但实际的运作原理真的是很冗长而困难,
我觉得不太适合放在这样一篇介绍性的文章里面。
真的有兴趣的话,
可以参考我之前写来介绍 AGDQ2016 的梦幻卡车的文章:
#1R5j5WKM (PokeMon) [ptt.cc] [讨论] 梦幻卡车@AGDQ2016 (下)
------
╭───╮
│ 预告 │
╰───╯
- 经典的 ACE 里程碑 - 2017 年的
Pokemon 黄版
- 後记──
如果 TAS 不再玩游戏
------
╭────────────╮
│ 给按End的人的重点整理 │
╰────────────╯
(1) ACE 是利用游戏的漏洞,在记忆体中安排程式码并执行。
(2) ACE TAS 可以做到很多很多事情,从2012年开始越来越匪夷所思。
(3) 上面的几个 ACE 影片都很精采,特别是 TASbot 相关的那些。
AGDQ2014 ACE红起来的瞬间
https://youtu.be/Uep1H_NvZS0?t=31m48s
AGDQ2016 推卡车抓梦幻
https://youtu.be/mCoQm8bIyyw?t=24m
AGDQ2017 用超任打N64/传送门/Skype
https://youtu.be/7CgXvIuZR40?t=1400
--
███◣ ◢██◣ ◢██◣ █ ◢█ ◣ ◢ ◢██◣ ◣ █
█ ██ █ ██ █ ██ █◢█◤ █◣◢█ █ ██ █◣ █
█ ██ █ ██ █ ██◤ ████ █ ██ ██◣█ @ ptt.cc
███◤ █ ██ █ ██◣ █◥◤█ ████ ████
█◥█◣ █ ██ █ ██ █◥█◣ █ █ █ ██ █◥██ 鸦片(Append)
█ ◥█ ◥██◤ ◥██◤ █ ◥█ █ █ █ ██ █ ◥█twitch.tv/append
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.135.48.54 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Emulator/M.1599023597.A.03A.html
1F:推 srwcc: 推 09/02 13:24
2F:推 jazon: 先推一个 这边的概念是如果有在写程式的版友才比较容易看懂 09/02 15:05
3F:推 napdh: 好文推荐 09/02 15:20
4F:推 Jay915: 推 09/02 20:52
5F:推 darknote: 红白机时期记得有几个游戏有搞过 09/02 22:07
6F:推 superrockman: 不会写程式 有看没有懂XD 09/03 02:08
7F:推 icf10076328: 太厉害了 09/03 09:58
8F:推 kkssffaa: 这个太屌了,不管是精神还是技术,都值得敬佩 09/05 08:45
9F:推 bgworld: 好酷,对游戏很有爱 09/06 18:15
10F:推 AmosYang: 推 09/09 21:17
11F:推 longlongint: 利用漏洞修改记忆体内容,把二进位程式输入到记忆体 10/23 13:16
12F:→ longlongint: 原理简单实际上很难弄 10/23 13:16