मैं पहले बोनस प्रश्नों का उत्तर दूंगा क्योंकि वे कुछ अवधारणाओं को पेश करते हैं जिन्हें आपको मुख्य प्रश्न के उत्तर को समझने के लिए जानने की आवश्यकता हो सकती है।
पहला बोनस प्रश्न उत्तर देना आसान है यदि आप जानते हैं कि निष्पादन योग्य फ़ाइल कैसे काम करती है: सभी वैश्विक/स्थैतिक चर .data
अनुभाग के अंदर हैं, जिसमें .exe अनुभाग के लिए पता ऑफसेट स्टोर करता है, इसलिए धोखा इंजन बस जांचता है चर इस पते सीमा में है (इस खंड से अगले एक तक)।
दूसरे प्रश्न के लिए, केवल स्थिर पते का उपयोग करना संभव है, लेकिन यह किसी गेम के लिए लगभग असंभव है। यहां तक कि पुराने भी। ट्यूटोरियल निर्माता शायद कहने की कोशिश कर रहा था कि वह सभी चर जो वह चाहता है, वास्तव में उनके लिए एक स्थिर संकेतक था। लेकिन पूरी तरह से इस तथ्य से कि आप एक स्थानीय चर बनाते हैं, या किसी फ़ंक्शन को तर्क भी देते हैं, उनके मूल्य ढेर में संग्रहीत किए जा रहे हैं। यही कारण है कि "स्थिर-केवल" कार्यक्रम होना लगभग असंभव है। यहां तक कि यदि आप ऐसे प्रोग्राम को संकलित करते हैं जो वास्तव में कुछ भी नहीं करता है, तो शायद इसमें कुछ सामान स्टैक में संग्रहीत किया जाएगा।
पूरे प्रश्न के लिए, सभी गतिशील पता चर वैश्विक चर द्वारा इंगित नहीं किए जाते हैं। यह पूरी तरह से प्रोग्रामर पर निर्भर करता है। मैं एक स्थानीय चर बना सकता हूं और उदाहरण के लिए, सी प्रोग्राम में वैश्विक/स्थैतिक सूचक को अपना पता कभी भी असाइन नहीं कर सकता। इस मामले में उस पते को ढूंढने का एकमात्र निश्चित तरीका वास्तव में कोड को जानना है जब चर को पहली बार स्टैक में एक मान असाइन किया गया था।
कुछ चरों में गतिशील पता होता है क्योंकि वे केवल स्थानीय चर होते हैं, जो पहली बार स्टैक में संग्रहीत होते हैं जब उनके पास एक मान दिया जाता है।
कुछ अन्य चरों का एक स्थिर पता है क्योंकि उन्हें या तो संकलक के लिए वैश्विक या स्थैतिक चर घोषित किया जाता है। इन चरों में एक निश्चित पता ऑफसेट है जो निष्पादन योग्य फ़ाइल में .data
अनुभाग का हिस्सा है।
निष्पादन योग्य फ़ाइल के अंदर प्रत्येक अनुभाग के लिए एक निश्चित ऑफ़सेट पता है, और .data
अनुभाग कोई अपवाद नहीं है।
लेकिन यह ध्यान देने योग्य है कि निष्पादन योग्य के अंदर ऑफसेट तय किया गया है। ऑपरेटिंग सिस्टम में चीजें अलग-अलग हो सकती हैं (सभी यादृच्छिक पते), लेकिन यह एक ओएस का काम है, जो आपके लिए इस प्रकार की सामग्री को सारणीबद्ध करता है (इस मामले में निष्पादन योग्य वर्चुअल एड्रेस स्पेस बना रहा है)। तो ऐसा लगता है कि स्थैतिक चर वास्तव में स्थिर हैं, लेकिन केवल निष्पादन योग्य स्मृति स्थान के अंदर। राम चीजों पर कहीं भी हो सकता है।
अंत में, आपको यह बताने की कोशिश करना मुश्किल है क्योंकि आपको समझना होगा कि निष्पादन योग्य फ़ाइलें कैसे काम करती हैं। एक अच्छी शुरुआत निम्न स्तर के प्रोग्रामिंग, जैसे ढेर फ्रेम, सम्मेलन बुलावा, असेंबली भाषा और कैसे कंप्यूटर्स फ़ंक्शंस (सामान्य रूप से स्कॉप्स), वैश्विक/स्थैतिक/स्थानीय प्रबंधन के लिए कुछ प्रसिद्ध तकनीकों का उपयोग करने के बारे में कुछ स्पष्टीकरणों की खोज करना होगा।/स्थिर चर, और स्मृति प्रणाली (खंड, ढेर, आदि), और शायद पीई (और यहां तक कि ईएलएफ) फ़ाइलों में कुछ शोध।
मेरा बुरा, मैंने स्थिर चर के साथ कुछ परीक्षण किए हैं ताकि यह देखने के लिए कि उनके ऑफसेट ठीक हो गए हैं और ऐसा लगता है कि वे नहीं हैं, लेकिन मुझे वहां एक त्रुटि हुई :(तो हाँ, स्थैतिक चर आमतौर पर निश्चित ऑफ़सेट पर लगते हैं, जो बोनस सवालों का जवाब देता है। मुख्य प्रश्न के लिए - एक कार्यक्रम के बारे में क्या है जहां सभी डेटा स्टैक/ढेर पर कोई स्थिर पॉइंटर्स नहीं रखा जाता है? यह कम से कम सी ++ में सामान्य है। अगर मैं कोई स्थिर नहीं हूं, तो मैं इसे कैसे देख सकता हूं परिवर्तनीय _somewhere_ जो इस डेटा को इंगित करता है, इसके लिए एक स्थिर पता प्राप्त करना संभव नहीं है - लेकिन ऐसा लगता है कि यह बहुत सारे गेम के लिए काम करता है। – futlib
धोखा इंजन न केवल पॉइंटर स्कैन करते समय "स्थिर पते" की तलाश में है। वास्तव में आपको स्कैन करने के दौरान पारित किए गए गेम में राज्यों के लिए उद्देश्य प्रदान करने के लिए गेम (और अलग-अलग रनों) में अलग-अलग राज्यों में कई बार स्कैन चलाने की आवश्यकता क्यों होती है। लेकिन यह गारंटी नहीं है कि यह सूचक हमेशा आपके इच्छित पते को पकड़ लेगा। तो मूल रूप से यह स्थिर और स्थानीय पॉइंटर्स की खोज करता है। –
लेकिन फिर स्थानीय सूचक हमेशा एक ही ऑफ़सेट क्यों होता है? शायद क्योंकि यह ढेर में इतनी जल्दी आवंटित किया गया था, कि यह गेम के शुरुआती दिनों में खोले गए पहले क्षेत्रों में रहता है, जो मुख्य लूप से पहले हो सकता है, जो तब तक वैध रहेगा जब तक कि गेम पर्याप्त स्कॉप्स को बंद न करे, फिर इस पॉइंटर को कचरा स्मृति रखें। –