मैं पूरी तरह से एकता में खिलाड़ी से तारों को कैसे छिपा सकता हूं और कैसे बचा सकता हूं?


47

मैं एक 2D गेम बनाने के लिए Unity का उपयोग कर रहा हूं जो पूरी तरह से ऑफ़लाइन होगा (जो कि समस्या है), गेम-प्ले को आपको कुछ स्तरों पर कुछ स्ट्रिंग्स में प्रवेश करने की आवश्यकता है और एकता DLL को संकलित करता है, जो आसानी से रिवर्स इंजीनियर हो सकता है, इसलिए वहाँ उन तार (खेल ऑफ़लाइन है ताकि मैं अन्य स्रोत से पुनर्प्राप्त नहीं कर सकता) की रक्षा करने का एक तरीका है?

खेल उन स्ट्रिंग्स पर बहुत निर्भर करता है, और हाँ मैं ओफ्फसकेशन से वाकिफ हूं लेकिन मैं कुछ और मजबूत करना चाहता हूं। और मुझे पता है कि आसान तरीका डेटा-स्रोत से सब कुछ ऑनलाइन करना होगा लेकिन मैं सोच रहा था कि क्या यह संभव है।

यह इस तरह से विघटित हो सकता है: यहाँ छवि विवरण दर्ज करें


10
जबकि मैं मानता हूं कि यह एक ऐसी लड़ाई है जिसे आप कभी नहीं जीत सकते, आप निश्चित रूप से थोड़े प्रयास से इसे और कठिन बना सकते हैं। obfuscar.codeplex.com
जैकब

46
@ गैब्रिएल हह? अपघटित सी-अपघटित सी # कोड के बारे में जितना आसान हो जाता है। आप इस तरह से बहुत अधिक पूरी तरह से पठनीय कोड प्राप्त करते हैं, तुलना करें कि आईडीए अनुकूलित सी या सी ++ कोड के लिए क्या उत्पन्न करता है। कहा कि पर्याप्त प्रयास के साथ देशी कोड को बस उतना ही समझा जा सकता है, लेकिन यह कठिन परिमाण के आदेश हैं। पता नहीं कितनी अच्छी तरह से काम करता है obfuscation - अगर यह सामान्य डिकंपाइलर्स (DotPeek, ILSS, कुछ और?) बनाता है तो IL कोड पर बारफ होता है जो कि आकस्मिक व्यक्ति को इससे दूर रखने के लिए एक बाधा का परिचय देना चाहिए।
Voo

15
@GabrieleVierti, एक DLL से पाठ को खींचना तुच्छ है: लिनक्स या सिगविन के तहत, आप इसे केवल stringsप्रोग्राम को इंगित करके कर सकते हैं ।
मार्क

31
वास्तव में आप यहाँ क्या करने की कोशिश कर रहे हैं? यह XY समस्या के एक गंभीर मामले की तरह लगता है। meta.stackexchange.com/questions/66377/what-is-the-xy-problem आप जो कुछ भी पूरा करने की कोशिश कर रहे हैं (गेमप्ले के नजरिए से, तकनीकी नजरिए से नहीं) इन तारों को छिपाने और एन्क्रिप्ट करने की कोशिश करके लगभग निश्चित रूप से सबसे अच्छा काम नहीं किया जाता है। ।
ग्रैंडऑपनर

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

जवाबों:


159

उन तारों को स्टोर न करें, उनमें से (क्रिप्टोग्राफिक) हैश को स्टोर करें।

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

आप कैसे जांचते हैं कि उपयोगकर्ता द्वारा दर्ज की गई एक स्ट्रिंग सही है? चूंकि आपको हैश से वैध स्ट्रिंग नहीं मिल सकता है, केवल एक चीज जो आप कर सकते हैं वह है उपयोगकर्ता के अनुमान को हैश करना और इसे सही एचएच से तुलना करना।

चेतावनी (एरिक लिपर्ट द्वारा): GetHashCodeऐसे फ़ंक्शन के रूप में निर्मित फ़ंक्शन का उपयोग न करें - इसका परिणाम विभिन्न .NET संस्करणों और प्लेटफार्मों के बीच भिन्न हो सकता है, जो आपके कोड को केवल विशिष्ट .NET फ्रेमवर्क संस्करणों और प्लेटफ़ॉर्म पर काम करता है।


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

4
इस। ठीक ठीक। यदि आप sha256 जैसे एल्गोरिथ्म का उपयोग करते हैं (कई पुस्तकालय हैं जो इसे लागू करते हैं ताकि आपको अपना खुद का लिखना न हो) तो आपके पास कुछ ऐसा होगा जो आसानी से नहीं टूट सकता है और बहुत विश्वसनीय है।
जॉनसन

12
@ मिचेल जॉनसन एक नमक का उपयोग करते हुए इंद्रधनुष की तालिकाओं का उपयोग करना बहुत कठिन बना देगा, और एक पासवर्ड हैश का उपयोग करते हुए bcrypt की तरह यह बहुत धीमी हो जाएगी और इसलिए तोड़ना कठिन होगा। लेकिन अंत में दिन के अंत में ऐसा लगता है कि जाने के लिए बहुत अधिक प्रयास करना पड़ता है; उपयोगकर्ता खेल खरीदा है, तो वे कहते हैं कि उनकी अपनी पसंद है धोखा देने के लिए चाहते हैं
Melkor

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

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

106

आप जो करने की कोशिश कर रहे हैं वह निरर्थक और निरर्थक दोनों है।

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

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

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


38
रिवर्स इंजीनियरिंग अपने आप में एक खेल है! यह एकमात्र सही उत्तर है - किसी को आजकल एकल खिलाड़ी खेलों में जानकारी नहीं छिपानी चाहिए, अगर वे चाहते हैं तो खिलाड़ी इसे एक्सेस करेंगे।
मेफि

27
@ TheBinaryGuy से क्या सुरक्षा? आपके उपयोगकर्ता एक ऑफ़लाइन गेम खेल रहे हैं । कोड को उजागर करने से क्या खतरा है? खिलाड़ी को अंततः गेम खेलने में सक्षम होने के लिए इसकी खोज करनी चाहिए! सुरक्षा का एक महत्वपूर्ण नियम यह है कि आपको उस उपचार की पहचान करनी चाहिए जिससे आप सुरक्षा कर रहे हैं; इसे "खतरे का मॉडल" कहा जाता है।
jpmc26

7
@ TheBinaryGuy अन्य बिंदुओं के अलावा, मैं "फिक्स्ड" पासकोड का उपयोग करने की संवेदनशीलता पर सवाल उठाऊंगा - यहां तक ​​कि ऑनलाइन कोड के बिना / रिवर्स इंजीनियरिंग के माध्यम से देखे बिना, बस दूसरी बार गेम खेलने से पहले ही खिलाड़ियों को सीधे सीधे छोड़ दें खेल के वर्गों (जैसा कि वे पहले से ही कोड जानते हैं)। यदि आप वास्तव में इन कोड को अर्जित करने के लिए खिलाड़ियों को "मजबूर" करना चाहते हैं, तो आपको उन्हें प्रत्येक
प्लेथ्रू

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

5
@ हमें पता है कि मुझे लगता है कि उत्तर मानता है कि आपको स्टोर किए जाने वाले वास्तविक तार की आवश्यकता है, जैसे कि उन्हें किसी बिंदु पर खिलाड़ी को दिखाने के लिए, जिसका अर्थ हैशिंग नहीं होगा।
फ्रैंक होपकिंस

4

यदि ऐसी कोई चीज वास्तव में वांछित है, तो हैशिंग के बजाय, आप रनटाइम पर एक संख्यात्मक इनपुट मूल्य से तारों के निर्माण पर विचार कर सकते हैं।

लाभ यह है कि @Philipp द्वारा बताया गया है, यह निष्पादन योग्य में कोड को छिपाने और छिपाने के लिए कुछ हद तक बेकार है यदि आप उन्हें वैसे भी इंटरनेट पर पोस्ट किए जाने की उम्मीद कर सकते हैं। हशेड या नहीं, इंटरनेट पर पाया गया एक ही शब्द और गेम में प्रवेश करने पर एक ही हैश मिलेगा और किसी भी तरह से काम करेगा।

छोड़कर ... को छोड़कर किसी अन्य व्यक्ति की कोड काम नहीं करता है आप के लिए। जिसे आप तुच्छ रूप से कर सकते हैं - औसत उपयोगकर्ता के लिए काम करने के लिए 100% छेड़छाड़ नहीं बल्कि उचित रूप से कठिन। "ऑनलाइन एलेन नाम जनरेटर" के रूप में सरल कुछ भी (मनमाने ढंग से सरल हो सकता है, वास्तव में एक मार्कोव पाठ जीन इंजन की ज्यादा जरूरत नहीं है, यादृच्छिक सूची से 4-5 सिलेबल्स को खींचना काफी अच्छा है)।

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

या, आप केवल गेम के सीरियल नंबर का उपयोग कर सकते हैं जो अद्वितीय है और उपयोगकर्ता द्वारा हार्डवेयर बदलने पर काम करेगा (हालांकि, यह पायरेटेड सीरियल के लिए साझा अनलॉक कोड के काम के बाद से पायरिंग को बढ़ावा दे सकता है, लेकिन वैध ग्राहकों के लिए नहीं!)।

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

इसलिए ... इससे पहले कि आप इस तरह से कुछ करें, बहुत अच्छी तरह से सोचें कि क्या आप वास्तव में ऐसा चाहते हैं, और आप क्या चाहते हैं। संभवतया, मानव पठनीय तार (या तुच्छ के साथ "अपठनीय" बना दिया गया) बस काफी अच्छा है और वास्तव में बेहतर है।


आप किस प्रक्रिया की कल्पना करते हैं? यदि प्रोग्राम डाउनलोड होने के बाद हैश मान उत्पन्न करता है, तो डाउनलोड होने पर इसे अनहैस्ड स्ट्रिंग करना होगा। तो क्या सर्वर ग्राहक की जानकारी की पहचान करने के लिए क्वेरी करेगा और फिर हैश सर्वर-साइड जनरेट करेगा?
संचय ३

@ सदस्यता: क्या सर्वर? क्यू कहता है "पूरी तरह से ऑफ़लाइन"। जो शायद एक डीवीडी (या शायद एक डाउनलोड) प्लस एक सीरियल नंबर पर एक कार्यक्रम का मतलब है। तो आपके पास 1,2,3,4 घटनाएँ हैं जिनके लिए एक पासकोड मौजूद होना चाहिए। आप उदाहरण के hash(serial + 1)लिए गणना करते हैं कि पहले कोड के अनुरूप संख्या प्राप्त की जाए। फिर उसे अपने शब्द जनरेटर में फ़ीड करें, जो कहता है, कहता है, इनपुट के प्रत्येक 4 बिट्स के लिए 16 की सूची से एक शब्दांश। वहां आप जाते हैं, प्रत्येक उपयोगकर्ता के लिए अलग-अलग "शब्द"।
डेमन

यदि यह डाउनलोड है, तो यह एक सर्वर से डाउनलोड किया जा रहा है। यदि प्रोग्राम डाउनलोड hash(serial+1) होने के बाद गणना करता है, तो उपयोगकर्ता को गणना करने से रोकने के लिए क्या है hash(serial+1)? एक बार प्रोग्राम डाउनलोड हो जाने के बाद, उपयोगकर्ता के पास प्रोग्राम की हर चीज तक पहुंच होती है।
Acccumulation

@Accumulation: कुछ भी नहीं उपयोगकर्ता को प्रोग्राम को पहले विघटित करने और फिर गणना करने से रोकता है hash(serial + 1)। तो क्या? ये कोई समस्या नहीं है। देखिए, अगर कोई खुद को धोखा देने के लिए एक से दो घंटे (शायद 6-8 घंटे एक विशिष्ट "उपयोगकर्ता" बिना सॉफ्टवेयर डेवलपर पृष्ठभूमि के) निवेश करता है, तो ... उसे जाने दें। बात यह है, यह एक व्यक्ति के लिए काम करता है, लेकिन सभी के लिए नहीं, और यह प्रतिस्पर्धी नहीं है ... इसलिए, कोई समस्या नहीं है।
डेमन

3

यदि आपको स्ट्रिंग्स दिखाने की आवश्यकता नहीं है, तो हैशिंग विचार शायद जाने का रास्ता है। यदि, दूसरी ओर, आपको उन्हें उपयोगकर्ता को दिखाने की आवश्यकता है, तो कुछ अन्य तरीके हैं जिनसे आप सीधे अपने DLL में दिखा सकते हैं।

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

तुम भी कुछ शब्दों से बना स्ट्रिंग हो सकता है, लेकिन वे अंत में अलग अलग आदेश में डाल दिया। उदाहरण के लिए, आपको निम्न 2 तारों की आवश्यकता हो सकती है:

  1. एक भालू मेरे घर के माध्यम से चला गया
  2. मेरे घर ने मुझे एक भालू से बचाया

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

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


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

जैसा कि मैंने कहा, यदि एरे को संदर्भित करता है जो स्ट्रिंग्स उन सभी कार्यों को वितरित करता है जिनकी उन्हें आवश्यकता होती है, तो यह केवल एक फ़ंक्शन में एकल सरणी खोजने की तुलना में थोड़ा कठिन है। असंभव नहीं है, लेकिन बहुत सारे अतिरिक्त काम के बिना एक बड़ा क्षेत्र शामिल है।
user1118321

क्या यह केवल एन्क्रिप्शन का कम रूप नहीं है?
आर्टुरो टॉरेस सैंचेज़

2
रुको, एन्क्रिप्शन भी नहीं। सिर्फ एन्कोडिंग।
आर्टुरो टॉरेस सैंचेज़

2
मैंने उत्तर को अधिक स्पष्ट होने के लिए अद्यतन किया है। मूल रूप से, यदि अनुक्रमणिका खिलाड़ी द्वारा किए गए कुछ पर आधारित है, तो वे वास्तव में खेल में संग्रहीत नहीं हैं। फिर, यह मूर्खतापूर्ण सबूत या सही नहीं हो सकता है, लेकिन मैं इसे यहां एक विकल्प के रूप में डाल रहा हूं, जिसे लोग तलाश करना पसंद कर सकते हैं।
user1118321
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.