志願者完成了《塞爾達傳說:時之笛》的反編譯 C語言代碼可讀
通過將近兩年的努力,一個由志願者組成的團隊,終於完成了對《塞爾達傳說:時之笛》的反編譯任務。 更確切地說,他們將可執行 ROM 檔轉換成了人類可讀(且可編輯)的 C 語言代碼,為後續的 PC 移植和各種 MOD 奠定了基礎。
上周日,ZRET 逆向工程團隊成員 Kenix 在該專案的 Discord 伺服器上宣佈:
在數十人的説明下,我們最終完成了這個專案,並取得了驚人的成就。 我們一度認為可能永遠無法完整每項功能匹配,因而這項激動人心的壯舉還是相當讓人難以置信的。
在 100% 完成開源任務之前,最終的反編譯功能仍需與 ZRET 的 GitHub 儲存庫合併。
直到提交並審核通過,團隊才得以通過編譯器來運行數萬行 C 代碼(以及來自合法卡帶的圖形和聲音資源),並最終生成 1:1 的原版《時之笛》ROM 副本。
完整的反編譯過程,持續了至少 21 個月。 雖然自動化軟體工具有一定用處,但想要將代碼反編譯成人類可讀的 C 語言,還是需要人工解析 15000 多個函數中的每一個。
在弄清楚每個部分的用意的同時,ZRET 團隊還需要清理代碼,以消除任何混淆、或邏輯過程中引入的bug 。
回顧 2019 年完成的類似項目,最終讓廣大玩家體驗到了多個高解析度的 PC 移植體驗。 然而 ZRET 團隊成員 Rozlette 在去年接受 ARSTechnica 採訪時透露:
從 C 代碼到Windows PC 移植的構建過程,並沒有想像中那麼容易。 畢竟專案中有許多代碼和 N64 硬體的使用有關,比如 N64 的渲染管道,就與現代 PC 平臺上的 OpenGL 大不相同。
在 ZRET 專案的推進過程中,Kenix 表示相關移植工作超出了最初預想的範圍。 即便如此,團隊還是頗有興趣地研究了相關代碼,以深入瞭解有關遊戲內部運作和創作的細節。
此外反編譯代碼能夠更加輕鬆地創建新的遊戲模式 / 隨機方案,從而進一步拓展遊戲的可玩性與觀賞性。
對於為何要投身於這個專案,Rozlette 曾於去年坦言,這一切都是出於對兒時遊戲的熱愛。
這對我來說就像一個大謎題,且其中每個函數都是一個片段。 當我處理一個未知的代碼函數,然後意識到它在遊戲中的作用時,就會讓自己感受到相當大的鼓勵。
Kenix 在 Discord 上指出:雖然反編譯工作可能已經達到了 100%,但團隊後續仍有許多工作要做。
我們一直致力於反編譯遊戲的《Master Quest Debug》版本,然而《時之笛》其實還有十多個其它版本,我們也計劃為它們提供反編譯和相關支援。
此外反編譯代碼需要額外的文檔,重組、並對變數重新命名,以使他人更易使用底層代碼。
最後,由 ZRET 公開的追蹤器頁面可知,Majora’s Mask 和 Minish Cap 的相關反編譯專案也仍在推進過程中(大約分別完成了 24% / 48%)。