在中國的游戲環(huán)境下芭梯,反掛已經(jīng)成為了游戲開發(fā)的重中之重,甚至能決定一款游戲的生死案怯,吃雞就是一個典型的案例。
目前參與了了一款動作射擊的MOBA類游戲的開發(fā)澎办,同步方案上選擇了幀同步技術(shù)(LockStep而非snapshots以下同)嘲碱。那么就有很多人擔(dān)心起來,客戶端會跑全部邏輯幀同步該如何反外掛局蚀,和狀態(tài)同步有什么區(qū)別呢麦锯?
首先我們來分析一下手游的風(fēng)險和外掛的分類,這里推薦騰訊游戲安全中心的文章琅绅,有著非常詳細(xì)深入的介紹扶欣。
手游的風(fēng)險:
????? 靜態(tài)修改文件:將游戲解包修改資源 ,配置,代碼等之后再重新打包
????????○ 修改資源料祠,例如替換游戲的貼圖做廣告骆捧,修改玩家碰撞資源 或刪除部分關(guān)鍵資源使玩家可以作弊等
????????○ 修改代碼,直接修改游戲代碼髓绽,實現(xiàn)無敵凑懂,免CD,無限傷害等等
????????○ 修改配置梧宫,修改策劃配表等
????? 動態(tài)篡改邏輯:通過注入和鉤子的方式接谨,在游戲運(yùn)行時修改游戲代碼,修改游戲內(nèi)存等
????????○ 修改代碼塘匣,運(yùn)行時注入進(jìn)程直接修改游戲代碼或者鉤住關(guān)鍵邏輯函數(shù)修改邏輯脓豪,實現(xiàn)無敵,免CD忌卤,無限傷害等等
????????○ 修改內(nèi)存扫夜,例如燒餅,葫蘆俠等修改器驰徊,在游戲運(yùn)行時修改堆棧和全局變量等
????? 游戲協(xié)議
????????○ 篡改游戲協(xié)議笤闯,直接修改協(xié)議的內(nèi)容,修改結(jié)算結(jié)果棍厂,修改傷害數(shù)值颗味,修改血量等等
????????○ 重復(fù)游戲協(xié)議,例如多次重復(fù)傷害協(xié)議
????? 其他牺弹,按鍵精靈浦马。腳本宏,盜號张漂,惡意發(fā)言晶默,打金工作室等,這些和同步技術(shù)無關(guān)航攒,暫不做詳細(xì)討論
外掛的分類 :
從上文可以看出外掛的主要方式還是修改客戶端的資源磺陡,代碼,和內(nèi)存漠畜。因此反外掛的手段也不外乎以下幾種:
????? 服務(wù)器計算關(guān)鍵邏輯币他。例如一些MMO戰(zhàn)斗邏輯泡在服務(wù)端
????? 服務(wù)器驗證客戶端邏輯。包括通過完整戰(zhàn)斗邏輯驗證和數(shù)值范圍驗證盆驹,例如早期的酷跑(可能誤殺牛逼的玩家)
????? 包體加密加簽名加驗證圆丹,防止破解包體。例如一些第三方加固躯喇,Unity的MonoDll加密辫封,代碼混淆等
????? 加密本地保存的一些文件硝枉。例如對加密PlayerPrefs文件
????? 加密和擾動運(yùn)行時內(nèi)存中關(guān)鍵數(shù)據(jù)(例如血量數(shù)據(jù)等)。例如崩3等
????? 防注入檢測(殺死注入進(jìn)程或者發(fā)現(xiàn)注入之后殺死自己)
????? 虛擬機(jī)加密
????? 加速檢測倦微,防止修改本地時間的變速齒輪
????? 穿墻檢測妻味,客戶端對關(guān)鍵碰撞做校驗
????? 集成守護(hù)進(jìn)程以及守護(hù)進(jìn)程的自我加密更新
????? 鼠標(biāo)宏,按鍵精靈等進(jìn)程檢測欣福,防止玩家使用這些工具
????? 增加舉報系統(tǒng)查證封號
????? 通過暴力機(jī)關(guān)嚴(yán)厲打擊外掛制作者(個人感覺非常有效)
????? 其他
但很遺憾责球,因為理論上再牛逼的客戶端也是可以破解的,所以客戶端的東西都是不可信任的拓劝。就像市面上也有很多第三方的加固工具雏逾,反作弊插件等,但不管用什么eye郑临,什么火眼精睛栖博,該作弊的還是作弊。因此反外掛的核心還是在于是否服務(wù)器是否計算了關(guān)鍵邏輯厢洞,就像Unreal老大說的The Server Is The Man仇让。而和同步技術(shù)和客戶端是否跑完整邏輯關(guān)系不大(嚴(yán)格說是有一點關(guān)系)。不管是狀態(tài)同步還是幀同步躺翻,只要做到了服務(wù)器有完整邏輯并驗證丧叽,絕大部分外掛都可以防掉(例如鎖血掛,穿墻掛公你,加速掛等)踊淳。
對于狀態(tài)同步來說關(guān)鍵邏輯在服務(wù)器的比重越高反外掛就越完美。最極端的例子就是就是云游戲省店,服務(wù)器計算所有邏輯和畫面嚣崭,客戶端只是顯示圖像,基本上杜絕了所有其他外掛(除了按鍵精靈懦傍,鼠標(biāo)宏,手速掛等可以模擬玩家操作芦劣,捕捉像素計算操作粗俱,只能通過進(jìn)程檢測,舉報虚吟,法律打擊等其他方案)寸认。
而對于幀同步來說,我們同樣可以在服務(wù)器驗證完整的戰(zhàn)斗邏輯串慰。一般分為兩種:
????1. 實時驗證偏塞。例如戰(zhàn)斗實時運(yùn)行戰(zhàn)斗邏輯和客戶端不斷同步驗證關(guān)鍵數(shù)據(jù)的hash,和狀態(tài)同步類似邦鲫。但這種方案服務(wù)器負(fù)載較高灸叼,運(yùn)維成本高昂神汹;
????2. 離線驗證。這是幀同步的優(yōu)勢古今,戰(zhàn)斗結(jié)束后服務(wù)器收集整場的操作序列屁魏,然后加速播放戰(zhàn)斗(幾十上百倍),最后校驗結(jié)果捉腥,例如刀塔傳奇氓拼。這個好處是服務(wù)器不用實時跑戰(zhàn)斗,只需在結(jié)束時花幾百ms即可驗證一場戰(zhàn)斗抵碟,大幅降低服務(wù)器成本桃漾。
如果是這種驗證方式幀同步也一樣能防掉絕大部分外掛,但是會多一個弱點就是全圖掛拟逮。因為客戶端有了所有玩家的位置信息撬统,所以無法防掉全圖掛。
那么如果這么說唱歧,只要服務(wù)器跑邏輯就行了宪摧,為什么外掛還這么泛濫呢?其實因為種種原因很多游戲服務(wù)器并沒有完整的邏輯和校驗颅崩,對于絕大部分游戲使用狀態(tài)同步來說有以下一些原因:
????1. 性能問題几于。服務(wù)器運(yùn)行完整邏輯開銷很高(特別是一些復(fù)雜運(yùn)算,例如物理彈道等)沿后,因此將部分邏輯放在客戶端分布運(yùn)算
????2. 因為開發(fā)效率和開發(fā)能力的限制沿彭。例如開發(fā)技能,如果所有邏輯都在客戶端開發(fā)就會簡單很多尖滚,響應(yīng)也非常及時喉刘。如果要涉及服務(wù)器和客戶端同步,就會多很多工作量特別是一些位移技能漆弄,很多邏輯可能還要寫兩份(幀同步更高效更容易實現(xiàn)打擊感也是這個原因睦裳,很多動作游戲,MOBA游戲也會選擇幀同步)
????3. 經(jīng)驗問題撼唾。一些公司在反外掛上經(jīng)驗不足重視程度不夠廉邑,特別是國外游戲環(huán)境較好法律健全
????4. 為了極致的體驗。例如為了降低網(wǎng)絡(luò)延遲倒谷,很多游戲會讓客戶端預(yù)表現(xiàn)和加入延遲補(bǔ)償蛛蒙,在一定范圍內(nèi)信任客戶端(特別是FPS游戲,狀態(tài)同步在延遲感上有較優(yōu)勢)
????5. 為了弱網(wǎng)體驗渤愁。為了讓玩家在網(wǎng)絡(luò)極差甚至斷線的情況下也能玩牵祟,將絕大部分邏輯都放在客戶端
????6. 多種原因混合,其他一些個別問題抖格。
但是以上的問題對于幀同步來說不也一樣嗎诺苹?如果為了成本和快速開發(fā)咕晋,服務(wù)器不跑邏輯不也一樣抓瞎嗎?其實幀同步會更簡單一些筝尾。對幀同步來說有以下幾種情況:
????1.基于RelayServer多人PVP捡需。這種會相對簡單很多,因為每個客戶端都計算了完整邏輯筹淫,作弊玩家修改的只是本地數(shù)據(jù)無法影響其他玩家站辉,只能自嗨。最終結(jié)果服務(wù)器只要簡單的比較投票就可以找到作弊者损姜,除非作弊的玩家多余非作弊的玩家并且作弊玩家還要修改一樣的數(shù)據(jù)(有點比特幣算力的意思:)饰剥,另外也可以在游戲運(yùn)行時不斷生成關(guān)鍵數(shù)據(jù)的hash碼,隨時校驗摧阅;
????2.基于P2P的多人PVP汰蓉。和RS差不多但是無法防主機(jī)作弊了,參考魔獸爭霸棒卷,但網(wǎng)游基本不會使用顾孽;
????3.雙人PVP和單機(jī)。這就沒辦法了比规,只能服務(wù)器做校驗若厚;
綜上所述,因為天然的客戶端強(qiáng)一致性蜒什,總體來說幀同步在防外掛上甚至?xí)唵我恍▍⒖纪跽邩s耀)涝开。但成也蕭何敗也蕭何关拒,正因為這個機(jī)制的問題骑丸,無法完全防住全圖掛发魄,也因此甚至有MOBA游戲,同時使用兩種同步機(jī)制來保證線上賽和線下賽的公平和體驗钞瀑。