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