淺談Undertale修改—— 什么是GMS反編譯,什么是data.win
一、反編譯是什么
????什么是反編譯?代碼經(jīng)過(guò)編譯變成可執(zhí)行文件,反編譯是編譯的逆過(guò)程。簡(jiǎn)單來(lái)說(shuō),就像將食材制作成食物,而反編譯則能通過(guò)食物的最終形態(tài)得到食材的數(shù)量以及種類(lèi),甚至烹飪前的一切信息
????我們已知Undertale這款游戲是由Gamemaker這個(gè)游戲引擎制作的,游戲的不同版本也使用了不同的Gamemaker版本(以下簡(jiǎn)稱(chēng)gm),例如:demo版使用gm8,正式發(fā)布的第一個(gè)版本使用gamemaker studio 1.4(以下簡(jiǎn)稱(chēng)gms),switch版使用gamemaker studio 2(以下簡(jiǎn)稱(chēng)gms2)。不同版本的gm使用了不同構(gòu)成程序的方式,因此反編譯的方式也是不同的,以下將會(huì)粗略介紹
二、Gamemaker8反編譯
????gm8已經(jīng)是一個(gè)有13年歷史老游戲引擎,其簡(jiǎn)單的構(gòu)成方式以及編譯程序的原理,使得我們能夠反編譯程序一窺程序的工程全貌
????在gm8編譯程序得到的可執(zhí)行文件中,包括兩部分的數(shù)據(jù):一部分是游戲工程文件的完整儲(chǔ)存,包括一切游戲數(shù)據(jù)(代碼中的注釋也會(huì)被囊括在內(nèi));另一部分是一個(gè)能夠解析游戲數(shù)據(jù),執(zhí)行并解釋代碼的運(yùn)行器(Runner)
????利用GM8Decompiler可以將前一部分的數(shù)據(jù)轉(zhuǎn)化為gm8的標(biāo)準(zhǔn)工程文件.gmk

反編譯得到的工程和源工程理論上是等效的,包括注釋等都會(huì)得到保留

利用該程序,我們同樣可以得到undertale demo版的gmk文件
三、Gamemaker Studio 數(shù)據(jù)格式、編譯
????GMS是對(duì)老gm8的完全重置,其編譯原理與gm8沒(méi)什么共同點(diǎn)。下面將簡(jiǎn)要介紹gms的編譯過(guò)程、游戲程序運(yùn)行、data格式等(以普通編譯方式為例)。
????1.Data.win與Runner
????????gms編譯程序主要會(huì)得到兩個(gè)文件:
????????①游戲可運(yùn)行程序:一個(gè)根據(jù)Runtime(gms編譯套件)中的runner.exe,結(jié)合游戲工程設(shè)置等生成的一個(gè)被替換圖標(biāo)后的程序文件,利用它可以啟動(dòng)游戲。Runner是一個(gè)解析&運(yùn)行程序,它會(huì)解析data.win中的數(shù)據(jù)并運(yùn)行其中的代碼。這也是為什么ut的各種手機(jī)版存在的原因,這些手機(jī)端的作者(以安卓為例),用gms生成了一個(gè)適合ut運(yùn)行的.apk,之后把ut的data.win改個(gè)名扔進(jìn).apk文件內(nèi),再放進(jìn)音樂(lè)等,安裝到手機(jī)上即可運(yùn)行。gms在各個(gè)平臺(tái)生成的游戲文件本質(zhì)上都是runner配同樣的數(shù)據(jù)文件xxxx.win/droid/......的組合(html5是轉(zhuǎn)為js語(yǔ)言,原理是不同的)
????????②data.win,gms游戲的標(biāo)準(zhǔn)數(shù)據(jù)文件,包括所有的游戲邏輯部分以及非邏輯部分的數(shù)據(jù),理論上,只要你有了游戲的這個(gè)文件,就有了整個(gè)游戲,只需一個(gè)runner即可運(yùn)行。data的內(nèi)部結(jié)構(gòu)包括一些數(shù)據(jù)塊(Chunk)和標(biāo)記性數(shù)據(jù)。Chunk有LANG, EXTN, SOND, AGRP, SPRT, PATH, SCPT, FONT, OBJT, ROOM, FUNC, STRG, TXTR, VARI, CODE等
????2.bytecode
????????是一種執(zhí)行的中間碼,runner能夠讀取這些中間編碼并執(zhí)行,它是由工程中的Gamemaker Language(以下簡(jiǎn)稱(chēng)gml)轉(zhuǎn)化而來(lái),失去了縮進(jìn)等格式特征,注釋也會(huì)在轉(zhuǎn)化過(guò)程中被直接跳過(guò),因此我們無(wú)法根據(jù)bytecode完全反推原來(lái)的代碼形態(tài)。同時(shí),不同的gms版本有著不同的bytecode版本

????3.編譯
????? ? 第一步是保存游戲工程,隨后GMAssetCompiler會(huì)解析數(shù)據(jù),編譯游戲內(nèi)Asset。結(jié)束后,gms會(huì)將編譯結(jié)果,對(duì)應(yīng)到各個(gè)Chunk內(nèi),將Chunk寫(xiě)入data.win。編譯完成,生成可執(zhí)行程序,進(jìn)程結(jié)束。臨時(shí)運(yùn)行的游戲會(huì)在C:\Users\用戶(hù)名\AppData\Local文件夾內(nèi)儲(chǔ)存臨時(shí)數(shù)據(jù)(包括data等文件)
四、Gamemaker Studio?反編譯
????1. Altar.NET
????????很老的一個(gè)工具,有批量提取功能,也支持新版本的ut。太老了,不推薦使用
????????https://gitlab.com/PoroCYon/Altar.NET
????2.?UndertaleTools
????????同樣很老的工具,對(duì)字體的支持比較好,適合做游戲翻譯
????????https://github.com/fjay69/UndertaleTools
????3.?GMdsam
????????一個(gè)比較完善的反編譯工具,只支持老版本ut,能得到游戲的各種數(shù)據(jù),也提供比較準(zhǔn)確的bytecode反編譯功能
????4.UndertaleMod Tool
????????很好用的反編譯工具,目前是功能最強(qiáng)大的工具,有各種Script增強(qiáng)其功能,能修改游戲的各項(xiàng)數(shù)據(jù),包括增添刪除代碼,增加貼圖房間等
????這些反編譯工具的核心功能都是解析data.win文件,雖然data.win在gms生成的不同運(yùn)行平臺(tái)的程序里名字不同,但是他們的核心數(shù)據(jù)都是一樣的。