如何防止Unity3D代碼被反編譯?

歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。android

網易雲易盾移動遊戲安全技術專家陳士留在2018年Unity技術路演演講內容中對這個問題有過比較詳細的介紹,摘錄以下:web

防止Unity3D代碼被反編譯其實就是常見的Unity手遊風險中的破解風險。算法


1、Unity面臨的破解風險安全


Unity的破解風險主要有Unity mono腳本解密、Unity il2cpp腳本解析、Assetbundle資源篡改這三項。微信

1.Unity mono腳本解密:app

如下兩張圖爲mono腳本文件的二進制形式及源碼轉換。函數





2.Unity il2cpp腳本解析:工具

以libil2cpp.so和global-metadata.dat做爲輸入,使用Il2CppDumper便可進行解析:性能



解析出來的效果以下所示,類名、函數名以及對應的偏移都可以被解析出來:測試



目前iOS中尚未可以解析爲源碼的工具,可是若是能夠解密或解析Android腳本,將會大大方便iOS的破解。所以Android的有效腳本加密很是有必要。


3.Assetbundle資源篡改:

透視功能可以讓使用修改版的玩家獲取不對稱優點。以下所示的某槍擊遊戲,將其中Assetbundle資源裏面的材質屬性修改成透明,便可達到透視的效果。



除了資源被篡改的風險外,遊戲中還存在資源被競品盜取、分析的風險。


4.存檔數據被修改



某些遊戲存檔數據以明文形式存在,若是這些數據不去服務端校驗,或者是單機遊戲的話,則存在巨大的安全風險,遊戲的各類屬性能夠直接修改。


如何保護Unity安全?不少開發團隊可能也有本身開發加固保護系統的打算,若是要作好這套保護系統,須要解決不少問題,主要包括如下四個:


第1、保護方案自研成本比較高,須要不斷調研、不斷改進,不但須要了解破解流程,還須要深度掌握Unity引擎的運行原理。


第2、安卓的兼容性問題,安卓設備碎片化嚴重,系統版本升級、用戶環境多樣化。須要不斷完善解決方案。網易在這一塊積累了很長時間,纔開發出一套在性能、兼容性和安全強度都知足的保護方案。若是遊戲開發團隊自研,兼容性會佔用團隊大量時間,下降遊戲核心邏輯開發速度。


第3、對於破解來講,自己保護工做是一個矛和盾的過程,是不斷升級和不斷對抗的過程。若是遊戲開發團隊要去自研保護系統,須要分析市面上的破解工具,並不斷分析他們破解的方法,而後才能不斷提升整個保護系統強度。


第4、第三方服務的兼容性,遊戲如今愈來愈是一個精細化開發的模式,不少遊戲團隊只作一些核心的邏輯玩法的開發,因此保護就須要兼容支付模塊、熱更新方案及質量跟蹤等各類第三方服務。而兼容這些第三方的服務,又給遊戲開發團隊帶來了很大的挑戰。


綜上所述,若是遊戲開發團隊自主開發保護方案確定會面臨很大技術和資金挑戰,因此不建議自主開發保護方案。


2、那麼易盾是怎麼防止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就沒法解析了:




3、易盾保護方案特色


網易易盾保護方案具備純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佔用、內存佔用、啓動時間、電量消耗等方面的影響幾乎均可忽略不計。

陳士留演講全文請點擊這裏查看。

可點擊查看網易雲易盾手遊加固保護介紹及免費試用。

相關文章:
【推薦】 一個內部增加案例的分享
【推薦】 漫畫解讀「跨視圖粒度計算」,瞭解有數分析利器
【推薦】 知物由學 | AI時代,那些黑客正在如何打磨他們的「利器」?

相關文章
相關標籤/搜索