# 接續上一篇。開始之前再次說一下。這東西我並沒有完全看懂──
# 這篇會比上一篇難很多。
# 我沒有實作過。我甚至沒有玩過四色版。
# 事實上我也是這兩天才爬文嘗試看懂的。
# 我覺得必要的拼圖還缺了一塊。希望有看得懂的人可以補上。
噓 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