[討論] 夢幻卡車@AGDQ2016 (下)

作者: Append (<( ̄︶ ̄)>)   2018-06-06 02:07:17
# 接續上一篇。開始之前再次說一下。這東西我並沒有完全看懂──
# 這篇會比上一篇難很多。
# 我沒有實作過。我甚至沒有玩過四色版。
# 事實上我也是這兩天才爬文嘗試看懂的。
# 我覺得必要的拼圖還缺了一塊。希望有看得懂的人可以補上。
噓 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
作者: zxasqw0246 (yoyo)   2018-06-06 02:24:00
基本上還是算改造rom阿 只是原本有bug可以用gb輸入而已從輸入自製程式碼就不算正常遊戲內容了
作者: Append (<( ̄︶ ̄)>)   2018-06-06 02:25:00
Read only memory(ROM) 的部分沒有任何修改,原裝卡帶。
作者: xkiller1900 (cerberus)   2018-06-06 05:51:00
這感覺很像創世神在玩的東西了
作者: hirokifuyu (宏樹ふゆ)   2018-06-06 07:04:00
推鴉片
作者: f6bfb5 (f6bfb5)   2018-06-06 08:01:00
「改造ROM」就是事前直接透過工具、Patch之類的方法強迫修改,也不需要這麼多麻煩的手段了,ACE最大的特點是他是利用遊戲或主機設計上的缺失或者極限來達成,因此如同文內幾支影片,是可以直接在設計過人類操作上不可能達成的輸入源以及原始的主機卡帶來達成這些效果補一下前面的受詞,強迫修改「遊戲主體」。
作者: Aijiang (罵玩少女)   2018-06-06 08:08:00
推鴉片
作者: horseorange (橘小馬)   2018-06-06 08:25:00
作者: nickmath (漢堡神偷)   2018-06-06 08:28:00
其實另一個更有名且四色版皆可用的夢幻法也是ACE的應用而使用新買的卡帶或是從eShop上買下來都能執行這樣還能說ACE是改造ROM嗎
作者: w2776803 (台南假面騎士HUNGER)   2018-06-06 08:38:00
看不懂還是給推
作者: nisioisin (nemurubaka)   2018-06-06 09:04:00
不是改造ROM應該是在玩的時候透過漏洞修改RAM?
作者: WiLLSTW (WiLLS)   2018-06-06 09:21:00
RMX4黑傑洛攻擊力比較高一點點!
作者: gn00386614 (EXSA)   2018-06-06 09:35:00
不是官方要提供的東西就是假的啊
作者: a23962787 (不擲骰子的貓)   2018-06-06 09:50:00
媽 我在鴉片的文章裡
作者: rightmask (假面)   2018-06-06 09:58:00
傑洛沒差
作者: riverT (河流踢)   2018-06-06 10:06:00
兩篇都拜讀完了 謝謝回覆
作者: Append (<( ̄︶ ̄)>)   2018-06-06 10:18:00
是的,透過漏洞來修改RAM的內容,然後騙遊戲執行這個位置
作者: f6bfb5 (f6bfb5)   2018-06-06 10:38:00
「是假的」「不正常遊戲內容」其實就看怎麼切入,從原始遊遊戲設計邏輯來說這的確是始料未及的狀況,也是BUG/漏洞的延伸運用,但魅力也在於簡單如大家都熟知的四色道具99和Level100,到推卡車人們多年來的都市傳說,理論都有辦法在「原始的主機和遊戲上」(透過人類辦不到的輸入)達成,也算是遊戲和主機的延伸價值創造。
作者: zxasqw0246 (yoyo)   2018-06-06 11:39:00
他只是用遊戲內漏洞來輸入程式碼阿那你會說彩虹小馬是遊戲內容嗎?
作者: f6bfb5 (f6bfb5)   2018-06-06 11:46:00
他是有辦法透過遊戲內的操作產生出來的遊戲內容沒錯啊XD另外一個個人覺得很精彩但不是PM的ACE就是洛克人的呼叫Ending,而精彩之處在有玩家實際RTA重現了http://nico.ms/sm23825129
作者: w2776803 (台南假面騎士HUNGER)   2018-06-06 14:12:00
0:00破關也太神了
作者: alanhwung (Alan)   2018-06-06 14:33:00
作者: olys (查無暱稱)   2018-06-06 14:47:00
推推
作者: ltflame (難民C)   2018-06-06 15:39:00
感謝分享! 請問理論上只要有辦法找到漏洞 任何遊戲都可以放ACE嗎 例如用究極日月上PTT 還是只限古早遊戲呢?
作者: ricksimon (Nintendo才是王道阿!)   2018-06-06 17:24:00
"結局什麼的是自己創造的!"
作者: s32244153 (Hir0)   2018-06-06 17:37:00
系統:你的系統已經損壞。
作者: whatai (多多)   2018-06-06 17:38:00
早期遊戲比較可以利用操控記憶體來達成目的像紅綠版可以利用不斷選擇某個道具 之後去戰鬥 打贏之後可以直接跳100等 (但是遊戲會變得怪怪的 會有很多亂碼
作者: PrettyFace (Σヽ(゚Д ゚; )ノ)   2018-06-06 20:59:00
謝謝鴉片大的分享!
作者: MUSTANG33 (便當機體)   2018-06-06 21:16:00
0:00那個在一樓房間 道具欄打開按一按就過了
作者: chinhsi (有些事是要看天份的)   2018-06-07 01:49:00
自己噓自己XD
作者: Medness (Medness)   2018-06-07 12:27:00
突然變成哲學題了
作者: naya7415963 (稻草魚)   2018-06-07 17:03:00
推後記,世界大的超乎我們想像這麼好的文章怎麼只有20+56p幣 @@
作者: Append (<( ̄︶ ̄)>)   2018-06-07 18:12:00
因為我不能忍受在PTT的介面上編輯這麼長的文章,所以我是用PHJCI寫好排版上色才複製貼上...
作者: ernie1871 (鑽頭)   2018-06-08 02:46:00
跪了這東西好猛 是因為研究這個 今天才開台玩黃版嗎
作者: zxc654033 (啦啦啦)   2018-06-13 00:54:00
推推

Links booklink

Contact Us: admin [ a t ] ucptt.com