手遊防破解防外掛技術方案(二)服務端篇

 
因爲客戶端理論上老是能被人破解,因此全部客戶端都是不可信的,只有一個服務端是可信的。客戶端的邏輯不可信,客戶端發給服務端的數據也不可信。服務端做爲惟一可信的中心,須要去驗證客戶端端發來的數據是否真實可信,而後根據業務需求作一些處理。此外,客戶端和服務端的通訊信道可能被人截獲,因此通訊協議上要作加密處理。本文分如下幾小節:
- 通訊協議加密
- 帳號假裝
- 重放攻擊
- 異常數據斷定
- 一個案例
 

通訊協議加密

在網絡上傳輸重要的數據都不該使用明文,有不少工具能夠很容易地截取協議包,抓取和更改其中的數據,好比WireShark。對於長鏈接,使用TCP或UDP協議,數據會以明文方式存在於協議包中。對於短鏈接,http現在已不多使用,蘋果明確規定開發者須使用https,而非http,對於使用http協議的app會拒審。即便使用https,數據被網絡協議層作了加密,但仍不安全。最典型的一種攻擊是中間人攻擊,作法是攻擊者位於客戶端和服務端的中間,截獲任何一方發送的數據,處理後發給另外一方。對於客戶端來講,中間人假裝成了服務端。對於服務端來講,中間人假裝成了客戶端。中間人截獲到任何一方的數據,都用公鑰作一層解密,而後用本身的私鑰加密數據發送給另外一方。這種狀況下,咱們設計的全部通訊數據會被明文暴露給攻擊者。因此,不論使用什麼形式的鏈接以及哪一種網絡協議,都須要本身作一層通訊數據加密。
 
典型的方式是用對稱加密,客戶端和服務端協商好一個密鑰,能夠經過一個公用的邏輯生成,也能夠由服務端生成後傳輸給客戶端。根據共用的密鑰,一方對數據作加密後發送,另外一方獲取到數據後作解密。通過這樣處理後,攻擊者抓包後沒法簡單地獲取到解密數據。可是,因爲客戶端老是能被人破解,經過分析二進制代碼或dll中間代碼,動態調試等方法,就能逆向出加密解密的算法和密鑰。因此,咱們能作的就是增長破解的難度,一般有如下方法:
 
1 用加固加殼反調試等各類方式增長逆向客戶端代碼的難度。
2 密鑰不存明文,而是經過一個函數動態計算返回,函數名和實現都寫得儘可能難懂一些。更進一步,能夠必定程度犧牲代碼的可維護性,不把通用的加密解密算法封裝成函數,而是把邏輯分散到網絡相關的邏輯中,加大逆向難度。
3 密鑰常常更換,好比每一次鏈接用一個密鑰,或者一次客戶端啓動用一個密鑰,或者每個客戶端版本用一個密鑰。根據業務需求設計不一樣強度的密鑰邏輯。
4 原始數據最好不用文本格式,而用二進制,好比Protocol buffer。
 
通訊協議加密是防破解中重要的一環,一旦協議被人破解,攻擊者就能獲取原始數據製造進一步的危害。脫機掛就是其中一種,徹底捨棄了遊戲邏輯,只要實現全部通訊協議接口就能假裝成客戶端和服務端通訊。
 

帳號假裝

客戶端是徹底不可信的,因此服務端應校驗客戶端的真實性。通常遊戲,服務端會對每一個客戶端分配一個惟一標識符ID,以方便管理。攻擊者可能會改變本身的ID,從而把本身假裝成其餘玩家,而後修改或破壞其餘玩家的數據。不少攻擊者利用這種方式來幫助其餘玩家修改數據,從而牟利。因此,咱們得從機制上防止帳號假裝。一個解決方案是用token(或cookie)機制,大體流程爲:
 
1 客戶端登陸時,服務端回給客戶端一個token。該token是服務端根據用戶ID等重要信息加密後獲得。注意加密算法和密鑰僅保存於服務端,客戶端不知道,因此破解者沒法破解。
2 客戶端保存該token,之後發送任何請求,都帶上該token。
3 服務端響應客戶端後續請求時,先根據token和密鑰解密獲得用戶信息,與客戶端請求中的其餘信息好比用戶ID作對比,若不匹配,則校驗失敗,斷定客戶端不可信。
 
Token機制實現上的考慮:
1 token算好後是存入緩存,後續收到請求時直接從緩存取,仍是丟棄掉,每次請求時再算一遍。
2 token是否設置過時時間。
 

重放攻擊

重放攻擊是一種常見的攻擊方式。攻擊者截取網絡包,簡單地複製多份,重複發送給接收端,使得接收端誤覺得事件發生了屢次。客戶端和服務端均可能遭受這種攻擊。攻擊者能夠用這種方式實現各類效果,好比有限時間內屢次攻擊怪物,屢次下單購買商品,屢次獲取同一商品。解決方案通常有幾種:
 
1 自增ID。協議包包含一個自增ID字段,每發送一次自增一次。接收端收到包後,斷定ID是否和以前重複,或者增加量得太大,若是是則有重放攻擊的風險。這個方案實現簡單,但一旦網絡協議被破解,很容易繞過去。
2 隨機數。協議包包含一個隨機數字段,發送端和接收端都用隨機數生成器生成一連串隨機數,用一個buffer保存以前一段時間接收到過的隨機數。接收端收到包後,斷定隨機數是否在buffer內。更進一步,能夠斷定收到的隨機數是否在將來N個隨機數範圍內,以斷定網絡協議是否可能遭到了破解。
3 時間戳。協議包包含一個時間戳字段,接收端斷定收到的時間是不是過去時間且和如今時間有較大差值。通常會結合時間戳和隨機數,在秒級別的時間戳上拼接一個隨機數,若是有重複則有被重放攻擊的風險。
 

異常數據斷定

所謂道高一尺,魔高一丈。咱們作的不少防破解工做都是在提升破解門檻,增長破解難度,根本上很難防住全部漏洞。可是,在服務端咱們有一種從根本上解決問題的方式。任何一個被破解的數據,在數據上都會體現出一些規律。因此咱們能夠玩家的行爲數據上尋找線索和模式,以斷定該數據是否爲做弊玩家。
 
好比,玩家的攻擊力,攻擊頻率,遊戲貨幣的生成和消耗,各類道具的生成和消耗,都會符合咱們遊戲設計的一些規律,好比事件的產生不會超過必定頻率,某些數值的變化量每次不會超過一個閾值,某些數值的總量不會超過一個閾值,一些數據之間可能存在某種約束關係。咱們能夠記錄下這些關鍵數據和事件的消耗,上傳給服務端,由服務端的一個特定服務來批量處理這些數據,而後斷定玩家是否存在做弊行爲。
 
這些斷定不必定很是準確。在斷定的嚴格程度上,咱們寧肯漏掉一些做弊玩家,也不能把正常玩家誤判爲做弊玩家。能夠根據數據處理結果,把玩家標記爲幾個檔次:正常,嫌疑,做弊。肯定爲做弊的玩家能夠自動作警告,封號或清空數據等處理。對於嫌疑玩家,咱們不肯定他是否必定做弊了,就用人工再篩查一遍,並採起相對溫和的處理方式。爲了知足這些需求,咱們須要創建相對完善的後臺工具。
 

一個案例

淘寶上有不少賣遊戲破解的服務。好比有個比較流行的弱聯網遊戲《夢幻家園》的破解服務,能夠獲得上億金幣和獎盃。賣家提供的破解有兩種方式:
 
1 僞造客戶端
咱們只須要給破解者提供咱們設備的IDFA,破解者就能夠僞造該玩家的客戶端,上傳一個無限金幣的存檔。若玩家在系統設置裏設置了限制廣告標識符,則IDFA獲取爲0,這個方式就行不通。
2 僞造服務端
按照以下步驟:
(1)從破解者指定網站下載證書,將其添加到系統信任。設置wifi代理,填寫爲破解者提供的網址。
(2)進入遊戲,此時客戶端的網絡請求會發給破解者的後臺程序。破解者解包獲得玩家的存檔信息,而後修改成無限金幣,返回給客戶端。
(3)客戶端拿到了該存檔後,就已是無限金幣。刪除證書和代理,再進遊戲,連到官方服務器,金幣仍爲無限。
 
這兩種破解都須要徹底破解通訊協議,而這又是經過逆向分析徹底能作到的。該遊戲的開發商Playrix也作了必定防禦,當金幣改爲無限後玩一段時間,就會彈出警告框,提示檢測到您的數據出現異常,被限制參加各類聯網活動。這正是咱們前面提到的異常數據斷定方案。
相關文章
相關標籤/搜索