मैं वैश्विक हाईस्कोर तालिकाओं के लिए झूठी स्कोर रिपोर्ट कैसे रोक सकता हूं?


44

ब्राउज़र और मोबाइल गेम्स में आमतौर पर वैश्विक हाईस्कोर टेबल होते हैं। उन तालिकाओं में 2,147,483,647 स्कोर होना भी आम है - जहां लोगों ने वेबसर्विस कॉल का पता लगाया है जो स्कोर की रिपोर्ट करता है और इसका उपयोग एक काल्पनिक स्कोर रिकॉर्ड करने के लिए करता है।

सरल पहेली खेलों के लिए, हम स्कोर-रिपोर्टिंग कॉल के साथ खिलाड़ी द्वारा किए गए हर कदम (और स्तर उत्पन्न करने के लिए उपयोग किए गए किसी भी यादृच्छिक बीज) के रिकॉर्ड को शामिल करके इसका बचाव कर सकते हैं। फिर पूरे खेल को सर्वर पर पुन: प्रस्तुत और सत्यापित किया जा सकता है।

हालांकि, यह जल्दी से पीएसी-मैन की तुलना में कुछ भी बड़ा हो जाता है।

इस तरह के धोखा को और कैसे रोका जा सकता है?


वैश्विक हाईस्कोर टेबल बनाने के लिए एक ही तकनीक का उपयोग करके आईफोन गेम के बारे में मेरा यह सटीक सवाल था।
deft_code 14

क्या आप वाकई रिप्ले भेजना सुनिश्चित करेंगे?
ओ ० '।

हाँ मैं निश्चित हूँ। :)
तेदेए

जवाबों:


9

आंतरिक प्रणाली जिसे हमने Moblox के लिए उपयोग किया था (बाद में OpenFeint के साथ बदल दिया गया) ने इस तरह काम किया:

  • सादे HTTP पर एक JSON संदेश भेजें (HTTPS नहीं)। सभी क्षेत्रों के एमडी 5-हैश के साथ-साथ एक जादुई स्ट्रिंग भी शामिल करें।
  • सर्वर पर, एक ही ऑपरेशन के साथ संदेश की अखंडता की जांच करें।

सिस्टम को क्रैक करने के लिए, आपको यह मैजिक स्ट्रिंग ढूंढनी होगी। यह रिवर्स इंजीनियरिंग के साथ संभव है, लेकिन दर्दनाक है।

OpenFeint, ScoreLoop और CocosLive सभी एक ही ट्रिक का उपयोग करते हैं, लेकिन HTTPS के साथ। लागू करने के लिए बहुत आसान है।


29
मैं काफी संदिग्ध हूं कि आपकी जादुई स्ट्रिंग को खोजने के लिए रिवर्स इंजीनियरिंग करना मुश्किल होगा।
काइलोटन

4
यह देशी C ++ में एक Android अनुप्रयोग है। कोई प्रतीक नहीं है, और न ही अच्छा डिबगर उपलब्ध है। इसलिए आप ARM कोड पढ़ सकते हैं, लेकिन इसे आसानी से ट्रेस नहीं कर सकते। कुंजी कई ऑपरेशनों द्वारा बनाई गई है ताकि सभी तार पर्याप्त न हों। यह सही नहीं है लेकिन काफी दर्दनाक है।
एलिस

3
एक मानक स्नातक अभ्यास, कम से कम अमेरिकी विश्वविद्यालयों में, y86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notor/Y86/… ) असेंबली कोड पढ़कर आपके द्वारा निर्मित रिवर्स-इंजीनियर पासवर्ड है ।

12
यह एक बहुत ही कमजोर तकनीक है, जो डेवलपर्स को सुरक्षा का बहुत गलत अर्थ देगी।
ओ ० '।


21

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

उदाहरण के लिए, एक एफपीएस में, हर मिनट आप पूछ सकते हैं "आपके पास कितनी मार है?", "सभी दुश्मन कहाँ हैं?", आदि यदि ग्राहक एक चुनौती के लिए उचित जवाब के साथ वापस नहीं आता है? समय की उचित राशि, वे धोखा दे रहे हैं।

बेशक, यह केवल तभी काम करता है जब खेल पूरे खेल सत्र के दौरान ऑनलाइन हो। चूंकि यहां लक्ष्य एक ऑनलाइन लीडरबोर्ड पर अपलोड करने में सक्षम होना है, मुझे लगता है कि यह उचित है - खिलाड़ी को गेम से बाहर न करें यदि वे गलत उत्तर देते हैं, तो उन्हें स्कोर सूची पर न दें।

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


10

आप शीर्ष स्कोर तालिका में उच्चतम परिणामों की निगरानी करके गालियों के सबसे प्रमुख झंडे को सीमित कर सकते हैं। आपके खेल के आधार पर, आपके पास एक "पूर्ण स्कोर" हो सकता है, जिसके ऊपर किसी भी स्कोर को धोखाधड़ी होना चाहिए। यदि नहीं, तो आप सबसे कम "असंभव स्कोर" की गणना कर सकते हैं; क्या खिलाड़ी प्रति सेकंड 10 शॉट खेल सकता है, खेल 1 मिनट तक चलता है, और प्रत्येक मारे गए दुश्मन की कीमत 100 अंक है? फिर 60,000 से अधिक का कोई भी स्कोर धोखाधड़ी का होना चाहिए।

आप कुछ मेटाडेटा के साथ भेजकर समस्या को कम करने में भी मदद कर सकते हैं; पूर्ण खेल इतिहास नहीं, जैसा कि आप वर्णन करते हैं, लेकिन सिर्फ घटक जो स्कोर बनाते हैं। कहो: स्कोर 60000, 500 दुश्मनों को मार डाला, और एक बोनस आइटम पकड़ा। फिर आप साधारण जांच कर सकते हैं। यह "अस्पष्टता के माध्यम से सुरक्षा" है, और इसलिए बिल्कुल भी सुरक्षित नहीं है, लेकिन यह हमलावरों के सबसे भोले को खत्म करने में मदद करता है।


यदि आप मेटाडेटा से मेल नहीं खाते हैं, तो आप किसी उपयोगकर्ता (संभवतः IP द्वारा) को ध्वजांकित कर सकते हैं। फिर अगर वे कोशिश करते हैं और एक अंक फिर से जमा करते हैं कि DOES में मेटाडेटा सही है, तो आप इसकी जांच कर सकते हैं, और संभवतः बस पूरी तरह से प्रतिबंध लगा सकते हैं। तुम भी वहाँ से एक विनम्र संदेश वापस भेज सकते हैं स्कोर अनुरोध सबमिट करें :)
एडम Harte

मुझे लगता है कि यह उत्तर स्वीकृत उत्तर से बेहतर है। बस यह पता लगाएं कि आपके खिलाड़ी अधिकतम कौन सी संख्या प्राप्त कर सकते हैं। कुछ भी अधिक, बस त्यागें।

6
इसलिए अगर एक खिलाड़ी जो किसी विश्वविद्यालय में जाता है, तो हर कोई नेटवर्क पर एक "धोखेबाज़" होता है
हल्ला

6

अंतत: आप केवल असंभव उच्च स्कोर पर ही शासन कर सकते हैं, क्योंकि बाकी (केवल परिभाषा के अनुसार) केवल एकरूप हैं, और इस प्रकार एक वैध (और भयानक) खिलाड़ी हो सकते हैं।

अन्यथा आपको obfuscation तकनीकों (जैसे एन्क्रिप्शन, और सिर्फ स्कोर से परे अन्य आँकड़े भेजना) पर निर्भर रहना होगा।

आप समय-समय पर स्कोर भी भेज सकते हैं क्योंकि खेल खेला जा रहा है, जो धोखा देने के लिए जटिलता का एक और स्तर जोड़ देगा - यानी सर्वर यह तय कर सकता है कि क्या खेल किसी विशेष स्कोर को वारंट करने के लिए लंबे समय से खेला गया है, और यह भी सुनिश्चित करें कि पर्याप्त मध्यवर्ती रिपोर्ट सुनिश्चित करें प्ले-टाइम के दौरान प्राप्त किया गया (बस इसे 100% न करें या घर के रास्ते पर सुरंग में जाने वाली ट्रेन का परिणाम होगा कि मेरे फोन को खिड़की से बाहर फेंक दिया जाए)।

अंततः किसी को इसे तोड़ने का एक तरीका मिल जाएगा, इसलिए उन्हें रोकने की कोशिश करने के लिए खुद को मत मारो।


6

मैंने थोड़ी देर पहले एक परियोजना में एक त्वरित / गंदे उच्च अंक तालिका को जोड़ा और इंटरनेट सुरक्षा / आदि में निपुण नहीं होने के कारण यह त्रुटिपूर्ण था। आश्चर्यजनक रूप से, लगभग 1,200,000 रिकॉर्ड किए गए अंकों के साथ, मैंने बोर्ड के शीर्ष पर पहुंचने वाले धमाकेदार गलत अंकों के बैचों के केवल 5 या 6 अवसरों को प्राप्त किया है। अधिकांश स्कोर भी खेल में एक गड़बड़ की तरह लग रहे थे, एक सच्चे "हैकिंग" की तुलना में।

इसलिए मुझे लगता है कि एक महत्वपूर्ण बिंदु यह है: सुनिश्चित करें कि आपके खेल की स्कोरिंग प्रणाली वायुरोधी है , या कम से कम कुछ अच्छा स्कोर स्कोर करने योग्य जांच कर रहा है; अब, मैं जिस खेल के बारे में बात कर रहा हूं, वह एक लुडम डेयर 48hr प्रविष्टि थी, इसलिए यह सबसे स्थिर चीज़ नहीं थी .. लेकिन पूरे पर मुझे लगता है कि यह अक्सर अधिक संभावना है कि आकस्मिक खिलाड़ी की तुलना में एक इंची ग्लिच की खोज / शोषण होगा। किसी को सीधे लीडरबोर्ड को "हैक" करना।

उस ने कहा, मैं अभी इस परियोजना के पुनर्लेखन पर काम कर रहा हूं, और मैं ऑबफ्यूजन के साथ बाहर जा रहा हूं। मैं बहुत अधिक विस्तार में नहीं जाऊंगा, लेकिन मेरे पास मूल रूप से सभी स्कोर यादृच्छिक मूल्यों और हैशिंग और एक जादू स्ट्रिंग के गुच्छा के आधार पर एक महत्वपूर्ण मूल्य प्रस्तुत करते हैं, फिर कोई भी स्कोर जो उस चेक को पास करता है और वास्तविक बनाने के लिए पर्याप्त है " शीर्ष X "लीडरबोर्ड को सत्यापन के एक और दौर से गुजरना पड़ता है (इस बार सर्वर समाप्ति पर उत्पन्न समाप्ति कुंजी के साथ, और अधिक संपूर्ण व्यवहार्यता जांच)।

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

हुह, यह थोड़ा लंबा हो गया, लेकिन उम्मीद है कि यह मदद करता है ...


निश्चित रूप से है। एक नमकीन हैश की तरह लग रहा है जाने के लिए एक अच्छा तरीका है। मैंने यह नहीं माना था कि वे एक ही वैध स्कोर को कई बार भेजेंगे। एक GUID और पैकेट में शामिल टाइमस्टैम्प (और हैश में) उस पर भुगतान किया जाना चाहिए - मैं सर्वर पर डूप के लिए जांच कर सकता हूं। धन्यवाद।
तेयदेय

3

मैं इस क्षेत्र में विशेषज्ञ नहीं हूं, लेकिन अगर मैं आप थे, तो मैं आपके कोड में एक कुंजी के साथ स्कोर को एन्क्रिप्ट करने का प्रयास करूंगा। उन लोगों को वेब-सेवाओं के लिए उपयोग किए जाने वाले सादे पाठ के बजाय अपने कोड पर रिवर्स इंजीनियरिंग लागू करने की आवश्यकता होगी।


2
मैं और भी आगे जाता हूँ। Exe फ़ाइल (या इसका हिस्सा) हैशिंग द्वारा कोड से एक हैश उत्पन्न करें। जब स्कोर भेजते हैं तो संस्करण संख्या भेजते हैं और सर्वर एक तालिका का उपयोग करके मान्य कर सकता है जिसमें सरल स्थिरांक संस्करण संख्या-> हैश कोड होता है। फिर आपको जोड़ा बोनस मिलता है कि अगर कोई कार्यक्रम को संशोधित करके धोखा देता है, तो उसका उच्च स्कोर नहीं गिना जाएगा।
विन्यासकर्ता

7
यदि कोई इस कार्यक्रम को संशोधित कर रहा है, तो वे पहले से ही जो भी कुंजी चाहते हैं भेज सकते हैं।

2
@ जो Wreschnig, वे अपनी पसंद की कोई भी कुंजी भेज सकते हैं, लेकिन सर्वर को केवल मान्य कुंजी स्वीकार करने के लिए सेट किया जाना चाहिए।
अटैकिंगहोबो

5
मुझे लगता है कि जोया का कहना था कि उन्हें नए संशोधित कार्यक्रम के हैश का उपयोग करने की आवश्यकता नहीं है, लेकिन जो पिछले हैश था, उसे भेज सकते हैं।
काइलोटन

1
@ gd1: यह कैसे मदद करता है?
काइलोटन

1

स्पीडरुन मूल रूप से प्रत्येक कीस्ट्रोक की रिकॉर्डिंग कर रहे हैं, और वे एक व्होल गेम के बारे में रिकॉर्डिंग कर रहे हैं। तो, हाँ, आप पूरे खेल को रिकॉर्ड कर सकते हैं, यह अक्षम्य नहीं है। रिवर्स इंजीनियरिंग के माध्यम से ऐसा करने का कोई अन्य तरीका है (मैं इसे पर्याप्त तनाव नहीं दे सकता: आप सुरक्षा नहीं जोड़ रहे हैं, आप अस्पष्टता जोड़ रहे हैं)।

फिर भी, अगर आप इसे इस तरह से करते हैं तो वे वास्तव में एक स्पीड्रन जमा कर सकते हैं। आप इसे रोकने के लिए कुछ नहीं कर सकते।


2
आमतौर पर प्लेबैक, रिकॉर्डिंग नहीं, वह हिस्सा है जो सर्वर के लिए अनम्य है। यदि क्लाइंट कुछ घंटों के लिए गेम खेल रहा है, तो सर्वर-साइड का पुनरुत्थान कई सीपीयू-मिनट या इससे भी बदतर हो सकता है। यदि आप बहुत से लोगों को स्कोर जमा कर रहे हैं तो यह वास्तव में स्वीकार्य नहीं है।

2
डेटा पैकेट का आकार मोबाइल गेम के लिए एक मुद्दा बन जाएगा - खासकर अगर खिलाड़ी बाइट द्वारा अपने बैंडविड्थ के लिए भुगतान करता है।
तैत्तिरीय

ओह, तुम दोनों जो कहते हो वह सच है। फिर भी, कोई अन्य "वास्तविक" समाधान नहीं है।
ओ ० '।

11
आपको प्रस्तुत की गई प्रत्येक रिकॉर्डिंग को मान्य नहीं करना है, आपको बस उन लोगों को मान्य करना है जो इसे शीर्ष 10 में बनाते हैं। # 11 बनने के लिए बहुत अधिक धोखा नहीं है। और आपको इसे रियल टाइम में करने की जरूरत नहीं है। समय-समय पर बैच प्रक्रिया ठीक होगी।
ग्रे

@teedyay खिलाड़ी प्रति सेकंड औसतन 5 क्रिया करता है, और प्रत्येक क्रिया को 32 बिट्स में पूरी तरह से वर्णित किया जा सकता है। यह 20 बाइट्स प्रति सेकंड या 72 kB प्रति घंटा है। संयुक्त राज्य अमेरिका में सामान्य मोबाइल डेटा की कीमत $ 10 प्रति जीबी या 1 प्रतिशत प्रति 1000 kB है।
डेमियन येरिक

1

जब आप इस पर होते हैं, तो यह सवाल होता है कि क्या एक उच्च स्कोर केवल एक खिलाड़ी है जिसे एक शोषण मिला है (उदाहरण के लिए, यदि खेल में कुछ चीजें एक स्कोर पेनल्टी देती हैं, और बग एक नकारात्मक स्कोर को "चारों ओर लपेटने" का कारण बनता है) अत्यधिक सकारात्मक बनने के लिए ... या बस एक खिलाड़ी जो बोर्ड पर एक सुरक्षित स्थान की तरह एक निश्चित खेल की स्थिति पाता है, जहां वे बस वहां बैठ सकते हैं और अनिश्चित काल तक हारने की चिंता नहीं करनी चाहिए)।

हैक और गेम के बीच के अंतर को बताने के लिए, कम से कम कुछ डेटा को अपलोड करना अच्छा होगा। यह आपको कम से कम कारनामों को ठीक करने में मदद करेगा।

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


1

एक बीज से सभी यादृच्छिकता की उत्पत्ति करें और हर फ्रेम के लिए इनपुट स्टोर करें। जब भी आपके पास दावा किया गया उच्च स्कोर (शीर्ष 50 कहते हैं), सर्वर पर बीज और पूर्ण इनपुट भेजें। यदि आप उच्च स्कोर प्राप्त करते हैं तो सर्वर पर गेम को फिर से चलाएँ और लीडरबोर्ड को अपडेट करें।

यदि आप अनुरोध के आकार के कारण अधिक परिष्कृत खेलों के लिए इस पर विचार नहीं करते हैं, तो इस उदाहरण पर एक नज़र डालें।

मान लें कि गेम में 8 बटन इनपुट (1 पैड और 4 बटन) हैं और यह 60fps पर चलता है। एक घंटे के गेम इनपुट को बिना संपीड़न के 3.6KB के साथ प्रेषित किया जा सकता है। आपके सत्र में संभवतः एक घंटे से भी कम समय होगा और संपीड़न को बहुत कम करना चाहिए, क्योंकि मानव इनपुट में अतिरेक है।

चुनौती गेम को नियतात्मक, रिकॉर्ड किए गए इनपुट से खेलने योग्य और सर्वर पर निष्पादन योग्य बना रही है।


0

इससे पहले इसे कभी लागू नहीं किया गया लेकिन ...

टाइमस्टैम्प के साथ स्कोर बढ़ाएँ। यह आपको यह देखने के लिए एक लॉग देता है कि हाईस्कोर के "गति" का पता लगाने के लिए कितनी बार स्कोर में सुधार हुआ है।

फिर आप अपने स्कोर के लिए मील के पत्थर / मानदंड निर्धारित करेंगे।

उदाहरण के लिए: किसी गेम के पहले 20sec में 20,000 से अधिक का स्कोर नहीं आ सकता है। 250,000 से अधिक का स्कोर 200,000 से अधिक प्रविष्टि के बिना नहीं आ सकता है।

यह बिल्कुल गेम स्टेट भेजने जैसा नहीं है, लेकिन इसके करीब है।

साइड बेनिफिट: इस से आपको प्राप्त होने वाले सभी उपयोगी गेम खेलने के आँकड़े के बारे में सोचें। उसके लिए कोई अच्छा पैसा देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.