關(guān)于寶開(kāi)游戲/pvz1/pvz2的rsb文件中列表段的簡(jiǎn)單介紹
很多人好奇寶開(kāi)游戲/pvz1/pvz2的rsb文件中文件列表/子組列表/混合組列表的結(jié)構(gòu),這里簡(jiǎn)單介紹一下。

這個(gè)結(jié)構(gòu)是Sexy::CompiledMap類(lèi)型用的,我們先在pvz2反匯編結(jié)果中找找相關(guān)函數(shù)。
用ida x64打開(kāi)pvz2安卓版10.4.1 arm64的libPVZ2.so文件,跳轉(zhuǎn)到如下四個(gè)地址即可看到Sexy::CompiledMap相關(guān)的四個(gè)函數(shù)(按F5可以將匯編代碼轉(zhuǎn)為偽c代碼):
0x1866CC8--Sexy::CompiledMap::CompiledMap(構(gòu)造函數(shù))
0x1866CE4--Sexy::CompiledMap::Init(初始化)
0x1866CF4--Sexy::CompiledMap::Initialized(檢查是否初始化)
0x1866D04--Sexy::CompiledMap::Find(查找指定字符串的相關(guān)信息)
通過(guò)其構(gòu)造函數(shù)和初始化,我們可以推斷出Sexy::CompiledMap的結(jié)構(gòu),他由一個(gè)指針(對(duì)應(yīng)數(shù)據(jù)位置)和一個(gè)32位整數(shù)(數(shù)據(jù)長(zhǎng)度 / 4,即對(duì)應(yīng)數(shù)據(jù)中32位數(shù)據(jù)個(gè)數(shù))構(gòu)成。




通過(guò)查找字符串相關(guān)信息函數(shù),我們可以很輕松的了解CompiledMap中的數(shù)據(jù)的組織方式。
CompiledMap中的數(shù)據(jù)由一些鍵值對(duì)構(gòu)成,鍵固定為字符串類(lèi)型,這些字符串在存儲(chǔ)的時(shí)候,每一個(gè)字符后面都帶了24位偏移值,如果有偏移值則代表前面的字符串被復(fù)用多次,大概就是這個(gè)意思。看不懂上面代碼的話(huà),我寫(xiě)了一個(gè)C#版本,現(xiàn)在貼到下面(pvz1和pvz2的Sexy::CompiledMap::Find略有不同,所以寫(xiě)了兩個(gè)):
當(dāng)然,通過(guò)這四個(gè)函數(shù)可以很輕松的找到rsb加載邏輯等內(nèi)容,我就不多說(shuō)了,大家有興趣可以進(jìn)群877805324和我交流。