這是我個人對於Unity逆向漢化的總結,這里默認游戲沒有采用額外的安全措施,使用的Demo是使用Unity直接生成的,實際應用中,大部分需要先繞開游戲的安全機制,或者在漢化結束后需要進行重新簽名等。
主要工具:
AssetStudio(地址:https://www.perfare.net/tag/assetstudio)
il2cppdumper:https://www.perfare.net/tag/il2cppdumper,和AssetStudio是一個作者,具體操作也在他的網站上有
UABE(地址:https://7daystodie.com/forums/showthread.php?22675-Unity-Assets-Bundle-Extractor)
一、基礎知識之Unity的資源文件
這里說的資源文件不是做游戲過程中使用的資源,而是在序列化之后得到的資源文件,在Android平台下,Unity的資源文件都放在Asset/bin/Data文件夾下,也就是AssetStudio讀取的文件夾,這下面的文件就是Unity的資源文件,子文件夾Manager里面放的是代碼相關的文件,其他都是資源文件,如果讀過Asset Studio的源碼,類SerialiableFile解析的文件,就是最常用的資源文件格式,我在漢化過程中基本就是跟這種文件打交道了。這種序列化文件的基本構造是文件頭部+數據區,數據區里放序列化的Asset對象,
Asset的類型很多,可以參見官網(https://docs.unity3d.com/Manual/ClassIDReference.html),如果對他的序列化方式感興趣好奇,可以用UABE導出文本和二進制對照着看看
關於Asset對象的序列化,有兩個地方需要關注:
① 首先是對象之間會有引用關系,因此有個“指針”,指針由兩個部分組成,如下:
class PPtr { Int32 fileID; // 在文件頭部的引用文件列表中的第幾個,0指代本文件 Int64 pathID; // 在該文件中的第幾個對象,0表示空 }
② 然后是游戲制作過程中肯定會有自己的腳本,綁定在場景物體上的腳本大多會有參數,這些參數的數據會以靜態資源的形式也寫入資源文件。這部分會這么處理:
首先是類的信息(在哪一個DLL、命名空間、類名等)會放入MonoScript,然后具體某一個對象會放入一個MonoBehavior,MonoBehavior具體相關的東西我另外寫成了博客,https://www.cnblogs.com/guobaoxu/p/12059225.html
在漢化過程中,資源的替換主要就是MonoBehavior、圖片(Texture2D)、TextAsset三種,后兩種都有插件,操作簡單,寫了篇簡單的博客混一下:https://www.cnblogs.com/guobaoxu/p/12124226.html
二、基礎知識之腳本后端
熟悉正向開發的朋友應該知道,Android平台會有兩種腳本后端,Mono和il2cpp。
① Mono的話比較簡單,腳本的代碼會被編譯成DLL,然后放在assets\bin\Data\Managed文件夾下,用dnSpy等工具可以進行反編譯和修改,在沒有安全措施的情況下,dnSpy可以看到十分清晰的代碼,修改也方便,用來漢化更是綽綽有余
② il2cpp就麻煩多了,腳本最終會被編譯進lib/libil2cpp.so文件夾,同時,腳本內的一些字符串等信息會被放入assets\bin\Data\Managed\Metadata文件夾下面的global-metadata.dat文件里,如果用IDA對so文件反編譯的話,也只能看到匯編代碼。所以想要對il2cpp腳本后端的游戲進行大改是十分麻煩的事情,但是漢化主要聚焦在字符串的修改上,所以會相對簡單的多。
從目前的趨勢來看,il2cpp腳本后端使用頻率會越來越高,畢竟難以反編譯出源碼,又是官方推薦。
三、工具介紹
Asset Studio:這個工具主要用來預覽,是開源的,建議看看他的源碼,並不復雜,可以讓自己對Unity的資源部分有一個很好的理解,但是他沒有解析所有的資源類型,之多常用的做了解析。
UABE:這個工具主要用來替換,這個並不是開源的,實際上看一眼前面提到的被序列化的文件就知道,要解析所有的Unity的資源是個大工程了。主要功能是導出導入,可以二進制形式,也可以文本形式,針對圖片、TextAsset等還有專門的插件。
il2cppdumper:和AssetStudio是一個作者,也是開源的。如果結合前面兩節,會發現一個問題,解析MonoBehavior是需要類的參數列表的,但是il2cpp后端的代碼都被編譯成so了,所以這里就需要一個工具,把參數列表從metadata和so里面導出來,這就是il2cppdumper的主要功能了,在使用前兩個工具的時候也需要用到這個工具導出的DLL。具體使用方法在官網上有介紹。
四、漢化之常見UI框架
這里簡單說一下文字漢化中會遇到的三個UI框架
1.NGUI:在UGUI出現以前比較通用的UI實現方案
2.UGUI:Unity自己做的UI,是官方推薦使用的
3.TextMeshPro:簡稱TMPro,專注於文本的展示,用這個做的文本,在放大之后不會出現毛邊,所以很多人都喜歡用來做一些固定文字的展示(需要用戶輸入的就基本不用這個了)
三種都有共同的特點,都需要字體跟文本內容兩方面的替換。
五、字體替換
三個UI框架都有自己的字體表現形式,NGUI對應BMFont,UGUI對應TTF,TMPro對應自己的字體,其中BMFont和TMPro字體是類似的,都是圖片+一個Asset描述字符切片的位置,然后在綁定一個紋理用於渲染,TTF則是有專門的FontAsset類型(大概這就是親兒子吧),每一種的替換另外寫成博客,請看:
BMFont字體:https://www.cnblogs.com/guobaoxu/p/12060397.html
TTF字體:https://www.cnblogs.com/guobaoxu/p/12060027.html
TMPro字體:https://www.cnblogs.com/guobaoxu/p/12091339.html
六、文字替換
文字的替換有兩種,一種是資源文件中的,這種是在開發過程中,在檢查器里直接輸入的文字,一般是默認值或者固定的文本,另一種則是代碼中的字符串,涉及代碼,前面提到的兩種腳本后端又需要拿出來說一說了。
資源文件中的修改很簡單,不管是哪一個框架,所有的Text都是以腳本的形式呈現,如果你注意看Unity中的檢查器,會發現他的組件名字都是“Text (Script)”,所以他的修改就是MonoBehavior的修改,還是看前面提到的那篇博客即可:https://www.cnblogs.com/guobaoxu/p/12059225.html
代碼中字符串的修改就需要分腳本后端來說了
【1】Mono腳本后端
前面說了,Mono腳本后端把代碼都放進了DLL里面,而DLL拿dnSpy直接修改就好了,很簡單,具體過程我也寫成了博客:https://www.cnblogs.com/guobaoxu/p/12126410.html
【2】il2cpp腳本后端
這個就很麻煩了,代碼被編譯成了libil2cpp.so、global-metadata.dat兩個文件,字符串在global-metadata.dat里,這個目前沒有現成工具,好在il2cppdumper是開源的,里面涉及到了對字符串信息的提取,所以我自己擼了一個小工具來做修改,具體過程另外寫成博客:https://www.cnblogs.com/guobaoxu/p/12132379.html