Unity手游漢化筆記⑦:il2cpp腳本后端,修改代碼中的字符串


總的筆記:https://www.cnblogs.com/guobaoxu/p/12055930.html


  對於Mono腳本后端,代碼被編譯進DLL,如果沒有安全措施,利用dnSpy就可以很輕松的修改其中的字符串。

  對於il2cpp腳本后端,代碼中的字符都在global-metadata.dat文件中。用il2cppdumper,通過libil2cpp.so和global-metadata.dat導出很多信息,其中stringliteral.json文件中就有代碼中的字符串,但是這個工具是用來dump信息的,不是用來修改的,所以我參考他的源碼,做了一個簡單的工具來對代碼進行修改,下面是操作過程。

一、Demo制作

  Demo很簡單,頁面上添加一個UI/Text,綁定一個腳本,然后導出apk之前,記得先在Player Settings里面設置好使用il2cpp腳本后端。

腳本代碼如下:

1 public class MyScript : MonoBehaviour {
2     void Start () {
3         var text = gameObject.GetComponent<Text>();
4         text.text = "Test String";
5     }
6 }

運行效果(沒有截全屏)如下:

二、修改

  Demo是Unity直接導出的,沒有安全措施,直接用WinRAR打開,在\assets\bin\Data\Managed\Metadata下找到global-metadata.dat文件,用我自己做的一個小工具(https://github.com/JeremieCHN/MetaDataStringEditor)打開他,效果如下:

上面的輸入框是搜索用的,搜索要改的字符串,回車或者點擊下一個找到它,然后右鍵該字符串,編輯(可以中文,但要考慮字體支不支持),保存,效果如下

我沒有做成寫回源文件的方式,要另存為,手動覆蓋一下,然后裝回去。最終效果(沒有截全屏)如下:

三、基本原理

  global-metadata.dat里面的信息很多,在il2cppdumper里面可以看到,字符串的區域有兩個,代碼中的字符串在其中一個,這個區域的特點是這樣,首先在文件頭部有一個列表,里面放了每一個字符串的長度和在數據區的偏移量,同時在數據區,字符串是緊湊放置的,也就是說字符串和字符串之間沒有分割符號,用010 Editor打開文件的話,可以找到字符串的區域,

而另一個區域則是每一個字符串的結尾都會有一個\0,兩個區域的功能應該是不同的,我的猜測是,我改的這個區域是代碼中的字符串,而另一個區域則是類名、方法名等。

  具體修改過程也比較簡單,對於頭部的列表,因為修改前后字符串的數量是不變的,所以這個列表所占據的空間也是不變的,數據區的話大概率是會變的,我的做法是,在修改之后先計算數據區的長度,如果可以放入原來數據區所在的空間,就直接放,否則在文件尾另外開辟一塊空間來放,這樣我就不需要去重排后面的其他數據了。關於字符串的編碼,還是Unity常用的UTF-8編碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM