2016-03-28 10 views
6

पर आधारित हर एक्स सेकंड लूप मैं अपने खेल के लिए एक मूल (केवल kiddies) विरोधी धोखाधड़ी लागू कर रहा हूँ। मैंने अपने प्रत्येक आंदोलन पैकेट में एक टाइमस्टैम्प शामिल किया है और उन पैकेटों के बीच के समय के अंतर के लिए सर्वर पक्ष पर सैनिटी चेक करता है।प्रक्रिया गति

मैंने एक पैकेट भी शामिल किया है जो प्रक्रिया गति के आधार पर हर 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 

कोड ऊपर ठीक काम करता है, तो ग्राहकों को पीसी राम या 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

आपका कोड ग्राहक पीसी 'system_clock' समय भेजता उपयोग कर रहा हूँ - वे किसी भी संदर्भ के लिए अपने पीसी को सिंक्रनाइज़ नहीं किया जा सकता है (भले आप) है, जो वहाँ के मामले में आपके सर्वर के समय और उनके बीच किसी भी लोड-संबंधित अंतराल के बिना भी एक डेल्टा हो सकता है। आप अपने संदेशों को "दिल की धड़कन" के रूप में मानने से बेहतर होंगे - प्रत्येक के भीतर अंतिम के 10 सेकंड कहें। –

उत्तर

1

आपका सिस्टम एक महत्वपूर्ण दोष जो यह धोखेबाज के लिए नाकाम करने के लिए आसान बना देता है है: यह ग्राहक द्वारा प्रदान टाइमस्टैम्प पर निर्भर करता है। क्लाइंट से प्राप्त होने वाले किसी भी डेटा को धोखेबाज द्वारा छेड़छाड़ की जा सकती है, इसलिए इसे भरोसा नहीं किया जाना चाहिए।

आप गति सर्वर पर हैकिंग के लिए जाँच करना चाहते हैं: अनियमित अंतराल पर

  1. लॉग खिलाड़ियों की वर्तमान स्थिति अवतार। सर्वर-टाइम के अनुसार प्रत्येक लॉग के टाइमस्टैम्प को स्टोर करें।
  2. दूरी की गणना करके और टाइमस्टैम्प-अंतर से विभाजित करके दो ऐसे लॉग-प्रविष्टियों के बीच की गति को मापें।

जब गति खिलाड़ी की गति सीमा से बड़ी होती है, तो आपके पास धोखेबाज हो सकते हैं। लेकिन ध्यान रखें कि अंतराल अचानक स्पाइक्स का कारण बन सकता है, इसलिए यह पता लगाने के लिए कि क्या खिलाड़ी गति-हैकिंग है, कई नमूने की औसत गति माप लेना बेहतर हो सकता है। इससे स्पीडहाक-डिटेक्शन कम विश्वसनीय हो सकता है, लेकिन यह वास्तव में एक अच्छी बात हो सकती है, क्योंकि यह हैकरों को यह जानना मुश्किल हो जाता है कि वे किसी भी चोरी के तरीकों का उपयोग कैसे कर रहे हैं।

झूठी सकारात्मक से बचने के लिए, उन गतिशील खिलाड़ियों के किसी भी कृत्रिम तरीके का ट्रैक रखना याद रखें, जो गति सीमा का पालन नहीं करते हैं (जैसे मारे जाने के बाद टेलीपोर्टिंग करना)। जब ऐसा कोई घटना होती है, तो वर्तमान गति माप व्यर्थ है और इसे त्याग दिया जाना चाहिए।

+0

क्या कोई उपलब्ध स्रोत है जो मैं नमूने लेने के उचित तरीके से संदर्भित कर सकता हूं? ओपन सोर्स गेम्स शायद? – majidarif

+0

आप अपने परिणामों को कुछ समय सीमा (30 सेकंड कहें) पर स्टोर कर सकते हैं, और फिर आपके द्वारा संग्रहीत औसत को औसत कर सकते हैं। –

+0

@ majidarif आपको बस सहेजने की ज़रूरत है एक स्थिति और टाइमस्टैम्प है। यह वास्तव में रॉकेट विज्ञान नहीं है। – Philipp

संबंधित मुद्दे