Mono作為backend的時代,破解總的來說還是容易的:
修改libmono.so :從內存動態搜素dll特征值動態dump
混淆Dll:dnspy作者的de4net可以反混淆大部分混淆器
修改Dll的PE結構(騰訊MTP):可以用XPose抓取Dll主體配合一些工具修復PE頭
動態解密Dll Method(網易易盾):這一招最狠,每次只能Dump一部分Method實現,除非分析解密的so,暴力遍歷所有函數回寫
IL2Cpp似乎為我們解決了以上問題,但是IL2Cpp Dumper的出現,使得小白也能輕松拿到所有的Assembly、class、成員組成。如果不對IL2Cpp進行加密,利用上述Dump信息配合IDA,依然可以使得關鍵函數被定位修改,例如源源不斷的崩壞3修改版。
IL2Cpp加密有兩種思路:
對libil2cpp加殼
對global-metadata.dat進行加密
考慮到libil2cpp.so是在Unity啟動流程中被加載的,加殼的話需要hook或者修改Unity源碼。因此加密global-metadata.dat性價比是最高的。
打開Unity安裝目錄Editor\Data\il2cpp\libil2cpp\vm,找到MetadataCache.cpp和MetadataLoader.cpp,MetadataCache::Initialize中通過MetadataLoader::LoadMetadataFile加載了global-metadata.dat,據此即可對dat進行加密,無論是加入加密算法還是修改路徑都是可以的。
對於自動化流程,安卓可以在出包以后,zip解壓apk進行處理;iOS則在打包為XCode工程時進行處理,ipa一旦生成,就不好進行修改了。這些可以做成Editor腳本或者Jenkins腳本。
麻煩的一點是需要修改Unity安裝目錄的代碼,因此需要注意出包使用同一台機器,同時對開發人員平時自行打包做一些兼容處理,例如加載加密失敗則Fallback到正常的讀取流程中。