作者Append (鸦片)
看板PokeMon
标题[讨论] 梦幻卡车@AGDQ2016 (下)
时间Wed Jun 6 02:07:17 2018
# 接续上一篇。开始之前再次说一下。这东西我并没有完全看懂──
# 这篇会比上一篇难很多。
# 我没有实作过。我甚至没有玩过四色版。
# 事实上我也是这两天才爬文尝试看懂的。
# 我觉得必要的拼图还缺了一块。希望有看得懂的人可以补上。
嘘 Append: (メ^_^) 你这其实是一篇幻想文?
.............. > (;・∀・)
嘘 Append: (# ゚Д゚) 所以你这是当你个版在贴读书心得罗?
.............. > (; ・`д・′)
4!> \(°▽ °*)/
┌──────┐
│ ACE原理-8F │
└──────┘
一样,首先附上原本推文中的参考资料
推 a23962787: https://wiki.52poke.com/zh-hant/任意代码注入(漏洞)
更详细的介绍我推荐GlitchCity
https://tinyurl.com/yactg6es
另外会需要记忆体位址对应
https://tinyurl.com/y6vpyjan
这里有提到一个奇妙的道具
"8F"。
在四色版触发ACE的众多方法之中,
透过道具"8F"触发ACE应该是最容易理解与自己尝试的,
因此受到许多ACE玩家的推荐。
# 请注意这次推卡车的部分不是用这方法
# 这边介绍8F是为了更方便的描述并理解ACE的实作原理
8F是个正常游戏过程中通常不会取得的道具,需要透过其他漏洞取得;
他的功能是「执行$D163开始的代码」,
或者更直白的说──「
把记忆体中$D163位置之後的资料当成程式码开始执行」;
那麽从$D163开始,游戏原本在这里存了什麽资料呢?
│ ... │ │
├───┼─────────────────────────┤
│$D163 │ 队伍里的PM数量 │
├───┼─────────────────────────┤
│$D164 │ 队伍中每只PM的种类。$D164是第一只PM的种类 │
│ ... │ .... │
│$D169 │ $D169是第六只PM的种类 │
├───┼─────────────────────────┤
│$D16A │ 队伍清单结束,预设填入FF。 │
├───┼─────────────────────────┤
│$D16B │ 第一只PM的数据。$D16B这格是种类,会和$D164一样 │
│ ... │ $D16C-$D16D两格会装这只PM的HP │
│$D196 │ .... │
├───┼─────────────────────────┤
│ ... │ │
也就是说,只要准确的安排这些PM跟属性,就能产生正确顺序的代码,
然後在使用道具
"8F"的时候执行他。
欸...虽然听起来很有道理,但是PM属性能够控制的部分满少的,
所以这边流行的实作都是在这里写一段程式码
『去执行$D322开始的程式码』
这个组合可以用以下的PM队伍(刚好五只,照以下顺序)办到:
波波(HP233)、派拉斯特、大岩蛇、玛瑙水母、袋兽
这样的队伍是现在最流行的"8F Bootstrap Setup",
先准备好这组,然後使用"8F",游戏就会把$D322开始的资料当作程式码开始执行。
那$D322是什麽位置呢?
$D322是道具栏中第三个道具的种类。他之後则是数量。
这之後则是第四、第五、...第二十个道具的数量。依序。
从第三个道具到第二十个道具,18个道具总共有36byte的空间可以使用;
除此之外,
"道具下溢错误"(item underflow glitch)能够让背包道具数变成255。
中文说明 https://tinyurl.com/ybuq2l6j
英文说明 https://tinyurl.com/yc5evjq8
顺带一提,目前流行的道具下溢错误的setup是由 Luckytyphlosion 提出的,
而 Luckytyphlosion 同时也是这次推卡车ACE的设计者。
也就是说,准备好队伍里五只固定顺序的PM,准备好一个"8F",
剩下的问题就是准备第三格开始的道具列表。
道具列表的准备需要更多的漏洞,这边列出一些第一世代的漏洞做为参考。
https://tinyurl.com/yaonr77h
也就是说,想好需要的程式码,写成组合语言,翻译成机械代码,
然後反过来推算这应该对应到什麽样的道具列表,
然後把这个道具列表用其他的漏洞凑出来,排好顺序和数量,
在需要的地方使用"8F",就能够骗游戏去执行这些程式码。
如果想要自己实作一次看看,这边推荐 TheZZAZZGlitch 频道的许多影片:
https://youtu.be/Sw0h7ImFsAs
https://youtu.be/98_azamLeh4
https://youtu.be/D3EvpRHL_vk
单纯想从0开始操作看看8F的话,这边有个给初学者的教学:
https://youtu.be/22EYJ0QXPBQ
不过以上我通通都没有自己尝试过。我其实没有玩过四色版。
(坦白说我不是很推荐去自己尝试啦。每个看起来都要很久很久...)
┌──────┐
│地图脚本指标│
└──────┘
8F法操作上比较直接,你需要的时候就使用道具"8F"去触发ACE。
但是...如果我希望他不断地执行某段程式码,应该要怎麽办到呢?
一直按8F? \(°▽°* )
欸...这也不失为一个有效的办法...
不过邪恶的TAS玩家们当然不是这样做的。
这里先回到GDQ影片的表演者回应。
关於GDQ推卡车的细节:
https://pastebin.com/UqRzNKxm
感谢 Luckytyphlosion 提出的构想,并且整理了专文回应。
上面那篇pastebin里面,Luckytyphlosion 整理了许多必要的资讯,
还有他如何构想并设计出这样的程式码;
对ASM版本的程式码本身有兴趣的可以参考连结
https://pastebin.com/6VWNfEKG
这之中有提到另一个核心概念 "Map Script Pointer"(地图脚本指标):
"游戏每两frame都会执行一次这格指向位址的程式码,位置存在 $D36E-$D36F。"
欸这很方便阿,透过这个机制可以不断执行一些条件检查,不用每次都在那边8F。
所以除了要跑什麽程式码以外,同时产生了另一个问题:
要怎麽更改这格记忆体,让他指向我们能够存程式码的地方?
这个部分有提到的介绍就很少了──这比较困难一些。
GlitchCity并没有非常详细的说明,但是他有提到
https://tinyurl.com/y9nksucp
"透过修改第41个道具种类和数量可以触发这个漏洞"
(可以参考一下上面的8F法,有提到$D322是第三格道具,与$D36E位置相差不远。)
除此之外,我稍微Google了一下关於Map script pointer的部分,找到这个影片:
https://youtu.be/2_NO8Dyubu4 (请注意画面会强烈闪烁,请避免久盯)
他设计了一些物品顺序,然後在2:00左右离开选单;
离开选单之後Map script pointer自动触发,
让主角不断的旋转跳,同时改变画面的颜色构成。
3:15左右他进行存档,然後重开游戏,读档──效果竟然有保留下来!
这个方法会把当前的Map script pointer也存起来,读取後会继续自动执行。
但是当他往下走离开这个房间,效果就消失了。
很明显,这是因为换一张地图的时候,游戏写入了Map script pointer,
因此原本的自订脚本就不会被执行了。
欸这看起来很棒啊,刚好满足了制作存档的需求。
这样就能先制作好ACE然後触发他,存档再拿去GDQ现场开机了。
┌──────┐
│回到梦幻卡车│
└──────┘
嗯,看起来不错,如果是这种情况,如果能走到卡车旁边,
准备好梦幻卡车的程式码,然後把Map script pointer指向他,存档──
下次读档的时候就可以推卡车给朋友看了! <( ̄︶ ̄)>
事实上这就是 Luckytyphlosion 最一开始提出来的构想。
2014年他在 Glitch City 贴了这段code
https://tinyurl.com/y8b65op4
同时有一点小小的讨论,不过他後来忙了其他东西就搁置了这个构想。
一年後他想到,
"如果能够在比较大的场合,像是AGDQ,实作出这个,听起来好像很酷!"
於是他们正式着手这个计画。
跑者 Shenanagans 建议同时介绍"如何回到圣特安努号",
然後在这个过程才去推卡车,然後发现底下冒出一只梦幻。
我读到这里的时候,觉得这样就会有几个考量:
(1) 这大概不能使用8F触发。
如果要为了节目效果,装成不小心发现底下有只梦幻,
就没办法打开选单按一下8F。
(2) 如果透过 Map script pointer 触发ACE,
能够事先准备好这样的存档,然後让跑者拿到节目上,
就能够避开"在观众面前手动触发"的部分;
以节目效果来说这点不错──
但是 Map script pointer换画面会被游戏自己的资料盖过去,怎麽办?
Luckytyphlosion说。这确实困难了一点,但是并不太难。
每张地图有自己的 "Tileset" (图像素材的集合),
其中第7个位元跟图像无关──他是用来判断游戏有没有需要重新读取地图物件。
通过这个机制,在跑者冲浪存档越过剪票员後,往下切换地图时,
就能够骗游戏不读取这张地图的物件,也因此不会把程式码盖掉──
欸...不读取物件的话不就没有地图了吗? /( ̄口 ̄;)\
所以,Luckytyphlosion 设计的这套程式码里面,
有判断当前的地图ID,自己去读取地图需要的物件。 (...这真的是很大的工程...)
最後就是实际上把梦幻卡车的脚本写下来啦。
检查有没有在使用劲力,是不是站在卡车旁边,有没有面对卡车,
把角色图像改成移动装作那是在推,实际上移动卡车图像的座标,
放出推石头的音效,弄出推石头的沙尘动画,放一只梦幻在地图上,...
然後准备好一个自订文字的对话框,跟梦幻对话的时候放出来,
然後call进入战斗,设定梦幻为5等,...
然後在战斗结束後清掉这些图像,把Map script pointer改回原本游戏设定的值。
以上全部都用ACE的方式做出来。而且还有更多细节在上面没有全部提到。
确实是非常非常巨大的工程。
┌──────┐
│ 总 结 │
└──────┘
总结一下──这边引用 Reddit讨论里面的总结,
https://tinyurl.com/y7zp9gjl
(1) AGDQ的表演确实是使用游戏主机 (实际上是Game Cube + Game Boy Player)
(2) 游戏卡带读取的存档是 Luckytyphlosion 在模拟器中制作的,
(3) Luckytyphlosion 透过 stump 提供的 flasher 把存档写进卡带里面。
(4) 这中间并没有运作 Gameshark 或是任何类似的金手指工具。
(5) 使用模拟器制作存档只是因为需要动用的工程太大,用模拟器比较容易控制。
这边附上一些我目前没有弄懂的地方:
(1) 这个程式码很长,ASM有三百多行。不知道实作的时候会存在哪里。
2014年的讨论有提到这点,当初有人提议要另外写输入 (像是那些手把输入),
那时候结论是如果存档在卡车旁边应该不会太长;
但是现在这个版本真的复杂非常多,很难想像道具栏竟然塞的下。
嗯...不过组语看起来真的很省byte数,说不定真的可以?
(2) Luckytyphlosion 目前没有提供这个存档。他有另外写一段
Unfortunately, I didn't create a setup to store this code in memory.
stump (twitch.tv/stumpdotio) had a save flasher which he used in order
to flash the save which had the code stored on using an emulator.
If I have the motivation, I may create a setup so you could fool
your friends (Kappa), but for now there isn't a setup.
嗯...这真的很可惜,如果能放出这个存档应该满多人会想拿来玩玩看的。
目前还很难想像这样的SETUP实际上多难办到。
(3) 回到原PO提出来的讨论。
"推卡车到底是真是假?"
嗯,Short Answer:
推卡车是不会有梦幻的。那是谣言。 END.
"那这个影片是造假吗?"
......我很认真的想了一下这个问题。
Arbitary Code Execution 应该要看成是在造假吗?
我觉得这真的是个很难回答的问题啊。
我觉得ACE确实是"刻意的设法从游戏内的手段,塑造出原本不存在的东西";
如果从原作设计的手段来看,这应该可以算是在造假吧。而且是在追求造假。
是在追求"我们有一些真实的手段,这能够虚构出多少超乎想像的结果"。
而我觉得这个对虚构的追求非常的艺术。
至於这到底多真实──
很可惜我到现在还是没有办法看到这个SETUP的全貌,
无法判断这到底是不是真的能够全部用实机可行的手段办到;
说真的就算他把整个SETUP的过程重新整理乾净放出来,
我觉得总长度可能也不是我真的能全部看完的。(真的好长阿。...)
同时,ACE的手段实在太多,我也是挑比较容易理解的几个方式试着介绍;
如果真的有把SETUP的过程放出来,大概也会有我没办法两天看懂的方法。
哎,想学会的东西太多了,实在是很难都花时间去看懂阿,
要真的都去尝试一次就更难了。ACE这样的长度我实在很难去尝试。
但是我觉得这没什麽关系。
我还是很愿意去相信那些Setup是实机能够办到的,
或是即使现在这个版本并没有被实机作出来──大概也能找到办法办到。
反过来想,你看人家连Skype都可以打出来了,弄个梦幻真的很难吗...
┌──────┐
│ 後 记 │
└──────┘
(1) 2017年的Pokemon 黄版 TAS "Arbitary Code Execution"
https://youtu.be/Vjm8P8utT5g
是一个我觉得非常巧妙的利用ACE挑战Gameboy Color硬体极限的TAS
如果要挑一片TAS,来介绍现在能做到的事情──那大概就是这片了。
非常精采。不过如果对ACE的过程有兴趣,这东西的作者Comment也很精彩
http://tasvideos.org/5384S.html
里面为了更高速的即时写入程式码,自己写了三个新的触发阶段;
另外用按键即时输入18KHz的Still Alive,
然後还放了几秒的海绵宝宝。巧妙至极。
TASbot即时的表演效果更好,但是我觉得以静态作品来说,这片更是精彩。
(2) 其实我觉得 RiverT 提出的问题并没有这麽应该被嘘。
我觉得GDQ这次的表演其实用了非常深刻的技术;
而我觉得会选择相信他们不会在现场造假,这其实满有道理的──
因为最懂这些游戏的人都正在看着,在现场或是在线上。
在这个场合恶意造假被揪出来,大概一辈子都别想在speedrun社群生存了。
相对的,自己尝试来否定一个谣言其实很困难,比证实他难很多;
这需要同时证明"自己的操作是完备的,已经尝试过所有可能性了。"
这很难啊。要怎麽证明自己的操作已经完备了呢?
更何况,如果是从理解ACE的原理的角度看起来,
在ACE存在的情况下,什麽叫做所有可能性...这真的很难说阿。
当然我理解谣言之所以讨厌,辟谣到觉得很麻烦的时候,谣言真的很讨厌。
如果谁跟我说"RMX4黑杰洛攻击力比较高一点点"我也会翻脸 ← 一秒惹火鸦片
但是这个世界真的很难想像他究竟能大到什麽程度。哎。超难想像。
所以如果可能的话,我还是希望大家都可以开心的玩游戏,讨论游戏就好了。
毕竟游戏本来就是为了要让玩家开心,才会被设计出来的嘛。
┌───────┐
│ 给按End的人 │
└───────┘
(1) 这是一篇幻想文。我其实没有操作过,因为操作超长的。
(2) 8F法是ACE的众多方法中比较容易理解的一种。但是还是很难。
(3) GDQ这次的表演采用的方式是更改地图脚本指标。
(4) 但是如果按End看到这几行应该没办法看懂。
(5) 所以我觉得大家还是开心玩游戏吧。
(6) 上面两页有另一个精彩的黄版TAS,真的,看嘛看嘛,看嘛看嘛。
以上。
鸦片 (Append) 2018.06.06
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.162.64.192
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PokeMon/M.1528222048.A.516.html
1F:推 zxasqw0246: 基本上还是算改造rom阿 只是原本有bug可以用gb输入而 06/06 02:24
2F:→ zxasqw0246: 已 06/06 02:24
3F:→ zxasqw0246: 从输入自制程式码就不算正常游戏内容了 06/06 02:24
4F:→ Append: Read only memory(ROM) 的部分没有任何修改,原装卡带。 06/06 02:25
5F:推 xkiller1900: 这感觉很像创世神在玩的东西了 06/06 05:51
6F:推 hirokifuyu: 推鸦片 06/06 07:04
7F:推 f6bfb5: 「改造ROM」就是事前直接透过工具、Patch之类的方法强迫修 06/06 08:01
8F:→ f6bfb5: 改,也不需要这麽多麻烦的手段了,ACE最大的特点是他是利 06/06 08:02
9F:→ f6bfb5: 用游戏或主机设计上的缺失或者极限来达成,因此如同文内几 06/06 08:02
10F:→ f6bfb5: 支影片,是可以直接在设计过人类操作上不可能达成的输入源 06/06 08:02
11F:→ f6bfb5: 以及原始的主机卡带来达成这些效果 06/06 08:03
12F:推 f6bfb5: 补一下前面的受词,强迫修改「游戏主体」。 06/06 08:06
13F:推 Aijiang: 推鸦片 06/06 08:08
14F:推 horseorange: 推 06/06 08:25
15F:推 nickmath: 其实另一个更有名且四色版皆可用的梦幻法也是ACE的应用 06/06 08:28
16F:→ nickmath: 而使用新买的卡带或是从eShop上买下来都能执行 06/06 08:30
17F:→ nickmath: 这样还能说ACE是改造ROM吗 06/06 08:30
18F:推 w2776803: 看不懂还是给推 06/06 08:38
19F:推 nisioisin: 不是改造ROM应该是在玩的时候透过漏洞修改RAM? 06/06 09:04
20F:推 WiLLSTW: RMX4黑杰洛攻击力比较高一点点! 06/06 09:21
(/‵Д′)/~ ╧╧
21F:→ gn00386614: 不是官方要提供的东西就是假的啊 06/06 09:35
22F:推 a23962787: 妈 我在鸦片的文章里 06/06 09:50
23F:→ rightmask: 杰洛没差 06/06 09:58
24F:推 riverT: 两篇都拜读完了 谢谢回覆 06/06 10:06
25F:→ Append: 是的,透过漏洞来修改RAM的内容,然後骗游戏执行这个位置 06/06 10:18
26F:推 f6bfb5: 「是假的」「不正常游戏内容」其实就看怎麽切入,从原始游 06/06 10:38
27F:→ f6bfb5: 游戏设计逻辑来说这的确是始料未及的状况,也是BUG/漏洞 06/06 10:38
28F:→ f6bfb5: 的延伸运用,但魅力也在於简单如大家都熟知的四色道具99和 06/06 10:39
29F:→ f6bfb5: Level100,到推卡车人们多年来的都市传说,理论都有办法在 06/06 10:39
30F:→ f6bfb5: 「原始的主机和游戏上」(透过人类办不到的输入)达成,也 06/06 10:39
31F:→ f6bfb5: 算是游戏和主机的延伸价值创造。 06/06 10:39
32F:推 zxasqw0246: 他只是用游戏内漏洞来输入程式码阿 06/06 11:39
33F:→ zxasqw0246: 那你会说彩虹小马是游戏内容吗? 06/06 11:39
34F:推 f6bfb5: 他是有办法透过游戏内的操作产生出来的游戏内容没错啊XD 06/06 11:46
35F:→ f6bfb5: 另外一个个人觉得很精彩但不是PM的ACE就是洛克人的呼叫End 06/06 11:53
36F:→ f6bfb5: ing,而精彩之处在有玩家实际RTA重现了 06/06 11:54
「这是游戏内容吗?」
欸,这很难回答,不过我觉得可以比较准确地回答一个修正过的问题。
「这是正常游戏内容吗?」
当然不是阿。所有的bug本来就都不是正常游戏内容。
如果是正常游戏内容的话,这些就不会叫bug了,
会说是故意设计的,或可能被觉得设计不良。
会被叫bug的都是那些摆明了不是正常游戏内容的,
像是中断训练师战斗抓梦幻之类的,
"游戏公司大概不太想这样设计"的,
才有办法判断出来那是个bug。
嗯好,那现在再来想一下,「这是游戏内容吗?」
...这很难回答阿。
已经被作进来的bug我觉得应该要被看成是游戏的一部分。
换个角度想好了,其实有满多东西都可以这样切入来想他是不是游戏内容的。
我觉得选择队伍是游戏内容,而且大部分的人都会去选择自己想要的队伍;
那麽把队伍排成「波波(HP233)、派拉斯特、大岩蛇、玛瑙水母、袋兽」,
这虽然很刻意,但是大概没什麽办法说他不是游戏内容──
从游戏内容的角度来看,这就是调整队伍嘛。
但是从"8F"这个道具的角度来看,这样的队伍本身就是一小段程式码阿。
「我可以选择这个队伍」和「我可以指定一小段程式码」是完全一样的操作,
那麽可以仔细想一下,
「这样的队伍选择」是游戏内容吗?
「指定一小段程式码」是游戏内容吗?
这个操作应该要指向不一样的答案吗?
这可能就不会有太好的答案。
Bug总是在预期之外,会产生预想外的结果,
而预想外的结果算不算是游戏内容,这大概很难有个准确地回答。
至於说彩虹小马算不算游戏内容──
我觉得「不算」这个直觉回答就是那片TAS的期待。
"我们现在能够用游戏内容构造出一些跟游戏毫无关系的事情"。
但是他完完全全是用游戏内容构造出来的阿,这样到底该不该算呢?
如果不算的话,这些构造出来的过程到底要怎麽算呢?
----
ACE的技术原本在TAS里面也是用来破关的,
一个大家可能更熟悉的例子是黄版的0:00破关,
开场按一按连房间都没出就进殿堂了。
...嗯,确实这不是正常游戏内容。但是进殿堂大概是游戏内容。
这个冲突感就不够明显。(好吧我知道还是满矛盾的)
於是後来就有了一系列根本没在玩游戏的ACE TAS。
※ 编辑: Append (1.162.64.192), 06/06/2018 12:47:13
38F:→ w2776803: 0:00破关也太神了 06/06 14:12
39F:推 alanhwung: 狂 06/06 14:33
40F:推 olys: 推推 06/06 14:47
41F:推 ltflame: 感谢分享! 请问理论上只要有办法找到漏洞 任何游戏都可 06/06 15:39
42F:→ ltflame: 以放ACE吗 例如用究极日月上PTT 还是只限古早游戏呢? 06/06 15:39
当然并不是任何漏洞都可以,也不限於真的很古早的游戏。
例如ORAS曾经可以。(!!!)
但是你可以想像如果是像3DS这种比较後期的机器,
能够控制系统就会直接产生改机的问题;
所以更深入的讨论会触犯版规,这里就必须跳过了。
不过这类型的东西如果有被发现,应该都会在很短时间内patch掉啦。
------
当然古老游戏和进代游戏在这些技术上,
难度也是不成比例的。
古老的游戏在记忆体和效能的运用上比较苛刻,
也因为这样更容易产生漏洞,更有机会能做出比较奇妙的事情。
※ 编辑: Append (1.162.64.192), 06/06/2018 16:18:36
※ 编辑: Append (1.162.64.192), 06/06/2018 16:22:35
43F:→ ricksimon: "结局什麽的是自己创造的!" 06/06 17:24
44F:→ s32244153: 系统:你的系统已经损坏。 06/06 17:37
45F:推 whatai: 早期游戏比较可以利用操控记忆体来达成目的 06/06 17:38
46F:→ whatai: 像红绿版可以利用不断选择某个道具 之後去战斗 打赢之後 06/06 17:39
47F:→ whatai: 可以直接跳100等 (但是游戏会变得怪怪的 会有很多乱码 06/06 17:39
48F:推 PrettyFace: 谢谢鸦片大的分享! 06/06 20:59
49F:推 MUSTANG33: 0:00那个在一楼房间 道具栏打开按一按就过了 06/06 21:16
50F:→ chinhsi: 自己嘘自己XD 06/07 01:49
51F:推 Medness: 突然变成哲学题了 06/07 12:27
52F:推 naya7415963: 推後记,世界大的超乎我们想像 06/07 17:03
53F:推 naya7415963: 这麽好的文章怎麽只有20+56p币 @@ 06/07 17:06
54F:→ Append: 因为我不能忍受在PTT的介面上编辑这麽长的文章, 06/07 18:12
55F:→ Append: 所以我是用PHJCI写好排版上色才复制贴上... 06/07 18:13
56F:推 ernie1871: 跪了这东西好猛 是因为研究这个 今天才开台玩黄版吗 06/08 02:46
57F:推 zxc654033: 推推 06/13 00:54