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