IL2Cpp簡易加密方法

Mono作爲backend的時代,破解總的來說還是容易的:

  1. 修改libmono.so :從內存動態搜素dll特徵值動態dump
  2. 混淆Dll:dnspy作者的de4net可以反混淆大部分混淆器
  3. 修改Dll的PE結構(騰訊MTP):可以用XPose抓取Dll主體配合一些工具修復PE頭
  4. 動態解密Dll Method(網易易盾):這一招最狠,每次只能Dump一部分Method實現,除非分析解密的so,暴力遍歷所有函數回寫

IL2Cpp似乎爲我們解決了以上問題,但是IL2Cpp Dumper的出現,使得小白也能輕鬆拿到所有的Assembly、class、成員組成。如果不對IL2Cpp進行加密,利用上述Dump信息配合IDA,依然可以使得關鍵函數被定位修改,例如源源不斷的崩壞3修改版。

IL2Cpp加密有兩種思路:

  1. 對libil2cpp加殼
  2. 對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到正常的讀取流程中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章