內容來源:2018 年 09 月 08 日,網易資深安全工程師張本樑在“RTC2018 實時網際網路大會”進行《網易 Android 遊戲保護實踐》演講分享。IT 大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。
閱讀字數:2520 | 7分鐘閱讀
摘要
本次分享主要介紹安卓手遊面臨的各種外掛問題,並針對unity3d和通用引擎遊戲提出了一些解決方案。
Unity 手遊面臨的安全風險
我們都知道目前手遊已經超過端遊,成為市場份額最大的一款遊戲型別,與此同時圍繞著手遊的外掛越來越多,外掛作者的水平也有很大提升。
就目前看來,如果一款遊戲在事先沒有任何防護的情況下放到渠道上,被破解的概率要高很多。
外掛工具
分析資料後我們發現在外掛群體中使用外掛工具的比例最高,門檻也是最低的,一個普通玩家不需要任何程式設計經驗就可以輕鬆使用。
在外掛工具中游戲修改器又是使用頻率最高的,修改器可以輕易將武器傷害從18%改成999.9%,使得攻擊傷害提升幾十倍。類似的原理也可以實現無敵、秒殺、無限藍、技能無 CD 等效果。因此修改器對遊戲平衡性的危害相當大。
為應對遊戲安全防護等級的不斷提高,各種外掛技術也在持續發展中。早期的遊戲修改器還需要搜尋和修改記憶體,後面則直接通過執行指令碼就能完成修改,在一些論壇、網站、聊天工具中都可以購買到相應的 Lua 指令碼。
通常要想使用修改器,手機都需要 Root,不過安卓版本越高 Root 越難,所以有些修改器提供了免 Root 的功能,它的實現原理其實就是和虛擬空間的工具聯合使用,讓修改器執行在有 Root 許可權的環境中。
除開修改器之外,還有一種外掛形式——遊戲加速器。在一些酷跑類遊戲中,遊戲加速器可以通過設定加速倍數來控制遊戲背景速度,以實現加速或減速效果。現有的加速主要分為兩種,一種是手機加速器,通常遊戲修改器都會附帶加速功能,還有一種是模擬器加速。
模擬按鍵掛可能是使用頻率不太高的外掛,不過雖然只是模擬點選,但是卻實現自動遊戲,可以刷各種金幣、積分,對遊戲平衡性還是有比較大的影響。
遊戲破解版是一種更暴力的破解方式,需要對遊戲本體改包,但也因此能獲得可觀的收益。破解版提供了很多變態功能來吸引玩家,大多采用月付的購買方案,價格上可能已經超過很多遊戲的ARPU值了,所以這種形式不光影響普通玩家體驗,也給遊戲收入和口碑造成了很大損失。
破解風險
Unity提供了兩種模式:mono虛擬機器,il2cpp。從市面上抓取的遊戲包來看,mono指令碼的形式相對更多一些。現在有很多工具都可以將mono指令碼二進位制形式轉換為原始碼,從而檢視遊戲的所有邏輯,並進行修改。
對於il2cpp指令碼,以libil2cpp.so和global-metadata.dat作為輸入,使用II2cppDumper即可進行解析。最終的解析結果包含類名、函式名、以及對應的偏移。
資源修改也算在一種外掛,比如在射擊遊戲中將Assetbundle資源裡面的材質屬性改為同透明即可達到透視的效果。除了資源被篡改的風險外還存在資源被競品盜取、分析的風險。
另外某系遊戲存檔資料會以明文形式存在,如果這些資料不做服務端校驗,或者是單機遊戲的話,則存在巨大的安全風險,遊戲的各種屬性可以被直接修改。
協議破解是相對bug的方式,主要通過抓包軟體分析協議,獲取協議中包含的血量或攻擊等資料傳輸。破解者先讓玩家連線到其專門架設的伺服器上,之後對玩家傳輸過來的資料進行解包並做出修改,再將修改後的資料返回到廠商伺服器。
網易雲盾安全解決方案
Unity mono DLL指令碼加密
Mono_image_open_from_data_with_name是mono虛擬機器的 C# 指令碼載入函式,如果 C# DLL 指令碼做了加密,就需要在該函式執行之前解密,Mono 會把解密之後的DLL在記憶體中留存一份拷貝。因此只要在這個函式裡下斷點或者Hook,就可以解密出原始DLL,不需要逆向加密演算法。
第一代加密是直接對DLL檔案進行加密,在Mono_image_open_from_data_with_name開始處解密,其解密門檻很低,只需使用修改器就可以解密。
第二代基於第一代加密的明顯弱點,針對解密加強了防護。解密後PE頭會被抹掉,使得修改器無法定位到指令碼文字。這種解密門檻比較高,需要非常強的逆向開發能力才能破解。
第三代針對C#函式做加密,也就是方法級加密、動態解密,只有在函式執行的時候才解密,因此無論如何dump都無法從記憶體中獲取到解密之後的完整第二檔案。易盾目前採用第二代加第三代加密組合使用的方式來確保DLL指令碼加密的安全強度。
手遊通用保護功能
以上反破解方案主要是針對unity3d遊戲,接下來會介紹一些通用功能,任何遊戲引擎都支援,可以根據遊戲需求選擇一個或多個。比如反修改器、反加速器、檔案校驗、存檔加密、防二次打包、防多開、反同步等等。
修改器除了常規版本外,還有很多定製修改版本,它們專門做了反檢測措施(隨機化包名、子程式使用系統程式名等),因此常規的程式檢測無法發揮作用。易盾手遊保護採用修改行為檢測,可通殺所有修改器,包括已知和未知的。
前面提到過加速器分為兩種,安卓系統內的加速器和對模擬器程式加速的加速器。第二種的原理和端遊加速相同,實質是對整個模擬器做了加速,安卓系統內並沒有加速器執行。我們對這2種加速都有檢測方案,同樣是針對行為而非特定加速器,通用性更好。另外模擬點選方面易盾手遊保護使用了程式加行為檢測結合的方式,對其進行檢測。
以上為今天的分享內容,謝謝大家!