知物由學|遊戲開發者如何從容應對Unity手遊風險?

網易易盾發表於2018-03-26

“知物由學”是網易雲易盾打造的一個品牌欄目,詞語出自漢·王充《論衡·實知》。人,能力有高下之分,學習才知道事物的道理,而後才有智慧,不去求問就不會知道。“知物由學”希望透過一篇篇技術乾貨、趨勢解讀、人物思考和沉澱給你帶來收穫的同時,也希望開啟你的眼界,成就不一樣的你。當然,如果你有不錯的認知或分享,也歡迎透過郵件(zhangyong02@corp.netease.com)投稿。

以下為正文:

3月25日,2018 Unity技術路演首站:移動遊戲技術分享日在廣州舉辦。此次活動,旨在為移動遊戲開發者們搭建一個更好的交流平臺,學習Unity在移動遊戲開發領域的最新工具與應用技巧,分享最炫酷的遊戲開發與行業應用案例,瞭解移動遊戲開發中的安全問題所能給企業帶來的隱患,幫助開發者提前感知安全隱患,避免受到損失。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

網易雲易盾移動遊戲安全技術專家陳士留

網易雲易盾移動遊戲安全技術專家陳士留出席交流活動,並進行了《Unity手遊風險及安全問題——網易雲易盾來保駕護航》的技術演講。在分享中,他介紹了時下Unity手遊面臨的眾多風險及熱門外掛,並重點講解了易盾安全解決方案的技術原理和實踐案例。

一、Unity手遊面臨的風險

據統計,2017年國內活躍移動遊戲APP應用約有9000款,其多數存在被破解、惡意程式碼插入、廣告插入、外掛、二次打包等安全問題。而這些安全問題為企業帶來隱患是,研發難度增加,研發成本的提高、玩家付費意願減低、遊戲失去公平性,玩家流失,直接損失收入——因此,破除Unity手遊風險對於開發者來說十分重要。

常見的Unity手遊風險主要包括破解風險、外掛工具這兩類。

破解風險

破解風險主要有Unity mono指令碼解密、Unity il2cpp指令碼解析、Assetbundle資源篡改這三項。

·         Unity mono指令碼解密

以下兩張圖為mono指令碼檔案的二進位制形式及原始碼轉換。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

知物由學|遊戲開發者如何從容應對Unity手遊風險?

·        Unity il2cpp指令碼解析

以libil2cpp.so和global-metadata.dat作為輸入,使用Il2CppDumper即可進行解析:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

解析出來的效果如下所示,類名、函式名以及對應的偏移都能夠被解析出來:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

目前iOS中還沒有能夠解析為原始碼的工具,但是如果可以解密或解析Android指令碼,將會大大方便iOS的破解。因此Android的有效指令碼加密非常有必要。

·        Assetbundle資源篡改

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

知物由學|遊戲開發者如何從容應對Unity手遊風險?

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

·        存檔資料被修改

知物由學|遊戲開發者如何從容應對Unity手遊風險?

某些遊戲存檔資料以明文形式存在,如果這些資料不去服務端校驗,或者是單機遊戲的話,則存在巨大的安全風險,遊戲的各種屬性可以直接修改。

外掛工具

·        遊戲修改器

使用修改器能夠將傷害倍率從18%改成999.9%,使得攻擊傷害提升了幾十倍。類似的原理也可以實現無敵、秒殺、無限藍、技能無CD等效果,因此修改器對遊戲平衡的危害相當大。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

常用的修改器有燒餅修改器、八門神器和GameGuardian(GG修改器及其各種修改版),其中的GG修改器(GameGuardian)流行於即時對戰類遊戲(比如吃雞遊戲)。

上圖為搜尋數值介面,下圖為呼叫lua指令碼介面

知物由學|遊戲開發者如何從容應對Unity手遊風險?

知物由學|遊戲開發者如何從容應對Unity手遊風險?

某QQ群售賣的GG lua指令碼

·        免ROOT修改器

免ROOT修改器是指透過第三方軟體獲得Root許可權,可以訪問和修改手機遊戲中幾乎所有的檔案,但這樣操作有可能影響遊戲的穩定性,出現當機、卡頓、重啟等人為性故障。


知物由學|遊戲開發者如何從容應對Unity手遊風險?
 八門神器附帶的免ROOT修改器

知物由學|遊戲開發者如何從容應對Unity手遊風險?

GG大玩家附帶的免ROOT修改器

·遊戲加速器

加速器分2種型別,一種是手機加速器,例如燒餅加速器、GG加速器;另一種是模擬器加速器,例如天天加速器。加速器除了可以加速,還可以減速。如下圖所示,使用燒餅加速器,背景速度會隨加速倍數加大而提高。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

·        遊戲破解版

破解版提供了很多變態的功能來吸引玩家。下圖是某個站專門破解遊戲售賣進行盈利,他們除了有售賣網站,還開了淘寶店。只要月付150元,就已經超過很多遊戲的ARPU值了。這樣破解版的存在會嚴重影響普通玩家體驗,給遊戲收入和口碑都造成很大的損失。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

包括GG大玩家、光環助手等等,市面上都有各種破解版售賣。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

知物由學|遊戲開發者如何從容應對Unity手遊風險?

GG大玩家遊戲破解版,上圖為修改版列表,下圖為修改版功能

知物由學|遊戲開發者如何從容應對Unity手遊風險?

知物由學|遊戲開發者如何從容應對Unity手遊風險?

光環助手遊戲破解版,上圖為修改版列表,下圖為修改版功能

·        模擬按鍵掛

知物由學|遊戲開發者如何從容應對Unity手遊風險?

上圖就是一個模擬按鍵掛,雖然只是模擬點選,但是可以做到自動遊戲,可以刷各種金幣、積分,對遊戲平衡也會有比較大的影響。常見的模擬按鍵掛包括有觸動精靈、觸控精靈、按鍵精靈、叉叉助手、遊戲蜂窩等等。

二、易盾是怎麼做的?

網易易盾能夠提供Unity mono DLL指令碼加密、IL2CPP 加密、Assetbundle加密等加密解決方案,以及反修改器、反加速、反模擬器、反除錯等手遊通用保護功能和手遊風險感知。

Unity mono DLL指令碼加密

透過修改或者HOOK mono_image_open_from_data_with_name能夠對DLL指令碼加解密。mono_image_open_from_data_with_name是CSharp 指令碼的載入函式,如果CSharpDLL指令碼做了加密,需要在這個函式執行之前解密。因此只要在這個函式這裡下斷點或者HOOK,就可以解密出原始DLL,而不需要逆向加密演算法。需要注意的是,這裡有個memcpy複製操作,mono會把解密後的DLL在記憶體中留存一份複製。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

Unity mono DLL指令碼加密經歷了三代的技術演進。

第一代加密直接對DLL檔案進行加密,在mono_image_open_from_data_with_name函式開始處解密。對於這個的破解方法很簡單,PE結構的檔案,以4d 5a90 00這四個位元組為magic head,這可以做為CSharp DLL指令碼的特徵,只要搜尋0x905a4d這個數值就可以了,由於燒餅修改器是使用10進位制數值,將其轉換成10進位制值:9460301。因此解密門檻很低,只要使用修改器就可以解密。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

知物由學|遊戲開發者如何從容應對Unity手遊風險?

知物由學|遊戲開發者如何從容應對Unity手遊風險?

第二代加密基於第一代加密的明顯弱點,針對解密加強了防護。解密後,把下圖所示的PE頭抹掉,使得修改器無法定位到指令碼位置。因此解密門檻比較高,需要非常強的逆向開發能力才能破解。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

第三代加密針對Csharp 函式做了加密,也就是方法級加密,需動態解密。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

原始未加密dnspy函式解析結果

知物由學|遊戲開發者如何從容應對Unity手遊風險?

函式加密後dnspy函式解析報錯

IL2CPP 加密

Il2cpp指令碼資訊以lib2cpp.so形式存在,結合global-metadata.dat檔案內的符號資訊,即可進行解析,因此需要對libil2cpp.so做so加殼,如下圖所示,原始libil2cpp.so用IDA可以看到475個匯出函式:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

加固後的libil2cpp.so匯出函式則為空:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

Assetbundle加密

Assetbundle未加密時,Unity Studio可解析出各種資源:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

對Assetbundle加密後,Unity Studio就無法解析了:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

手遊通用保護功能

除去Unity mono DLL指令碼加密、IL2CPP 加密、Assetbundle加密等加密解決方案外,網易易盾也能夠提供通用的手遊保護功能,包括反修改器、反加速、反模擬器、反除錯、反模擬點選、檔案校驗、防二次打包、存檔加密、引擎SO定製化加殼等。一般而言,這些通用功能任何遊戲引擎都支援,可以根據遊戲需求選擇一個或多個。目前,網易易盾支援的遊戲主要包含Unity3d、COCOS、NEOX和UE4。

·        反修改器

修改器可以實現很多功能,如無限藍、技能無CD、無敵、秒殺、倍攻等,是工具黨的最愛,也是專業破解者常用的工具之一。常見的修改器除了常見的燒餅、八門神器、葫蘆俠、GG(GameGuardian)以外,還有很多定製修改版。

其中,GG修改器是做的最專業的修改器,專門做了反檢測措施(隨機化包名、子程式使用系統程式名等),因此常規的程式檢測對GG無效。但是易盾手遊保護採用修改行為檢測,可以通殺所有修改器,包括所有已知和未知的修改器。下圖是檢測效果示例:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

·        反加速

加速器可加速可減速,主要分為兩類:一是Android系統內的加速器,如燒餅加速器、叉叉加速器,一般修改器都附帶加速功能;二是對模擬器程式加速的加速器,此加速原理跟端遊加速相同,實質是對整個模擬器做了加速,Android系統內並沒有加速器在執行,比較典型的是天天模擬器附帶的天天加速器。

加速器的使用會讓個別玩家獲得遊戲優勢,影響遊戲平衡。但是易盾手遊保護對以上這2種加速都有檢測方案,而且是針對行為的檢測方案,不針對特定的某些加速器,通用性更好——對於天天加速器這樣的程式加速器,即使只加速0.1倍也可以檢測到。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

上圖是一個加固過的跑酷遊戲,用天天加速器加速生效後,過了一秒鐘左右,即會閃退。

·        反模擬點選

模擬點選嚴格上來說不屬於非法外掛,處於灰色地帶,因此模擬點選器都是公司化動作,應用很廣泛,但是模擬點選指令碼提供的功能對遊戲平衡也會帶來很大的不良影響。目前比較知名的模擬點選器,有叉叉助手、觸動精靈、觸控精靈、按鍵精靈、遊戲蜂窩等。

如下圖所示,觸動精靈啟動後,再啟動遊戲,保護檢測到模擬點選器的存在即會閃退:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

但是易盾手遊保護使用了程式+行為檢測相結合的方式,能夠對模擬點選器進行檢測。

以上介紹的這些手遊通用保護功能各有其特點,開發者可以按實際需求進行選擇:

功能特點反除錯檢測方式隱蔽,大大提高動態逆向分析難度反模擬器可以通殺所有已知和未知模擬器檔案校驗兼顧了效率和安全性防二次打包使用了更為底層的方式,可以繞過各種過校驗外掛存檔加密透明方式接入,不需要開發做額外接入工作

手遊風險感知

網易易盾還能夠提供手遊風險感知功能,主要包括包含破解包的檢測、跟破解者無感知對抗、惡意使用者風險評估以及支援私有化部署。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

三、易盾保護方案特點

網易易盾保護方案具有純Native保護、對引擎SO做加殼、相容性和穩定性高、效能影響小、支援Windows、Linux、Mac三平臺加固等效能特點。

純Native保護

遊戲dex內部都是第三方SDK以及遊戲內部不涉及到遊戲邏輯的SDK。如果對DEX加殼的話,一方面容易造成Android碎片化,導致dex加殼會降低app的相容性;另外Android存在Dalvik和Art兩種虛擬機器,所以dex加殼會為了相容2種虛擬機器而增加處理成本,從而導致啟動耗時增加比較厲害。阿里和騰訊都有DEX加殼服務,但是支付寶、微信都沒做DEX加殼。支付寶和微信的安全問題應該是所有APP中間最嚴重的,他們都沒做DEX加殼,這很能說明問題,此外所有騰訊的遊戲都沒有做DEX加殼。所以如果手遊保護需要依賴於DEX加殼的話,相容性和安全性都是很難保證的。因此建議遊戲不要使用DEX加殼。

下圖是以一個第三方遊戲為例,使用jeb分析其dex包含的模組:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

網易易盾可以提供純Native保護,使遊戲保護不依賴DEX加殼。DEX加殼和純Native保護優缺點比較如下:

影響項DEX加殼純Native保護相容性Android的碎片化對dex影響很大Android的碎片化對natvie層沒有影響 啟動時間啟動的時候需要對數兆的DEX進行讀檔案、解密、ota最佳化,啟動時間影響很大C程式碼的記憶體操作,啟動時間影響很微小執行速度成倍影響執行效率對執行幾乎無影響渠道過審加殼後影響渠道植入SDK不影響渠道打包安全性對遊戲無保護作用,很多遊戲破解版都帶著dex殼完全針對手遊量身定製的保護,到各種遊戲威脅都有防護

對引擎SO做加殼

基本上所有的破解都依賴於對引擎so的逆向分析,如果對so進行了加殼保護,會大大增加遊戲被破解的門檻。除了對引擎SO加殼,網易易盾還會對敏感函式程式碼做校驗。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

相容性和穩定性高

相容強的原理在於所有保護都在SO層,不會對DEX進行修改,有效避免了Android碎片化導致的相容問題。網易易盾的相容性極高,可以相容從Android 2.3到Android 9.0所有版本系統、所有模擬器以及所有遊戲引擎使用的指令集。

手遊保護的穩定性,需要遵循如下發布流程:

1.   QA測試:在200臺手機上以及各種模擬器上測試;

2.   預線上測試:將安全模組整合到日活1000的APP上線測試2周;

3.   版本釋出:前面2輪都測試穩定後,正式釋出;

4.   線上迴歸:先在內部比較小的遊戲上線測試,確保穩定性。

效能影響小

易盾保護方案還具有效能影響小的特點,無論是CPU佔用、記憶體佔用、啟動時間、電量消耗等方面的影響幾乎都可忽略不計。

效能指標影響大小CPU佔用增加0.5%-1%記憶體佔用增加1M-3M啟動時間增加30ms-150ms電量消耗增加0.5%-1%安裝包體積增加1.5M-3M流量消耗無影響GPU佔用無影響

支援Windows、Linux、Mac三平臺加固

此外,易盾保護方案還支援Windows、Linux、Mac三平臺加固,加固工具以jar包形式提供,不僅自帶極速簽名功能,而且對加固做了全面最佳化,速度更快。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

加固接入的對接過程包括:

知物由學|遊戲開發者如何從容應對Unity手遊風險?

1.   確定遊戲加固項;

2.   易盾技術支援雲端配置好加固項;

3.   獲取appkey;

4.   下載加固jar包工具,根據使用說明配置好appkey。

四、易盾的解決方案獲得了哪些客戶認可?

網易易盾保護方案廣泛應用於實際案例中,包括網易公司內部的倩女幽魂、終結者2:審判日等手遊之中。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

在外部,也有遊戲公司多個遊戲皆採用了易盾手遊保護方案。

知物由學|遊戲開發者如何從容應對Unity手遊風險?

最後:易盾還在現場舉辦了安全診斷環節,現場有使用者問及加固的流程。網易客戶全工程師李沛然表示,加固流程上,一條命令列即可接入,不會影響開發流程。

“使用很便捷。”李沛然強調。

相關閱讀:

知物由學第三期:知物由學 |一文讀懂網際網路內容稽核機制

知物由學第四期 |乾貨!一文了解安卓APP逆向分析與保護機制

知物由學第五期 |這些企業大佬如何看待2018年的安全形勢?


相關文章