[逆向]對基于I2 Localization本地化插件的u3d游戲漢化的探索
最近接觸了一款冷門的英文游戲Untrusted,類型為社交推理(狼人殺),苦于文字量極大、英文水平一般,遂研究漢化,有了一些初步的成果。

這里是游戲的主菜單,可以看到左下角支持的語言是英語和意大利語,此外,還有需要在steam啟動選項里調整的俄語。

下面是摸索漢化的過程
剛開始接觸漢化時完全沒有頭緒,去b站淺顯地找了一下教程:
[Unity3D-游戲漢化教程]第1期:Mono腳本 Assembly-CSharp_嗶哩嗶哩_bilibili
這倆還不錯,看后有了一點思路,基本就是用解包工具進行逆向、翻譯、最后打包。特別是第二個,講了應對好幾種不同情況下的漢化方法。但幾種方法都不適用于我手頭的這款游戲,后面自己摸索出了漢化的方法。
下面按照順序講一下實踐操作:
1.尋找暴露在外部的語言文件

游戲根目錄結構如上圖,Mono...文件夾保存了一些工具,_Data文件夾中是游戲的數(shù)據(jù),兩個exe是unity的程序入口即游戲啟動文件,剩下那個dll包括了unity引擎代碼和引擎的證書。
為了進行漢化,需要訪問保存游戲文件的_Data文件夾:

最上面的Managed保存了大量dll文件,幾乎包括了所有的腳本;Resources則包含了紋理、默認字體、材質、shader等資源;Plugins沒研究過,猜測和Steam的聯(lián)動有關,我們自己做游戲好像不會出現(xiàn)這個。
剩下那些雜七雜八的文件則是不同的場景資源。
根據(jù)以往的經(jīng)驗,嘗試尋找暴露在外部的.json語言文件,可惜沒有。
2.dnSpy
dnSpy是著名的逆向軟件,用來拆包查看代碼。
至此,打算先看看Managed里面保存的腳本,因為很多小體量游戲會把文本以字符串的形式保存在腳本中。

圖沒截完,共有82個dll文件,首先用dnSpy拆一下最重要的Assembly-CSharp.dll,看看里面的腳本:

先用肉眼粗略掃一遍腳本,東西非常多,腳本中沒有發(fā)現(xiàn)明顯的字符串,又搜索language、translation、translator等關鍵字,發(fā)現(xiàn)了這個:

里面仍然沒有所需內容,又順藤摸瓜找到了這個:

通過在搜索引擎搜索LocalizationManager,發(fā)現(xiàn)它和一款叫做I2 Localization的Unity本地化插件有關,它能夠很方便地管理多語言,在打包時會把語言文件儲存在_Data文件夾的.assets文件中。
3.AssetBundleExtractor
AssetBundleExtractor是一個資源文件查找器,能夠查找資源文件中的特定文件,例如我們需要的語言文件。
使用AssetBundleExtractor對多個.assets文件進行解包,將文件按照大小順序排列,發(fā)現(xiàn)了本地化文件的蹤跡:確認了它保存在resources.assets中。

因為事先知道游戲只支持英語、俄語和意大利語,所以一眼就看出ru、it、en是語言文件。
利用AssetBundleExtractor的導出功能(右下角的Plugins),獲得了txt格式的en語言文件。事實上它是以json的方式運作的:

這json文件是不是很熟悉?當時很興奮,研究了一整天,終于有了成果。經(jīng)過機翻和人工的潤色,成了下面的文件:

最后用AssetBundleExtractor把文本導回原來的resources.assets里面(差點忘記備份),啟動游戲,漢化成功!

因為untrusted是個社交推理類游戲,可能涉及游戲中的字符串檢測,在教程中教導玩家在公屏打字的環(huán)節(jié)會卡住,導致游戲無法進行下去(大悲
但如果只看替換文本效果的話,這次漢化無疑是成功的。
雖然沒能玩到游戲很遺憾,但希望能給想學習漢化的同學們一些經(jīng)驗。