爲什麼說SO加固+無源碼VMP是最佳的Android手遊安全保護方案?

本文作者爲易盾實驗室工程師。

隨着移動互聯網的高速發展,移動遊戲市場也得到了快速發展,與之對應的移動遊戲外掛和破解市場也是風生水起,外掛和破解的發展對遊戲的玩家體驗,以及廠商收益產生了極大的消極影響。爲維護遊戲運營安全,保障玩家公平的遊戲環境,對遊戲的保護必不可少。

移動遊戲最重要的是部分是資源和邏輯,而遊戲引擎則是處理資源和邏輯的關鍵所在。惡意玩家可以通過遊戲引擎獲取解密後的遊戲腳本或遊戲資源,然後修改腳本或資源到達破解的目的;也能通過修改引擎的邏輯達到破解的目的;還可以通過引擎插入自己的腳本或資源實現外掛功能。

因此遊戲引擎的保護是迫切的,在Android 遊戲中游戲引擎是SO文件,如何保護SO文件成了遊戲需要面臨的問題。遊戲,再怎麼考慮安全,也必須要考慮到遊戲體驗,順暢的遊戲體驗對玩家至關重要,一切安全解決方案必須在不影響遊戲性能和玩家體驗的基礎上進行。

目前SO文件保護方案大概可以分爲有源保護和無源保護,有源保護分爲自解密、混淆、源碼VMP等,無源保護分爲加殼、VMP保護。

有源保護中的自解密保護的原理是:先加密需要加密的函數或者段,然後再加載SO文件,解密先前加密的函數和段。由於運行後需要解密相關的邏輯,因此破解者只需要在SO文件運行後,DUMP內存,即可獲取解密後的邏輯,破解門檻低,因此自解密的保護方式存在安全強度低、維護成本高的缺點。

市面上常用SO源碼保護是基於LLVM的混淆,通過指令替換、控制流扁平化和虛假控制流等角度去混淆源碼。如下源碼爲測試源碼,試試一個簡單的校驗函數,測試程序是ARMV7A架構下的編譯。
圖片描述

下面是混淆前的控制流程圖展示:
圖片描述

對上面的源碼進行一些混淆,在增加了虛假控制流、指令替換和控制流平坦化的處理後,控制流的複雜度增加。如下圖所示,增加了控制流程圖複雜度,加大了逆向分析的難度。基於LLVM的源碼混淆比較靈活,可以根據不同的安全需求配置不同的安全策略,混淆程度越高,則性能影響越大,文件膨脹越多。在對遊戲影響很小的前提下,混淆能做的比較有限,導致安全強度不夠,混淆存在安全強度和性能不可兼得的問題,不好找到平衡點。
圖片描述

由於源碼混淆的方案在安全強度方面不夠,因而出現源碼VMP的解決方案。

相對基於LLVM的混淆,VMP安全強度更高,並且對SO文件的體積影響也較小,加固後的SO主要分爲虛擬數據VMData和解釋器handler,如下圖所示爲例子的VMData數據。

圖片描述

解釋器handler的控制流

圖片描述

採用VMP保護對原函數執行的性能有比較大的影響,對所有方法VMP是無法滿足遊戲方對性能的要求。VMP的在不瞭解VMData和handler的對應關係的情況下,安全強度非常高,若相關的對應關係被破解者掌握,則也可以被還原,不過handler的複雜性一般比較高,並且對應關係可以做到隨機處理,因此安全強度是完全滿足遊戲方的要求。

上面說的基於源碼的保護都存在一個相同的問題是接入成本高,需要處理源碼就需要有本地工具,特別有些遊戲引擎非開源,那基於源碼的保護則無法接入。

無源碼保護的加殼,市面上對應的加殼的方式有很多,安全強度差異也較大,不過核心是自定義linker。在殼SO文件被執行後需要先解密、還原被保護的SO文件,然後使用自定義linker加載被保護的SO,最後將執行權還給被保護的SO。加固的靜態保護強度很高,原SO的蛛絲馬跡完全抹去,但是動態執行後會還原部分內容,開發者也可以配合反調試、反Dump等技術使用,彌補SO加固在內存安全強度上的弱點。雖然加固存在着比較明顯的弱點,然而加固也存在極大的優勢,加固是對遊戲性能影響最小,在遊戲運行中不會增加任何開支,並且接入成本低,不需要有任何接入的成本。

無源碼VMP與基於源碼的VMP原理上是相通的,加固處理後最關鍵的部分依然是虛擬數據VMData和指令解釋執行器handler。VMP處理時需要將原指令處理成VMData虛擬數據,並且插入解釋器handler,如下圖所示爲無源VMP的handler。
圖片描述

VMP處理的安全強度高,逆向分析成本高,當然同樣存在性能的問題。

根據上面對目前SO文件保護方案的說明,可以發現SO加殼是性能影響最小,VMP是安全強度最高,無源碼方案是接入成本最低的方案。採用SO加固+無源碼VMP結合的方式即可滿足遊戲對性能影響最小化的需求,最大程度的減少安全措施對遊戲性能的影響,同時滿足對遊戲引擎的保護需求,在遊戲引擎關鍵地方採用VMP防止破解者逆向分析,保障了遊戲的安全。

點擊免費體驗網易易盾手遊智能反外掛服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章