對于一個要上線的游戲,防外掛是必須的,歷史上因為外掛而造成大量玩家流失的游戲數(shù)不勝數(shù)。隨著游戲研發(fā)技術(shù)的發(fā)展,對外掛的預(yù)防業(yè)內(nèi)其實做的已經(jīng)越來越好了。下面總結(jié)一下防外掛的基礎(chǔ)知識,以及我們的移動模塊為防外掛做了哪些工作。
1、預(yù)防外掛的基礎(chǔ)知識
在做外掛預(yù)防工作之前,我們要先了解外掛有哪些。根據(jù)我的了解,市面上常見的外掛主要有以下幾種:
· 修改客戶端的內(nèi)存信息
這類外掛通過分析游戲所使用的內(nèi)存,找到內(nèi)存中的變量去分析猜測變量是代表的什么含義。由于客戶端本身保存著很多游戲信息,比如技能cd、移動速度等。由于我們游戲技能的管理和發(fā)起是由客戶端控制的,若外掛能去把技能cd改為了0,客戶端就可以無限放此技能。
常見外掛工具:葫蘆俠、八門神器
· 加速齒輪
加速齒輪可以加速某一個進(jìn)程的時間流逝速度,通過加速齒輪,可以讓游戲客戶端進(jìn)程的時間加速N倍。真實時間可能只過了1s,而客戶端進(jìn)程的時間已經(jīng)過了Ns。通過加速齒輪,可以讓人物移動速度加快、技能cd加速等。
常見外掛工具:加速齒輪
· 重發(fā)、篡改同步消息
此類外掛可以截獲客戶端發(fā)送給服務(wù)器的消息,然后進(jìn)行篡改或者重發(fā)。比如可以截獲一個釋放技能消息,然后再無限重發(fā)給服務(wù)器,服務(wù)器若沒有驗證,就會無限執(zhí)行技能。
常見外掛工具:WPE三件套(eg+wpe+ccp)
· 腳本自動模擬點擊
這類外掛對游戲破壞相對較小,但是也最常見。這種外掛比較普遍,對游戲的影響主要是看游戲機(jī)制。比如我一個哥們弄了20多臺手機(jī),用按鍵精靈刷傳奇世界手游的金幣,然后賣給其他玩家。但是對于不能自由交易的游戲,就不會出現(xiàn)這種問題,最多是導(dǎo)致玩家自己使用,從而可以24小時在線,縮短了游戲壽命。
常見外掛工具:按鍵精靈(我感覺這東西都已經(jīng)產(chǎn)生了一條產(chǎn)業(yè)鏈...
防外掛是一個系統(tǒng)工程,需要不同的模塊配合實現(xiàn)。而且,對于不同的游戲?qū)ν鈷斓念A(yù)防要求也是不同的,具體游戲需要具體分析。
常見的外掛預(yù)防手段有以下幾種:
· 進(jìn)程檢測
游戲開始時檢測手機(jī)正在執(zhí)行的進(jìn)程,若發(fā)現(xiàn)某個進(jìn)程在黑名單上,則不能進(jìn)入游戲。這種方式可以預(yù)防市面上常見的外掛,對于不常見的或者新開發(fā)的外掛則束手無策。若游戲不火沒人玩,這個手段就夠了。希望大家都能遇到針對自己游戲?qū)iT開發(fā)的外掛,哈哈。
· 行為統(tǒng)計分析
把玩家的行為(常常是點擊行為)記錄下來并進(jìn)行分析。這種方式可以輔助檢測玩家是否使用按鍵精靈這種工具。
· 內(nèi)存、通信加密
之前介紹了外掛可能修改內(nèi)存或者篡改同步消息以達(dá)到他們的目的,若我們對客戶端的內(nèi)存信息和通信信息加密,外掛拿到了信息也不能分析,從而也就無從下手了。
· 舉報
moba游戲或者fps這種對抗性的游戲中,玩家使用外掛對手能明顯感知到。對于這種游戲,舉報機(jī)制是一個很有用的防外掛手段。
· 驗證碼
夢幻就有這個模式。
以上介紹的通用方法并不能解決所有的外掛問題,因此我們在游戲的邏輯實現(xiàn)過程中要需要做對應(yīng)的防外掛機(jī)制。
在游戲邏輯實現(xiàn)中進(jìn)行防外掛的基本方法是:
· 服務(wù)端保存驗證信息
· 收到客戶端發(fā)來的消息后,對消息的合法性進(jìn)行驗算。
在具體的游戲執(zhí)行邏輯中增加防外掛機(jī)制的時候需要秉持一些原則:
· 保證外掛收益不抵支出
這個有兩層含義,一層含義是要讓外掛使用者無法獲得收益;另一層含義是,若外掛使用者只能通過非常麻煩復(fù)雜的工作才獲得一些小小收益,那么這種情況我們可以放過,也就是說不需要對所有的情況都需要增加防外掛邏輯。
· 不影響游戲性能
在增加防外掛邏輯的時候,需要考慮為了防外掛增加的性能開銷。若因為防外掛增加了巨大的性能開銷,那么往往是不值得的。這種情況可以考慮不要在邏輯里面放外掛,而且是通過其他方式。
· 區(qū)分什么是不可信的,什么是可信的。
∩信的不需要驗證,不可信的選擇性驗證。在我們游戲里面,所有客戶端發(fā)送的消息都認(rèn)為是不可信的,所有服務(wù)端發(fā)起的調(diào)用都是可信的。比如在下面介紹的移動模塊防外掛機(jī)制,當(dāng)服務(wù)端的其他模塊比如機(jī)關(guān)模塊通知我的移動模塊瞬移,這種情況我不考慮機(jī)關(guān)模塊是否可能是被外掛操作了,我認(rèn)為都是可信的。當(dāng)然這個機(jī)關(guān)可能是被客戶端操作,那么這時候客戶端是不是用了外掛應(yīng)該是由機(jī)關(guān)模塊來判斷和驗證。
下文以玩家在客戶端操作自己的單位移動為例,介紹移動模塊為了防外掛做了什么工作。
之前寫過技能模塊的防外掛內(nèi)容,大家可以閱讀 《技能模塊的防外掛機(jī)制和同步機(jī)制優(yōu)化》
2、移動模塊如何防外掛
我們游戲的移動同步邏輯的基本原理是:單位在主控端(玩家自己的客戶端)根據(jù)玩家輸入執(zhí)行移動邏輯,然后將位置點以及時間信息以一定的頻率發(fā)送給從端,服務(wù)端以及其他客戶端根據(jù)主控端發(fā)來的移動同步信息模擬、預(yù)測、糾正單位的位置。
基于以上同步機(jī)制,移動模塊需要考慮三種外掛情況:
主控客戶端偽造或篡改瞬移消息。
主控客戶端修改本地內(nèi)存中的移動速度。
主控客戶端使用加速器。
2.1防止客戶端發(fā)送非法瞬移消息
由于我們游戲所有的移動都是在主控客戶端發(fā)起和執(zhí)行,然后服務(wù)端跟隨,所以瞬移也是客戶端先執(zhí)行,然后通知服務(wù)端。
為了保證客戶端不能發(fā)送非法瞬移消息,我們將瞬移流程定義為:由服務(wù)端發(fā)起、客戶端執(zhí)行、服務(wù)端再驗證。
瞬移邏輯如下圖所示:
服務(wù)端發(fā)起瞬移,但是并不將單位移動到對應(yīng)位置,而是將瞬移信息發(fā)送給客戶端。
⊥戶端收到位移信息后,將單位移動到對應(yīng)位置。
⊥戶端發(fā)送一個瞬移消息給服務(wù)端,服務(wù)端收到后,將單位移動到對應(yīng)位置。
基于以上瞬移流程,可以比較簡單的實現(xiàn)瞬移防外掛功能。
服務(wù)端發(fā)送瞬移信息給客戶端時,記錄下來瞬移目標(biāo)的位置。
服務(wù)端收到客戶端的瞬移消息,進(jìn)行以下驗證:
若服務(wù)端沒有發(fā)送瞬移消息給客戶端,則瞬移非法。
若收到的瞬移位置與記錄的瞬移位置不同,則瞬移非法。
基于以上流程,可以保證瞬移雖然是客戶端執(zhí)行的,但是仍然由服務(wù)端發(fā)起和驗證。
2.2 檢測不合理的移動速度
對于移動邏輯,還需要防止一種外掛:改內(nèi)存中的移動速度。
對于這種外掛的預(yù)防,一般有兩種:
在客戶端通過一定的加密手段使玩家無法找到移動速度,從而無法改變。
服務(wù)端驗證。我們使用的是服務(wù)端驗證的方式。
服務(wù)端驗證的基本原理:
當(dāng)客戶端發(fā)來一個移動消息時,服務(wù)端根據(jù)此條消息和上一條消息可以計算出來兩消息之間的移動速度,然后根據(jù)服務(wù)端信息可獲得對應(yīng)時間的服務(wù)器認(rèn)為可以達(dá)到的 速度,比較后即可以驗證。
其中服務(wù)端如何獲得對應(yīng)時間的允許 速度是其中的難點。剛開始,我們使用的方式是記錄每次移動速度改變的時間和速度值,當(dāng)收到客戶端消息時,根據(jù)客戶端發(fā)送消息的時間去查該時間對應(yīng)的速度值。
但這里有一個問題:當(dāng)一個擊飛事件移動速度改為300,擊飛事件結(jié)束前又來了一個普通移動事件速度改為40,其實這時的移動速度其實是300,但根據(jù)我們的算法計算出來的是40.
因此,我們實現(xiàn)了一套基于改變移動速度事件的移動速度驗證機(jī)制。我們并不記錄速度改變得值,而是記錄速度改變事件的開始&結(jié)束時間和速度值,因此每次需要計算某時間對應(yīng)的速度時,根據(jù)速度改變事件的信息可以計算出準(zhǔn)確的值。
2.3 檢測加速器
游戲外掛最常見的就是加速器,在我們的游戲移動機(jī)制中,加速器可以讓客戶端的單位移動速度變快,而我們是將客戶端單位位置同步給服務(wù)端,若服務(wù)端沒有任何驗證,則服務(wù)端就會跟隨客戶端位置,加速器外掛就會生效。
加速器外掛的原理是加快的客戶端的時間流逝,因此,最簡單的方式是當(dāng)服務(wù)端收到同步消息時,從同步消息中拿出來客戶端發(fā)送消息的時間,若客戶端發(fā)送時間大于服務(wù)端當(dāng)前時間(會加一個閾值),則認(rèn)為是使用外掛。
游戲中有時間校準(zhǔn)機(jī)制,當(dāng)玩家短線重連時,客戶端和服務(wù)端會重現(xiàn)校準(zhǔn)時間,而校準(zhǔn)后的時間由于網(wǎng)絡(luò)延遲和網(wǎng)絡(luò)波動問題,可能出現(xiàn)各種情況,包括客戶端時間快于服務(wù)器時間。對于這種情況,會造成誤判。
為了解決這個問題,我分析了加速器的特點。加速器會導(dǎo)致客戶端時間持續(xù)不斷的加快,并和服務(wù)器的差距越來越大。因此,我們使用以下驗證機(jī)制,基本可以避免誤判:
若客戶端時間>服務(wù)端時間+[閾值],則[閾值] += (客戶端時間-服務(wù)端時間)
第1步重復(fù)n次,n是我們給客戶端出現(xiàn)異常的機(jī)會次數(shù),我們游戲n=2。
若客戶端時間>服務(wù)端時間+[閾值],則認(rèn)為客戶端是外掛。
通過這種方式,我們給客戶端一次或者多次機(jī)會,對于加速外掛,它會導(dǎo)致客戶端時間持續(xù)加速,最終使用掉所有的機(jī)會。而由于網(wǎng)絡(luò)波動導(dǎo)致的客戶端校準(zhǔn)后的時間快于服務(wù)端時間的情況,不太會使用掉所有的機(jī)會。
當(dāng)然,這種監(jiān)測方案理論上仍然存在誤判。但因為每次切換嘲都會重置,當(dāng)n=2時,經(jīng)測試分析出現(xiàn)的誤判情況極少。
若把n改成更大,會導(dǎo)致玩家進(jìn)入一個新嘲后,若加速倍率比較小,比如加速0.1倍,可以使用較長一段時間的加速外掛。
因此n的選擇和初始閾值的選擇都是一個權(quán)衡。
附:運維log可以檢測加速器外掛的使用,但log更多的是檢查,而不是預(yù)防。我們這里實現(xiàn)的是預(yù)防,保證玩家無法使用加速器獲得任何收益。
投稿郵箱:chuanbeiol@163.com 詳情請訪問川北在線:http://m.fishbao.com.cn/