摘要:網易云易盾移動游戲安全技術專家陳士留在年技術路演演講內容中對這個問題有過比較詳細的介紹,摘錄如下防止代碼被反編譯其實就是常見的手游風險中的破解風險。
歡迎訪問網易云社區,了解更多網易技術產品運營經驗。
網易云易盾移動游戲安全技術專家陳士留在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所有版本系統、所有模擬器以及所有游戲引擎使用的指令集。
手游保護的穩定性,需要遵循如下發布流程:
QA測試:在200臺手機上以及各種模擬器上測試;
預線上測試:將安全模塊集成到日活1000的APP上線測試2周;
版本發布:前面2輪都測試穩定后,正式發布;
線上回歸:先在內部比較小的游戲上線測試,確保穩定性。
4.性能影響小
易盾保護方案還具有性能影響小的特點,無論是CPU占用、內存占用、啟動時間、電量消耗等方面的影響幾乎都可忽略不計。
陳士留演講全文請點擊這里查看。
可點擊查看網易云易盾手游加固保護介紹及免費試用。
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25297.html
摘要:發現分析資源文件的過程中,發現了一個數據庫。激活碼明碼保存。激活碼的發布和驗證分開激活碼的發布由項目負責將激活碼明文交由發布渠道,如印刷或其他銷售渠道。這樣即使激活碼數據庫被泄露也不怕其用來被激活。 本文隱去了公司名、人名、應用名、以及應用特征等敏感信息。 本文作者@CuGBabyBeaR 0、背景和事先分析 前段時間看見一個能夠和現實進行交互的應用,覺得挺有意思,恰巧有一個下午...
摘要:打包成單文件所使用的命令為打包成文件夾所使用的命令為不管是哪種打包方式都會留下一個文件。這樣我們只需將腳本文件和腳本文件放置到同一文件夾下,運行我們的腳本。可以看到已經完美的反編譯出其中的腳本好了,相信大家已經明白了反編譯的原理。 近期閱讀了一篇很感興趣的文章,為免后續文章被刪無法再閱讀,現...
閱讀 4375·2021-09-09 09:33
閱讀 2381·2019-08-29 17:15
閱讀 2369·2019-08-29 16:21
閱讀 971·2019-08-29 15:06
閱讀 2612·2019-08-29 13:25
閱讀 577·2019-08-29 11:32
閱讀 3246·2019-08-26 11:55
閱讀 2586·2019-08-23 18:24