[ZZ]變速齒輪做者的文章--絕殺反外掛方案

 

  自從網絡遊戲誕生以來外掛就一直是網絡遊戲廠商頭痛的問題。因爲網絡遊戲服務器端的負荷很重,不能進行太多計算,只能把大量檢測外掛的工做放在網絡遊 戲的客戶端進行。可是外掛也老是能夠進行鍼對性的修改,使這些檢測失效。並且從某種意義上說,外掛使這些檢測失效比遊戲檢測這些外掛更容易。從目前的狀況 來看,在這場較量中彷佛也是外掛佔了上風。在這種狀況下游戲廠商不得不使用封號的辦法阻止玩家做弊,可是這又會形成玩家流失。有沒有一種能有很好的反外掛 效果,而外掛又沒法使這些檢測失效的反外掛方法方案?這就是本方案所能作到的。算法


首先介紹一下本方案的基本原理。一個網絡遊戲客戶端在運行時,從本質上說是一個從服務器接收數據,網絡遊戲客戶端根據這些數據,加上用戶鼠標鍵盤的輸入, 計算出向服務器發送的數據,並把這些數據發送給服務器的過程。記錄下一個客戶端從服務器接收到的數據、用戶鼠標鍵盤的輸入,以及這些數據在客戶端上被處理 的時間,就能計算出這個客戶端應向服務器發送的數據。在用戶沒有做弊的狀況下,即便在不一樣的客戶端從新計算,也仍然能獲得相同的結果。quake(雷神之 錘)、星際爭霸、cs(反恐精英)等遊戲的錄像功能使用的就是本原理。所以咱們只要比較兩個客戶端計算的結果,若是不相同,就能知道其中有客戶端做弊了。

因爲被檢驗的客戶端和檢驗它的客戶端都有可能做弊,例如檢驗它的客戶端有可能謊報被檢驗客戶端做弊,也可能謊報被檢驗客戶端沒做弊,所以兩端的做弊都必須防止。咱們先來看一下具體怎麼作。

一個網絡遊戲客戶端鏈接服務器時,同時也鏈接另外兩個用於對它進行驗證的遊戲客戶端。在服務器傳送給客戶端的數據中含有從服務器上發出的時間。客戶端把它 從服務器上接收到的數據D一、該客戶端上鼠標鍵盤的數據D2,以及這些數據在客戶端上被處理的時間D三、D4傳送給兩個用於驗證的遊戲客戶端。爲保證這些 數據不被修改,在傳送給驗證客戶端前,D一、D二、D三、D4使用RSA算法加密。驗證客戶端根據D一、D二、D三、D4計算出被驗證客戶端應向服務器發 送的數據D5和D5的CRC校驗D6,把D6傳送給服務器。爲防止被驗證客戶端在把D1傳送給驗證客戶端前修改D1的數據,驗證客戶端也要把D1的CRC 校驗D7傳送給服務器。服務器計算被驗證客戶端發送給它的的數據D8的CRC校驗D9,以及D1的CRC校驗D10。比較D九、D六、D十、D7,若是 不相同,就能夠知道有客戶端做弊了。

下面來看看上面的方案在各類狀況下是如何檢測出哪一個客戶端在做弊的。

假設被驗證客戶端在把D1傳送給驗證客戶端前修改D1,服務器只需比較D十、D7就能知道被驗證客戶端是否修改了D1。

假設驗證客戶端謊報D1被修改,在驗證客戶端向服務器報告此問題時,服務器將要求驗證客戶端把D1傳送給服務器。因爲D1使用RSA算法加密,驗證客戶端 根本沒法修改它,所以驗證客戶端是沒法謊報D1被修改的。對於驗證客戶端謊報D二、D三、D4被修改的狀況也與此相似。

假設被驗證客戶端使用加速外掛,因爲D1中含有服務器發送它的時間,這個時間減D3或D4後的值D11應該是一個恆定值。若是這個值變化超過必定範圍,例如兩秒,就能夠知道被驗證客戶端做弊了。

假設被驗證客戶端使用修改封包、內存、脫機等外掛,D九、D6一定不相同,因此只需比較D九、D6就能知道有客戶端做弊。

在發現有客戶端做弊後,服務器將要求驗證客戶端把D一、D二、D三、D4發送給服務器,由服務器計算被驗證客戶端應向服務器發送的數據D13。比較D八、 D13,若是不相同,就能知道是被驗證客戶端做弊。比較D五、D13,若是不相同,就能知道是驗證客戶端做弊。

假設被驗證客戶端爲了逃避驗證,不把驗證數據發送給驗證客戶端。對於這種狀況,若是兩個驗證客戶端在一段時間內都沒有收到驗證數據,服務器能夠斷開被驗證客戶端的鏈接。

假如被驗證客戶端由於驗證客戶端下線等緣由和驗證客戶端斷開了鏈接怎麼辦?只要另外一個驗證客戶端還能收到驗證數據,就不會有什麼影響。若是網絡帶寬容許, 甚至能夠考慮鏈接三個驗證客戶端。這樣即便有兩個驗證客戶端謊報收不到數據,仍然不會對被驗證客戶端產生影響。在驗證客戶端和被驗證客戶端鏈接斷開的狀況 下,咱們須要讓被驗證客戶端從新鏈接一個驗證客戶端。

應該如何從新鏈接一個驗證客戶端呢?對此須要每過必定時間,例如10秒,保存一次被驗證客戶端的狀態。在驗證客戶端和被驗證客戶端鏈接斷開時,被驗證客戶 端鏈接一臺新的驗證客戶端,把此狀態傳送給新的驗證客戶端。新的驗證客戶端根據此狀態,再加上被驗證客戶端傳送給它的D一、D二、D三、D4就能繼續計算 D5,從而繼續對被驗證客戶端進行驗證。若是被驗證客戶端和兩個驗證客戶端的鏈接都中斷了,咱們就須要中斷服務器和驗證客戶端的鏈接。對於服務器計算 D13的狀況也是同樣,只要根據被驗證客戶端的狀態,再加上D一、D二、D三、D4就能計算出D13 。

假如驗證客戶端老是不報告被驗證客戶端做弊,只要另外一個驗證客戶端工做正常就不會有影響。另外可讓一些客戶端故意傳送給它錯誤的數據,若是它沒有報告做弊,就可判斷出此驗證客戶端在做弊。

假如被驗證客戶端故意傳送給驗證客戶端沒法用RSA算法解密的數據,或者驗證客戶端故意報告被驗證客戶端傳送給它沒法用RSA算法解密的數據怎麼辦?服務器沒法區分這兩種狀況,因此只能做爲被驗證客戶端和驗證客戶端鏈接中斷來處理。

再來看一種狀況。假設外掛經過某種方法讓使用外掛的客戶端互相聯繫,而且聯合做弊怎麼辦?例如,一個使用了外掛的被驗證客戶端鏈接了兩個驗證客戶端,其中 一個驗證客戶端也使用了外掛,另外一個沒有。被驗證客戶端強行中斷與沒有使用外掛的驗證客戶端的鏈接,而另外一個使用了外掛的驗證客戶端卻又不向服務器報告被 驗證客戶端的做弊行爲。對此咱們能夠每過一小段時間,例如30秒,就要求被驗證客戶端改變它的兩個驗證客戶端。這個週期越短越好。在鏈接新的驗證客戶端 後,除了要求新的驗證客戶端驗證當前被驗證客戶端和服務器之間的通信外,還要求驗證以前30秒的通信。只要這時的兩個驗證客戶端沒有做弊,被驗證客戶端之 前30秒的做弊行爲就能被檢測出來。

本方案能夠檢測全部修改客戶端網絡輸入輸出數據的外掛,例如加速、修改封包、修改內存等。也不可能作出脫機外掛。在沒有源代碼的狀況下,脫機外掛要輸入和 輸出和原遊戲徹底相同的數據遠比廠家本身還難。若是這樣,外掛做者們不如寫遊戲賺錢了。目前國內外掛這麼多,跟這些外掛做者沒法經過正常的軟件得到收入也 有關係。並且遊戲每作一次小小的改動,外掛都得改得吐血。

本方案對於不修改客戶端對外輸入輸出流的外掛是沒法檢測。什麼狀況外掛不會修改客戶端網絡輸入輸出數據?有兩種狀況,一種是使用程序模擬用戶的鼠標鍵盤輸 入,另外一種是修改顯示。對於模擬用戶的鼠標鍵盤輸入的外掛,咱們能夠用網頁上經常使用的驗證碼的方式來對付。像網頁上那樣的驗證碼,人眼能夠很容易辨認出其中 的數字,但用軟件卻很難辨認出,所以外掛也就沒法工做。何況模擬鍵盤鼠標的外掛對遊戲的影響比加速、修改封包、修改內存、脫機等要小得多,所以被一些人稱 爲綠色外掛。對於修改顯示,傳奇外掛顯示人物血條的功能後來被廠商本身加入到遊戲中。而在魔獸世界中顯示血條的功能則是官方承認的插件,可見廠家對這種外 掛的承認。把牆體變成透明的一些程序,若是遊戲中沒有阻礙視線的牆體就沒有用處。在雷神之錘(QUAKE)或反恐精英(CS)中,把牆體變透明後,就能看 見牆後面的人,或者血和甲。這是由於在客戶端上實際有這些數據,只是在正常狀況下游戲不在屏幕上顯示出來。對此,咱們可讓服務器不把這些在正常狀況下玩 家看不到的東西的數據傳送給客戶端。

因爲本方案是即時的,因此在檢測到客戶端做弊後能夠當即斷開該客戶端的鏈接。這要比過後封號更容易讓用戶接受。因爲驗證客戶端須要把D一、D二、D三、 D4傳送給被驗證客戶端,因此每增長一個驗證客戶端,被驗證客戶端所需的網絡帶寬就須要增長大約0.5倍。可是一個不使用本方案的網絡遊戲實際所需的網絡 帶寬是不多的,一般在每秒1K字節左右,因此即便被驗證客戶端鏈接兩個驗證客戶端,所需的網絡帶寬也只有大約2K。並且一些對遊戲沒有影響的數據,例如玩 家在遊戲中的聊天,或者服務器發送的廣告等,不須要發送給驗證客戶端,所以所需的帶寬還能更少。

在本方案中已經假設了不少種外掛以及它們的抵禦方法。若是您認爲還有本方案中沒法抵禦的外掛,歡迎假設出這種外掛對本方案進行虛擬攻擊。您能夠 給我郵件或者到 遊戲玩家論壇發表您的方案。我將改進個人方案,以抵禦您的攻擊(若是我能作到的話)。若是對本方案有任何問題能夠 給我郵件或在 論壇上提出,我將在 個人主頁上給您解答。

本方案已申請專利。尋求業務合做以及投資。個人郵件地址是wangrong1000@hotmail.com 。服務器

不得不說該做者的思路很是的有創意.網絡

相關文章
相關標籤/搜索