2016-03-28 38 views
6

我正在爲我的遊戲實施基本(僅針對小子)反作弊。我爲每個移動數據包都包含一個時間戳,並在服務器端對這些數據包之間的時間差異進行完整性檢查。根據處理速度每x秒循環

我還包括一個數據包,它根據處理速度每5秒發送一個時間戳。但是這似乎是個人電腦滯後時的問題。

那麼,我應該使用什麼來檢查由於「速度黑客」而導致處理時間是否更快?在客戶端

我的電流回路速度檢查:

this_time = clock(); 
time_counter += (double)(this_time - last_time); 
last_time = this_time; 

if (time_counter > (double)(5 * CLOCKS_PER_SEC)) 
{ 
    time_counter -= (double)(5 * CLOCKS_PER_SEC); 

    milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch()); 
    uint64_t curtime = ms.count(); 

    if (state == WALK) { 
     // send the CURTIME to server 
    } 
} 

// other game loop function 

上面的代碼工作正常,如果客戶端PC不落後的,也許是因爲內存或CPU的問題。他們可能運行了太多的應用程序。

參考服務器端代碼:(GoLang)

// pktData[3:] packet containing the CURTIME from client 
var speed = pickUint64(pktData, 3) 
var speedDiff = speed - lastSpeed 
if lastSpeed == 0 { 
    speedDiff = 5000 
} 
lastSpeed = speed 

if speedDiff < 5000 /* 5000 millisec or 5 sec */ { 
    c.hackDetect("speed hack") // hack detect when speed is faster than the 5 second send loop in client 
} 
+0

我用VisualStudio2015 – majidarif

+0

@MikeMB不,我還沒有試過steady_clock – majidarif

+0

您的代碼發送給客戶端PC的'system_clock'時間 - 他們可能不同步其PC到任何引用(即使你有),在這種情況下,有即使沒有任何與負載有關的延遲,也可能是服務器時間和他們的時間之間的增量。你最好把他們的信息當作「心跳」 - 期待每個人都說最後10秒鐘。 –

回答

1

你的系統有一個致命的缺陷,這使得它容易規避的騙子:它依賴於客戶端提供的時間戳。你從客戶那裏收到的任何數據都可以被騙子操縱,所以它不能被信任。

如果你想檢查速度黑客在服務器上:

  1. 日誌的玩家當前位置化身不定期。根據服務器時間存儲每個日誌的時間戳。
  2. 通過計算距離並將其除以時間戳差值來測量兩個此類日誌條目之間的速度。

當速度大於玩家的速度限制,那麼你可能會有一個騙子。但請記住,滯後會導致突然的高峯,所以最好採用多個樣本的平均速度測量來檢測玩家是否在加速黑客行爲。這可能會讓速度檢測的可靠性降低,但這實際上可能是一件好事,因爲這會讓黑客更難了解他們使用的任何迴避方法的可靠性。

爲了避免誤報,請記住跟蹤任何人爲移動不遵守速度限制的玩家的任何人爲方式(如傳送到被殺死後產卵)。當發生這樣的事件時,當前的速度測量是沒有意義的,應該丟棄。

+0

是否有任何可用的來源可以以適當的方式提取樣本?開源遊戲也許? – majidarif

+0

您可以將結果存儲在某個時間範圍內(比如30秒),然後平均存儲您的結果。 –

+0

@majidarif所有你需要保存的是一個位置和一個時間戳。這不是真正的火箭科學。 – Philipp