如何防止Unity3D程式碼被反編譯?
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。
網易雲易盾移動遊戲安全技術專家陳士留在2018年Unity技術路演演講內容中對這個問題有過比較詳細的介紹,摘錄如下:
防止Unity3D程式碼被反編譯其實就是常見的Unity手遊風險中的破解風險。
一、Unity面臨的破解風險
Unity的破解風險主要有Unity mono指令碼解密、Unity il2cpp指令碼解析、Assetbundle資源篡改這三項。
1.Unity mono指令碼解密:
以下兩張圖為mono指令碼檔案的二進位制形式及原始碼轉換。
2.Unity il2cpp指令碼解析:
以libil2cpp.so和global-metadata.dat作為輸入,使用Il2CppDumper即可進行解析:
解析出來的效果如下所示,類名、函式名以及對應的偏移都能夠被解析出來:
目前iOS中還沒有能夠解析為原始碼的工具,但是如果可以解密或解析Android指令碼,將會大大方便iOS的破解。因此Android的有效指令碼加密非常有必要。
3.Assetbundle資源篡改:
透視功能可讓使用修改版的玩家獲取不對稱優勢。如下所示的某槍擊遊戲,將其中Assetbundle資源裡面的材質屬性修改為透明,即可達到透視的效果。
除了資源被篡改的風險外,遊戲中還存在資源被競品盜取、分析的風險。
4.存檔資料被修改
某些遊戲存檔資料以明文形式存在,如果這些資料不去服務端校驗,或者是單機遊戲的話,則存在巨大的安全風險,遊戲的各種屬性可以直接修改。
如何保護Unity安全?很多開發團隊可能也有自己開發加固保護系統的打算,如果要做好這套保護系統,需要解決很多問題,主要包括以下四個:
第一、保護方案自研成本比較高,需要不斷調研、不斷改進,不但需要了解破解流程,還需要深度掌握Unity引擎的執行原理。
第二、安卓的相容性問題,安卓裝置碎片化嚴重,系統版本升級、使用者環境多樣化。需要不斷完善解決方案。網易在這一塊積累了很長時間,才開發出一套在效能、相容性和安全強度都滿足的保護方案。如果遊戲開發團隊自研,相容性會佔用團隊大量時間,降低遊戲核心邏輯開發速度。
第三、對於破解來說,本身保護工作是一個矛和盾的過程,是不斷升級和不斷對抗的過程。如果遊戲開發團隊要去自研保護系統,需要分析市面上的破解工具,並不斷分析他們破解的方法,然後才能不斷提高整個保護系統強度。
第四、第三方服務的相容性,遊戲現在越來越是一個精細化開發的模式,很多遊戲團隊只做一些核心的邏輯玩法的開發,所以保護就需要相容支付模組、熱更新方案及質量跟蹤等各種第三方服務。而相容這些第三方的服務,又給遊戲開發團隊帶來了很大的挑戰。
綜上所述,如果遊戲開發團隊自主開發保護方案肯定會面臨很大技術和資金挑戰,所以不建議自主開發保護方案。
二、那麼易盾是怎麼防止Unity3D程式碼被破解的呢?
網易雲易盾能夠提供Unity mono DLL指令碼加密、IL2CPP 加密、Assetbundle加密等加密解決方案!
通過修改或者HOOK mono_image_open_from_data_with_name能夠對DLL指令碼加解密。mono_image_open_from_data_with_name是CSharp 指令碼的載入函式,如果CSharpDLL指令碼做了加密,需要在這個函式執行之前解密。因此只要在這個函式這裡下斷點或者HOOK,就可以解密出原始DLL,而不需要逆向加密演算法。需要注意的是,這裡有個memcpy拷貝操作,mono會把解密後的DLL在記憶體中留存一份拷貝。
Unity mono DLL指令碼加密經歷了三代的技術演進。
第一代加密直接對DLL檔案進行加密,在mono_image_open_from_data_with_name函式開始處解密。對於這個的破解方法很簡單,PE結構的檔案,以4d 5a90 00這四個位元組為magic head,這可以做為CSharp DLL指令碼的特徵,只要搜尋0x905a4d這個數值就可以了,由於燒餅修改器是使用10進位制數值,將其轉換成10進位制值:9460301。因此解密門檻很低,只要使用修改器就可以解密。
第二代加密基於第一代加密的明顯弱點,針對解密加強了防護。解密後,把下圖所示的PE頭抹掉,使得修改器無法定位到指令碼位置。因此解密門檻比較高,需要非常強的逆向開發能力才能破解。
第三代加密針對Csharp 函式做了加密,也就是方法級加密,需動態解密。
原始未加密dnspy函式解析結果
函式加密後dnspy函式解析報錯
IL2CPP加密
Il2cpp指令碼資訊以lib2cpp.so形式存在,結合global-metadata.dat檔案內的符號資訊,即可進行解析,因此需要對libil2cpp.so做so加殼,如下圖所示,原始libil2cpp.so用IDA可以看到475個匯出函式:
加固後的libil2cpp.so匯出函式則為空:
Assetbundle加密
Assetbundle未加密時,Unity Studio可解析出各種資源:
對Assetbundle加密後,Unity Studio就無法解析了:
三、易盾保護方案特點
網易易盾保護方案具有純Native保護、對引擎SO做加殼、相容性和穩定性高、效能影響小、支援Windows、Linux、Mac三平臺加固等效能特點。
1.純Native保護
遊戲dex內部都是第三方SDK以及遊戲內部不涉及到遊戲邏輯的SDK。如果對DEX加殼的話,一方面容易造成Android碎片化,導致dex加殼會降低app的相容性;另外Android存在Dalvik和Art兩種虛擬機器,所以dex加殼會為了相容2種虛擬機器而增加處理成本,從而導致啟動耗時增加比較厲害。阿里和騰訊都有DEX加殼服務,但是支付寶、微信都沒做DEX加殼。支付寶和微信的安全問題應該是所有APP中間最嚴重的,他們都沒做DEX加殼,這很能說明問題,此外所有騰訊的遊戲都沒有做DEX加殼。所以如果手遊保護需要依賴於DEX加殼的話,相容性和安全性都是很難保證的。因此建議遊戲不要使用DEX加殼。
網易易盾可以提供純Native保護,使遊戲保護不依賴DEX加殼。DEX加殼和純Native保護優缺點比較如下:
2.對引擎SO做加殼
基本上所有的破解都依賴於對引擎so的逆向分析,如果對so進行了加殼保護,會大大增加遊戲被破解的門檻。除了對引擎SO加殼,網易易盾還會對敏感函式程式碼做校驗。
3.相容性和穩定性高
相容強的原理在於所有保護都在SO層,不會對DEX進行修改,有效避免了Android碎片化導致的相容問題。網易易盾的相容性極高,可以相容從Android 2.3到Android 9.0所有版本系統、所有模擬器以及所有遊戲引擎使用的指令集。
手遊保護的穩定性,需要遵循如下發布流程:
1. QA測試:在200臺手機上以及各種模擬器上測試;
2. 預線上測試:將安全模組整合到日活1000的APP上線測試2周;
3. 版本釋出:前面2輪都測試穩定後,正式釋出;
4. 線上迴歸:先在內部比較小的遊戲上線測試,確保穩定性。
4.效能影響小
易盾保護方案還具有效能影響小的特點,無論是CPU佔用、記憶體佔用、啟動時間、電量消耗等方面的影響幾乎都可忽略不計。
陳士留演講全文請點選這裡檢視。
可點選檢視網易雲易盾手遊加固保護介紹及免費試用。
相關文章:
【推薦】 Kylin儲存和查詢的分片問題