क्या आप हाट डैश पर धोखा देने का एक तरीका देखते हैं?

Dec 17 2020

इसे भी देखें: हैट डैश व्हाइट हैट हॉल ऑफ फेम और लीडरबोर्ड रिफ्रेश

अद्यतन २०२१-०१-१३ : सभी बाउंटीज़ को इस पद पर (अन्य पद पर) पुरस्कृत किया गया, भाग लेने के लिए धन्यवाद!

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

इसलिए, यदि आप (इस सवाल के जवाब में) सफलतापूर्वक धोखा देने का एक तरीका दोहराते हैं, तो इस तरह से स्कोर बोर्ड पर दिखाई देता है (और पहले से ही मेरी चीजों की सूची में नहीं है, जैसे कि बाहर देखने के लिए वह व्यक्ति जिसने 20 सेकंड में 999K स्कोर किया), या धोखा देने का पता लगाने के लिए पहले से ही एक नया प्रभावी अनुमान लगाने का सुझाव देता है, तो मैं निम्नलिखित कार्य करूंगा:

  • अपने जवाब को एक इनाम (गंभीरता के आधार पर TBD मान) दें
  • आपको हैट डैश लीडरबोर्ड के नीचे एक चिल्लाओ

धोखा देना = या तो एपीआई के प्रत्यक्ष हेरफेर के माध्यम से, या कुछ क्लाइंट पक्ष जो आपको गेम को वास्तव में कूदने और इस तरह के बिना काम करने में मूर्ख बनाने की अनुमति देता है।

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

जवाब

38 Zoethe1337Princess Dec 17 2020 at 05:31

हां मैं करता हूं!

प्रक्रिया काफी सीधे-आगे है। के लिए चला गयाhttps://winterbash2020.stackexchange.com/run-with-the-hatsसीधे, और hd.min.jsक्रोम डीबगर के साथ cdn.sstatic.net JS फ़ाइल खोली ।

(एक्सेसिबिलिटी कारणों के लिए, मैंने टेक्स्ट में लाइन नंबर शामिल किए हैं। ध्यान दें कि ये विशुद्ध रूप से हैं कि क्रोम ने फाइल को सुशोभित करने के लिए कैसा महसूस किया है, और पहले से ही एफएफ और क्रोम के बीच भिन्न है)

सबसे पहले, मैंने यहां एक ब्रेकप्वाइंट जोड़ा (पहले उल्लेखित जेएस फाइल की लाइन 526):

... हालाँकि यह व्यर्थ हुआ, मैंने शुरुआती समय को बदल दिया। मुझे और क्रोम के डिबगर ने थोड़ा संघर्ष किया, जो शायद इस्तेमाल किए गए 67 सेकंड के बहुमत के लिए जिम्मेदार है। मुझे बाद में नोटिस का समय यहां मौजूद है, इसलिए मैं बाद में इसे संशोधित करने में सक्षम हो सकता हूं। मैंने प्रारंभ समय को संशोधित किया और 90000 घटाया, हालांकि मुझे संदेह है कि इसका कोई प्रभाव नहीं था। यह संशोधन मानक डिबगिंग सिस्टम का उपयोग करके कंसोल में किया गया था। -=जब मैंने इसे संशोधित किया तो शायद भूल गए । / श्रग

दूसरे, मैंने यहां एक ब्रेकप्वाइंट जोड़ा (पहले उल्लेखित जेएस फाइल की लाइन 629):

वह जगह है जहाँ मज़ा शुरू होता है। मैंने distanceRanवेरिएबल को केवल 9 मिलियन से टकराया क्योंकि ऐसा क्यों नहीं हुआ। इसे जारी रखने के लिए क्रोम से लड़ने के बाद (यह थोड़ा छोटा है, संभवतः एक फ्लैटपैक विरूपण साक्ष्य, जो पूरी तरह से मेरी गलती है, स्पष्ट होने के लिए), कोड ने निष्पादन जारी रखा और स्कोर जमा किया।

मैंने .trigger("gameStarted/gameEnded")फ़ंक्शन का उपयोग करने की कोशिश की , लेकिन यह कुछ भी नहीं करता है। एक्सएचआर अनुरोध को संशोधित करने की कोशिश की (एक और ब्रेकपॉइंट के साथ - फ़ायरफ़ॉक्स के "एक्सएचआर पर ब्रेक") के सौजन्य से, लेकिन ऐसा लगता है कि मान्यता ने मुझे दोनों समापन बिंदुओं को मारने के बावजूद बाहर रखा।

26 Zoethe1337Princess Dec 17 2020 at 06:09

राउंड 2, क्योंकि यह वास्तव में मजेदार है: डी

तीन अन्य उत्तरों के समान रेखा के साथ, यहां हम फिर से जाते हैं। यह AFK विकल्प है, और बहुत अधिक केवल समय की आवश्यकता है। हास्यास्पद स्कोर हासिल किया जा सकता है।

  1. डिबगर खोलें
  2. खेल शुरू करने के लिए कूदें, और हवा में रहते हुए, निष्पादन को रोकें
  3. सांत्वना this.config.GRAVITY = 0,।

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

स्कोर से संतुष्ट होने पर, खेल को फिर से बंद करें और कॉल करें this.gameOver()। बग के कारण जब GRAVITY0 पर सेट किया जाता है, तो गेम को रोकने का एकमात्र तरीका मैन्युअल रूप से फ़ंक्शन को कॉल करना है। एक बोनस के रूप में, जब तक आप कुछ प्रकार की छेड़छाड़ की जाँच नहीं करते, यह जाँच नहीं की जा सकती। समय और स्कोर उम्मीद के मुताबिक बढ़ता है, केवल वास्तविक अंतर के साथ जिसे मुझे गेम खेलने की आवश्यकता नहीं है।

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

18 fredley Dec 18 2020 at 02:33

हाँ, हमेशा के लिए!

यदि आप लीडरबोर्ड के शीर्ष पर हैं, तो लगातार जांच करने के लिए मैंने एक स्क्रिप्ट लिखी है, और यदि आप वहां कोई अंक जमा नहीं करते हैं।

मुझे लगता है कि यह दूसरों की तरह ही मूल दृष्टिकोण है, लेकिन मैंने जो भी किया था वह स्रोत कोड को कम से कम करना था, इसे थोड़ा अनुकूलित करें, और इसे एक टैब में छोड़ दिया।

लगभग आंकड़े प्राप्त करने के लिए, मैं अपने वांछित स्कोर और सेकंड सेट करके शीर्ष पर पहुंच गया, वर्तमान नेता से एक से अधिक करने के लिए।

जिस्ट - इस दौड़ को छोड़ दें, और यह देखने के लिए लगातार जांच करेंगे कि क्या आप लीडरबोर्ड से ऊपर हैं। यदि आप नहीं हैं, तो यह उन्हें शीर्ष स्थान पर दस्तक देने के लिए एक गेम चलाएगा, फिर चेकिंग पर वापस लौटें।

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

16 Zoethe1337Princess Dec 17 2020 at 23:02

राउंड 4! मैं कल से ऐसा करना चाहता हूं लेकिन यह पता नहीं लगा सका कि कैसे। और यह बिल्कुल एक्सएचआर अनुरोध नहीं है, लेकिन मैं आपको एक बेहतर काम करूंगा।

इस खेल में एक विशाल दोष है: बाधाएं शानदार गेंडा से डरती नहीं हैं! तो उह, हाँ, मैंने आपके लिए अपना खेल तय किया: पी भी एक अफवाह बिल्लियों को सुना और इकसिंगें सहयोग कर रही हैं ।

कई कीड़े इस बग का परीक्षण करते समय गेंडा स्वतंत्रता की लड़ाई में इकसिंगों में शामिल हो गए

(यह तब वापस आया जब मुझे लगा कि हर 200ms पर्याप्त है, लेकिन जैसे-जैसे खेल में तेजी आई, यह आराम के बहुत करीब पहुंच गया, इसलिए मैंने इसे हर 10ms पर टक्कर दी)

var intv2 = setInterval(() => {
    Runner.instance_.horizon.obstacles = []
}, 10);

और जब आप जीतने के लिए तैयार हों, clearInterval(intv2);

हालांकि किसी कारण से, मुझे यह विधि काम करने के लिए नहीं मिल सकती है यदि मैं 10k अंक से बहुत आगे जाऊं। यह निश्चित नहीं है कि, बहुत आक्रामक अमान्यता क्यों हो सकती है, या आपको लगा कि कोई भी व्यक्ति वैध रूप से उस उच्च स्कोर को प्राप्त करने वाला नहीं है: पी

इस लीडरबोर्ड प्रविष्टि को कम से कम मिला:

नोट: किसी कारण से, मैं केवल इस से काम कर सकता हूं https://winterbash2020.stackexchange.com/run-with-the-hats

बोनस: अब आप दौड़ के दौरान और टोपी के नीचे गेंडा खेतों में चला सकते हैं।

13 Spevacus Dec 17 2020 at 06:00

हां!

मैंने कुछ ऐसा ही किया जो ज़ो ने किया , मैंने क्रोम के डीबगर को खोल दिया। मैंने Runnerऑब्जेक्ट की खोज शुरू की और देखा कि आप distanceRanक्रोम कंसोल का उपयोग करके सीधे हेरफेर कर सकते हैं । यही मैंने अपने 2 वें स्थान के लिए किया। लेकिन आप बस Runner.instance_.distanceRanजो चाहें सेट नहीं कर सकते हैं ... यदि आप कोशिश करते हैं, तो यह 0.025 से गुणा हो जाता है (इसे 100,000 पर सेट करने से यह 2,500 तक कम हो जाता है) और मैं वास्तव में अनिश्चित क्यों था ... इसलिए मैंने इसे Runner.instance_.distanceRan = 100000 / 0.025सॉर्ट करने के लिए किया "पूर्ववत करें" और यह सही ढंग से मेरे स्कोर को सही ढंग से बदलने के लिए लग रहा था कि मैं मूल रूप से 100,000 क्या चाहता था।

मेरा दूसरा रन थोड़ा अलग था। जैसा कि ज़ो ने अपने उत्तर में बताया, एक gameOver()फ़ंक्शन है जिसे जब भी आप एक बाधा में कहते हैं, तब कॉल किया जाता है। यह अच्छा है ... इसलिए मैंने इसे ठीक करने की कोशिश की, Runner.instance_.gameOver = nullलेकिन जब मैंने बाधा डाली तो खेल ही दुर्घटनाग्रस्त हो गया। इसलिए, इसके बजाय, मैंने इसे एक रिक्त functionउपयोग के लिए सेट किया, Runner.instance_.gameOver = function() { /*nothing*/ }जिसने मुझे लगातार हारने के बिना बाधाओं में दौड़ने दिया।

हालाँकि, समस्या यह थी कि अब मैं इस खेल को समाप्त नहीं कर सकता था और इस प्रकार मैं जो भी हास्यास्पद स्कोर हासिल करने में सफल होता, उसे मैं दूर कर देता और खुद ड्रिंक पकड़ लेता। इसलिए मैंने js फ़ाइल से फ़ंक्शन की सामग्री की प्रतिलिपि बनाई और gameOverफ़ंक्शन को अपनी पिछली सामग्री पर वापस सेट किया और इसने मुझे गेम को समाप्त करने दिया ... क्रूरता, मैं जोड़ सकता हूं। मैं इतनी तेज़ी से आगे बढ़ रहा था कि मैं अपने आप को बचाने की कोशिश नहीं कर पा रहा था । मैंने अपने स्कोर को 50k पर सेट करने का फैसला किया, हालांकि लीडरबोर्ड पर दूसरी बार मेरे अगले रन-थ्रू पर।

11 Ollie Dec 17 2020 at 05:58

धोखा देने का एक सुंदर तरीका मिला, एक जिसे आप रात भर छोड़ देते हैं।

प्रजनन के चरण:

  1. पर जाएं सलाम के साथ भागो पेज, कहीं भी राइट क्लिक करें और "तत्व का निरीक्षण"।
  2. "कंसोल" टैब पर क्लिक करें।
  3. इस कमांड को कंसोल में कॉपी करें और हिट Enterकरें var original = Runner.prototype.gameOver:।
  4. इस आदेश को छोड़कर, चरण # 3 के साथ भी ऐसा ही करें Runner.prototype.gameOver = function (){}:।
  5. अगली पंक्ति में, f (){}Enter दबाने के बाद दिखाई देना चाहिए। मुझे पूरा यकीन है कि यह करता है, उस gameOverफ़ंक्शन को प्रतिस्थापित किया जाता है जिसे यूनिकॉर्न एक खाली फ़ंक्शन ( f (){}) के साथ एक बाधा को हिट करता है , इसलिए मेरा यूनिकॉर्न वर्तमान में पट्टा से ठीक है।
  6. Runner.prototype.gameOver = originalसामान्य वापस जाने और अपने उच्च स्कोर को पोस्ट करने के लिए कंसोल में कमांड को कॉपी और पेस्ट करें (रोकने के लिए एक सेकंड लग सकता है)।
11 Zoethe1337Princess Dec 17 2020 at 18:46

राउंड 3, क्योंकि मैंने आपको निश्चित गुरुत्वाकर्षण देखा था, इसलिए मुझे इसे फिर से तोड़ने का तीव्र आग्रह था। import antigravity, क्या मैं सही हूँ? : पी

यह कुछ हद तक गतिशील प्रणाली है, क्योंकि यह हमेशा किसी भी कारण से, लगातार व्यवहार नहीं करता है। मैं कुछ स्कोर में मिल गया है, हालांकि यह प्रयोग।

इसके अलावा एक 30k था, लेकिन किसी कारण से एक सर्वर द्वारा खारिज कर दिया गया था। पूरी तरह से यकीन नहीं है कि वहाँ क्या हुआ था, लेकिन यह इस विधि के लिए समय पर ठीक से परिष्कृत नहीं किया जा सकता है।

इस बग के परीक्षण में कई यूनिकॉर्न को मुक्त किया गया। #SaveTheUnicorns

दूसरे प्रयास की तरह, खेल शुरू करने के लिए कूदें, निष्पादन को रोकें, कंसोल खोलें।

this.tRex.config.DROP_VELOCITY = 0
this.tRex.config.GRAVITY = 0
this.tRex.config.INITIAL_JUMP_VELOCITY = -100

मेरे परीक्षण में, इसमें कुछ विविध सफलताएँ हैं। कुछ मामलों में, गेंडा गायब हो जाता है। अन्य मामलों में, यह बंद हो जाता है और बस वापस नीचे नहीं गिरता है, और अभी भी कुछ बाधाओं की सीमा में है। इस स्थिति में, गेम को फिर से रोकें, सेट करें DROP_VELOCITY = -1। खिड़की पर ध्यान केंद्रित करना है और वेबसाइट को छुआ नहीं जा सकता है, लेकिन मुझे लीडरबोर्ड पर एक और 2.4k मिला है।

नकारात्मक सेट करने के बाद DROP_VELOCITY, आपको उड़ने के लिए फिर से जुडना पड़ सकता है , लेकिन यह फिर से शुरू होने पर भी कायम रहता है, इसलिए राउंड 1 को विफल करना, फिर से शुरू करना और राउंड 2 से दूर उड़ना आसान है।

पहले विकल्प की स्थिति में (गेंडा गायब हो जाता है), मेरे पिछले उत्तर का अंतिम गुरुत्व विराम चरण अभी भी लागू होता है; जब स्कोर से खुश हों, तो निष्पादन और this.gameOver()कंसोल में रोकें । यह खेल को रोकना चाहिए और स्कोर जमा करना चाहिए।

10 iBugsaysReinstateMonica Dec 19 2020 at 16:59

चलो जावास्क्रिप्ट ही हैक!

चरण 1. संसाधन ओवरराइड स्थापित करें

Microsoft Edge (क्रोमियम-आधारित) पर भी काम करता है।

अस्वीकरण : मैं इस क्रोम एक्सटेंशन से संबद्ध नहीं हूं।

चरण 2। Microsoft Visual Studio कोड खोलें (या अगर आपको पसंद है तो JetBrains WebStorm)

यहां से एक जावास्क्रिप्ट फ़ाइल प्राप्त करें: https://cdn.sstatic.net/Winterbash/js/hd.min.js। इसे कहीं बचा लो।

अनुशंसित : आसान नेविगेशन के लिए कोड पर एक फ़ॉर्मेटर (जैसे VSCode Prettier ) का उपयोग करें ।

अस्वीकरण 2 : मैं Microsoft VSCode या JB WS से संबद्ध नहीं हूं, और न ही मैं VSCode Prettier एक्सटेंशन से संबद्ध हूं।

चरण 3. चरण 2 से आपके द्वारा डाउनलोड की गई जावास्क्रिप्ट फ़ाइल को संपादित करें

मान लें कि आपने फ़ाइल को प्रीमिट कर दिया है, तो निम्न कोड लाइन 126 पर होना चाहिए:

function s(n, t, i, r, u, f, e)

इस फ़ंक्शन पर जाएं (Pro Tip: Search s(with match पूरे शब्दों को चालू करें), और निम्नलिखित कथन देखें:

this.xPos = r.WIDTH + (e || 0);

फ़ाइल (e || 0)को बदलें 0और सहेजें।

चरण 4. ओपन रिसोर्स ओवरराइड

बोलचाल की भाषा में, मैं इसके बाद आरओ के रूप में इस विस्तार का उल्लेख करूंगा।

  • Add Ruleदाईं ओर क्लिक करें

  • चुनें URL → File, एक नई लाइन के तहत दिखाई देगा

  • इसे URL बार में दर्ज करें:

    https://cdn.sstatic.net/Winterbash/js/hd.min.js?*
    
  • Edit FileURL बार के दाईं ओर का चयन करें , और चरण 3 से संपादित फ़ाइल पेस्ट करें। Save & Closeनीचे-दाईं ओर चुनें।

चरण 5. हट डैश पर जाएं और पृष्ठ को रीफ्रेश करें। खेलना शुरू करें

RO आपके द्वारा संपादित संस्करण के साथ JS को बदल देगा। अब कोई बाधा नहीं होगी।

चरण 5.1। कुछ समय तक प्रतीक्षा करें जब तक आप एक वांछित अंक प्राप्त नहीं कर लेते। अपने ब्राउज़र के अलावा किसी और चीज़ पर स्विच करें।

यह खेल को वर्तमान स्कोर पर समाप्त कर देगा। मज़े करो!

8 Ollie Dec 17 2020 at 06:10

इससे भी तेज रास्ता। मेरे अन्य धोखा विधि से सभी चरणों को कॉपी करें , लेकिन इस बार, एक और कमांड दर्ज करें Runner.instance_.setSpeed(10000):। यह यूनिकॉर्न की गति का रास्ता क्रैंक करता है। यह वास्तविक रूप से त्वरित रूप से लाइन से छलांग लगाएगा, इसलिए आपको इसे लुढ़कने के लिए ऊपर तीर को दबाने की आवश्यकता है।

Uni रियर-एंड की बाधाओं को देखने के इच्छुक लोगों के लिए, बस इस लाइन को जोड़ें Runner.instance_.setSpeed(-1):।

8 double-beep Dec 17 2020 at 23:10

नोट: नए एंटी-चीटिंग ह्यूरिस्टिक्स के साथ, यह उत्तर अब काम नहीं करता है। एक कार्य विधि के लिए इसे देखें ।


TL; DR:

(async () => {
    Runner.gameStarted();
    Runner.setCurrentScore(someScore);
    await new Promise(resolve => setTimeout(resolve, seconds * 1000));
    Runner.gameEnded();
})();

someScoreऔर उसके secondsअनुसार बदलें ।


इसे हाथ से करें

यह वह विधि है जिसके साथ मैंने धोखा दिया, बाद में मुझे एहसास हुआ, यह बिल्कुल ऊपर दिए गए कोड के टुकड़े के समान है।

सबसे पहले, मैंने देखा कि POSTखेल शुरू होने और समाप्त होने पर कुछ अनुरोध किए जाते हैं: /hat-dash/startऔर /hat-dash/end

  • पहला अनुरोध एक पैरामीटर भेजता है startedAtजो एक समय है (युग के बाद से मिलिस)। प्रतिक्रिया एक महत्वपूर्ण कुंजी है {"auth":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}:।

  • दूसरे अनुरोध में कई पैरामीटर हैं:

    • startedAt: एक समय, यह पिछले अनुरोध के समान होना चाहिए।
    • score: खेल के कुल अंक।
    • authKey: पिछले अनुरोध में आपके द्वारा प्राप्त की गई कुंजी।
    • durationMs: मिलीसेकंड में खेल की अवधि।
    • कई histKeys[]पैरामीटर्स जो नवीनतम सहित पिछले कई कीज़ को पकड़ते हैं , संभवतः से प्राप्त किया जाता है localStorage। यदि आप अपना देखना चाहते हैं, तो दौड़ें localStorage.getItem('Game_AuthKeys').split('|');

तब यह बहुत आसान था:

  1. एक छोटा गेम खेलें, ताकि ये अनुरोध किए जाएं।

  2. नेटवर्क टैब पर जाएं → नवीनतम /hat-dash/startअनुरोध पर राइट-क्लिक करें → कॉपी → कॉपी के रूप में प्राप्त करें। कंसोल में पेस्ट करें और बदल "body": "startedAt=xxxxxxx"दें "body": "startedAt=" + new Date().getTime()

  3. कुछ सेकंड के लिए प्रतीक्षा करें, ताकि बाद में आपके द्वारा दर्ज किया गया स्कोर वास्तविक लगे और याकोव 😇 को नोटिस न करे।

  4. अगला, नवीनतम /hat-dash/endअनुरोध की प्रतिलिपि बनाएँ और:

    • startedAtपिछले /hat-dash/startअनुरोध से प्राप्त करें और उसे पहले की तारीख के साथ बदलें (नेटवर्क → अनुरोध → स्क्रॉल जब तक आप फॉर्म डेटा नहीं देखते हैं)।
    • जो आप चाहते हैं, उसके साथ स्कोर को बदलें।
    • authKeyपिछले अनुरोध की प्रतिक्रिया से आपको प्राप्त मूल्य से बदलें ।
    • बदलें ...&durationMs=xxxxx...करने के लिए ...&durationMs=" + (new Date().getTime() - previousStartedAt) + "...
    • बाकी histKeys[]अपरिवर्तित छोड़ दें , केवल &histKeys%5B%5D=newestAuthKeyस्ट्रिंग के लिए संलग्न करें।
5 hiineedhelp Dec 18 2020 at 23:00

जावास्क्रिप्ट को संपादित करने के बजाय, POSTअनुरोध क्यों नहीं भेजें ? (अपने ब्राउज़र के कंसोल में कॉपी और पेस्ट करें)

var startedAtNow = Date.now();
var authkey = "";
var n = {};
$.ajax({ type: "POST", url: "hat-dash/start", data: { startedAt: Date.now() }, dataType: "json", success: function(t) { authkey = t.auth }, error: function(n) { console.log("error starting game"); console.log(n) }, done: function() { this.pendingGameStart = null } }) function doend() { $.ajax({
      type: "POST",
      url: "hat-dash/end",
      data: {
          startedAt: startedAtNow,
          score: Number(6942069420), // You can change this
          authKey: authkey,
          durationMs: 12345, // You can change this
          histKeys: localStorage.getItem("Game_AuthKeys").split("|")
      },
      dataType: "html",
      success: function(t) {
          authkey = null;
          n.pendingGameEnd = !1;
          n.pendingGameStartedAt && ($.ajax({ type: "POST", url: "hat-dash/start", data: { startedAt: Date.now() }, dataType: "json", success: function(t) { authkey = t.auth }, error: function(n) { console.log("error starting game"); console.log(n) }, done: function() { this.pendingGameStart = null } }))(); $(".js-stats-data").remove();
          $(".js-personal-stats").append(localStorage.getItem("Game_AuthKeys"))
      },
      error: function(n) {
          console.log("error ending game");
          console.log(n)
      }
  })
}
setTimeout(doend, 12345); // 12345 should be >= durationMs

मैं बस स्रोत कोड के माध्यम से चला गया और पाया। टिप्पणियां बताती हैं कि आपको क्या बदलना चाहिए। मैं आपको स्कोर के लिए यथार्थवादी समय निर्धारित करने की सलाह दूंगा।

मूल रूप से, score: Number(x)जो स्कोर आपको मिलता है, वह वह स्कोर है जो आप चाहते हैं। durationMs: yकब तक तुम चाहते हो चलाने के लिए, y मिलीसेकंड की संख्या जा रहा है। इस तथ्य का अनुकरण करने के लिए setTimeout(doend, z)कुछ और मिलीसेकंड इंतजार करना चाहिए durationMsकि वास्तव में वास्तविक समय में रन हुआ था। बाकी कोड वास्तविक जावास्क्रिप्ट से लिया गया था । यह सिर्फ डेटा लेता है और इसे JQuery AJAX POST के माध्यम से स्टैक एक्सचेंज सर्वर को भेजता है।

प्रमाण:

5 Bergi Dec 19 2020 at 05:58

धन्यवाद हमें मज़ा आ रहा है :-)

यहाँ मेरा दृष्टिकोण है:

const origGameOver = Runner.prototype.gameOver;
Runner.prototype.gameOver = function() {
    if (this.runningTime > 133700) {
        this.lastSurrentScoreText = "9001";
        this.currentStartedAt = Date.now() - 133700;
        return origGameOver.call(this);
    }
}

मैं बाधाओं के साथ टकराना (बेशक, निश्चित रूप से!) रखता हूं, लेकिन जब तक मैं 133.7 सेकंड तक नहीं खेलूंगा, खेल खत्म नहीं होगा। अन्यथा मैं सामान्य रूप से खेल रहा हूं, जिसमें मूल कोड के साथ कुंजीपट इकट्ठा करने और मानक अनुरोध भेजने के लिए।

चूंकि बाधाएं क्लाइंट पर बेतरतीब ढंग से उत्पन्न होती हैं, इसलिए आपको सर्वर साइड पर इसका पता लगाने का मौका नहीं मिलेगा।

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

4 Ollie Dec 17 2020 at 06:43

आप इस कमांड का उपयोग भी कर सकते हैं:

Runner.instance_.distanceRan = 100000 / Runner.instance_.distanceMeter.config.COEFFICIENT

यूनिकॉर्न को एक विशिष्ट स्कोर से शुरू करने के लिए, इस मामले में, 100 भव्य।

4 KylePollard Dec 17 2020 at 11:23

मुझे यकीन नहीं है कि अगर आप कीबोर्ड की चीटिंग के साथ टैबलेट का उपयोग करने या मैकेनिकों के सिर्फ एक चतुर संयोजन पर विचार करते हैं, लेकिन मुझे लगा कि मैं इसे मामले में लिंक करूंगा:

https://meta.stackexchange.com/a/358130/718314

कीबोर्ड के साथ टचस्क्रीन पर गेम खेलने से गेम थोड़ा आसान हो जाता है क्योंकि फ्लाइंग डाउन एरो को कॉन्फ़िगर करना आसान हो जाता है।

(यदि यह धोखा है, तो मेरे अंकों को न मिटाएं! मैंने केवल अंतिम आधे घंटे में इसकी खोज की थी, इसलिए केवल मेरे सबसे हाल के रन इस eating के साथ किए गए थे। उनमें से कोई भी सभी समय लीडरबोर्ड नहीं बना था)

4 Hack5 Jan 03 2021 at 00:02

पहले मैंने l()गलत url ( /bam-me...) का अनुरोध करने के लिए फ़ंक्शन में एंटी-चीट कोड को संशोधित किया ताकि अगर मैंने कोई गलती की तो मुझे प्रतिबंधित नहीं किया जाएगा।

फिर, मैंने f ? (this.gameOver(), this.crashed || l('rewrote gameOver function')) : ...स्थिति को बदलने के लिए गेम को समाप्त करने के लिए कोड को बदल दिया ( ) f && !1- स्थिति को बदलने के लिए - इसका मतलब है कि अगर मैंने बाधा को मारा तो खेल को नहीं छोड़ा गया।

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

बेशक, उपरोक्त सभी मुझे पृष्ठ में कस्टम जेएस प्राप्त करने के लिए आवश्यक थे। ईवेंट हैंडलर्स को फिर से लोड करने के आसपास संभावित मुद्दों से बचने के लिए, मैंने एफएफ एक्सटेंशन 'रिक्वेस्ट इंजेक्टर' का इस्तेमाल किया, जिसने मुझे किसी भी अनुरोध के लिए प्रतिक्रिया बदलने की अनुमति दी। मैं निश्चित रूप से HTML को संशोधित करने के लिए एक स्थानीय फ़ाइल का उपयोग कर सकता हूं, लेकिन इससे सभी रिश्तेदार URL टूट गए, इसलिए पृष्ठ में उपयोग की गई संपत्तियां लोड नहीं हुईं और मैं गेंडा नहीं देख सका: '(और) का उपयोग करना। दूरस्थ HTML में स्थानीय JS फ़ाइल फ़ाइल के कारण विफल हो जाती है: /// URL सुरक्षा, इसलिए मैंने नया JS कोड होस्ट करने के लिए del.dog का उपयोग किया।

इसे ब्लॉक करने का मेरा सुझाव HTML में टैग में एक integrity=...विशेषता जोड़ना है <script src="sstatic...">, जिससे कम से कम लोगों को जेएस को संशोधित करने के लिए सभी रिश्तेदार यूआरएल को खोजने-बदलने के प्रयास में जाना होगा।

सर्वर सभी अनुरोधों को एक्सेस करने के लिए ब्लॉक कर सकता है /run-with-the-hatsजब तक कि उनके पास सही न हो Referrer, और उसके लिए एक क्लाइंट-साइड चेक को जेएस में भी जोड़ा जा सकता है document.referrer(यह उपयोगी है ताकि आपको अपने अनुरोध इंटरसेप्टर में अधिकतम पृष्ठों को डालना पड़े, जेएस को संशोधित करना अधिक कष्टप्रद है)

3 Tuqay Dec 22 2020 at 06:06

मुझे लगता है कि मुझे इसे उत्तर के रूप में नहीं लिखना चाहिए, लेकिन मुझे इसे लिखने के लिए कहीं और नहीं मिला। 2 दिन पहले मैंने जंपिंग स्पीड के साथ धोखा किया (यह अब तय हो गया है)। लेकिन मेरा स्कोर लीडरबोर्ड पर है:

मैं बस इसे हटा देना चाहता हूं

2 Gismo1337 Dec 19 2020 at 05:00

अभी, मैंने गलती से दबाकर ब्राउज़र टैब बदल दिया Space। मैं फिर से जुड़ गया और गेंडा चला गया। लेकिन खेल चलता है और आवाज देता है।

Google Chrome में, विंडोज 10 पर।

आप इसे यहां देख सकते हैं: https://youtu.be/8MZrcbZttHY

1 l-l Jan 05 2021 at 02:26

धोखा देने का एक सरल तरीका मिला जिसके लिए किसी कोडिंग की आवश्यकता नहीं है।

  1. खेल खोलें: टोपी के साथ चलाएँ
  2. खेलना शुरू करें और थोड़ी देर बाद, पृष्ठ को ज़ूम इन / आउट करें। इससे खेल रुक जाता है
  3. कुछ समय के लिए प्रतीक्षा करें और फिर खेल को फिर से शुरू करने के लिए जगह दबाएं। एक बार गेम फिर से शुरू करने पर आपका स्कोर अधिक होगा। (जितना अधिक आप इसे प्रतीक्षा करते हैं)
1 WBT Jan 06 2021 at 04:16

हाँ! मैं डिफ़ॉल्ट ईवेंट श्रोताओं और ऑब्जेक्ट्स को निकालने में सक्षम था, और क्लाइंट-साइड जावास्क्रिप्ट को संशोधित संस्करण के साथ अधिलेखित कर दिया। संशोधित संस्करण में एक अतिरिक्त रेखा है:

n.livesLeft = 1000;

(जहां मूल्य कुछ हद तक मनमाने ढंग से सेट किया जा सकता है) जो मैंने (फिर, कुछ हद तक मनमाने ढंग से) रखा

n.defaultDimensions = {
  WIDTH: y,
  HEIGHT: 150
};

और टकराव का पता लगाने वाले तर्क को बदल दिया

  if (f && ut(f, a, v), y) return [a, v]

साथ से

  if (f && ut(f, a, v), y)  {
    n.livesLeft--;
    if(n.livesLeft<=0) {
        return [a,v];
    }
  }

यह ज्यादातर काम करता है, लेकिन अंततः गेम एक बग को हिट करता है। विशेष रूप से, अद्यतन फ़ंक्शन में, एक पंक्ति है

this.currentSpeed < this.config.MAX_SPEED && (this.currentSpeed += this.config.ACCELERATION))

क्योंकि प्रारंभ और अधिकतम गति के बीच का अंतर डिफ़ॉल्ट एसीसीलेशन पैरामीटर का एक सटीक एकाधिक नहीं है, इससे अधिकतम से अधिक की गति हो सकती है। फिर, जब कूदते हैं, तो startJump () फ़ंक्शन MAX_SPEED के खिलाफ वर्तमान गति की जांच करता है और तेजी से कूदने के लिए ऑटोबैन चलाता है। इसके लिए फिक्स, जो मूल में होना चाहिए, उस सेगमेंट को बदलना है

(this.currentSpeed + this.config.ACCELERATION) < this.config.MAX_SPEED && (this.currentSpeed += this.config.ACCELERATION))

हालांकि स्क्रिप्ट संशोधनों में ऑटोबैन कोड को बेअसर करना संभव है, ऐसा करना कड़ाई से आवश्यक नहीं होना चाहिए, खासकर बगफिक्स के बाद।

इस संशोधन के साथ, आपको अभी भी गेम खेलना है, और आपका अंतिम स्कोर इस बात से संबंधित होगा कि आप कितना अच्छा खेल रहे हैं। अंतर सिर्फ इतना है कि यह पहली टक्कर पर गेम नहीं है; खेल खत्म होने से पहले आपके पास कितनी टक्कर हो सकती है, यह काफी क्षमा करने वाला है।

मुझे यकीन नहीं है कि इस तकनीक को वर्तमान वास्तुकला और सर्वर को भेजे गए जानकारी की मात्रा के साथ आसानी से बचाव किया जा सकता है।

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

Anonymous Dec 22 2020 at 07:44

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

function Number(n) {
  return 1000000;
}