2014-10-24 6 views
7

मैं Cheat Engine में थोड़ा सा देख रहा हूं, जो आपको Windows पर चल रही प्रक्रियाओं की स्मृति का निरीक्षण और कुशलतापूर्वक उपयोग करने की अनुमति देता है: आप उनके मूल्य के आधार पर चर के लिए स्कैन करते हैं, फिर आप उन्हें संशोधित कर सकते हैं, उदा। एक खेल में धोखा देने के लिए।सी/सी ++ कार्यक्रमों में स्थिर पते कैसे हो सकते हैं?

एक बॉट या कुछ लिखने के लिए, आपको उस वैरिएबल के लिए एक स्थिर पता ढूंढना होगा, जिसे आप बदलना चाहते हैं - यानी प्रक्रिया को पुनरारंभ होने पर वही रहता है।

  1. चर में आपकी रुचि है के पते के लिए देखो, उस पते का उपयोग मूल्य से खोज
  2. कोड के लिए देखो, उदहारण के लिए: उस के लिए विधि इस तरह मोटे तौर पर चला जाता है struct यह करने के लिए (के बाद से struct ऑफसेट तय कर रहे हैं) एक और सूचक है कि सूचक की ओर इशारा करते के लिए
  3. देखो जब तक आप एक स्थिर पते से एक (Cheat इंजन में हरे रंग में पता चलता है)

खोजने के अंतर्गत आता है का पता लगाने के लिए ऐसा लगता है कि मैंने देखा है कि ट्यूटोरियल से ठीक निर्णय ले रहा है, लेकिन मुझे समझने में परेशानी है क्यों यह काम करता है।

वैश्विक स्थिर समेत सभी चर नहीं, रनटाइम समय पर एक सुंदर यादृच्छिक पता प्राप्त करें?

बोनस सवाल:

  1. धोखा कैसे इंजन बता सकते हैं एक पते स्थिर है अगर (अर्थात पुनः आरंभ करने पर ही रहेगा)?
  2. एक ट्यूटोरियल इस तथ्य को संदर्भित करता है कि कई पुराने और कुछ आधुनिक गेम (उदा। ड्यूटी 4 का कॉल) केवल स्थिर पते का उपयोग करते हैं। वो कैसे संभव है?

उत्तर

10

मैं पहले बोनस प्रश्नों का उत्तर दूंगा क्योंकि वे कुछ अवधारणाओं को पेश करते हैं जिन्हें आपको मुख्य प्रश्न के उत्तर को समझने के लिए जानने की आवश्यकता हो सकती है।

पहला बोनस प्रश्न उत्तर देना आसान है यदि आप जानते हैं कि निष्पादन योग्य फ़ाइल कैसे काम करती है: सभी वैश्विक/स्थैतिक चर .data अनुभाग के अंदर हैं, जिसमें .exe अनुभाग के लिए पता ऑफसेट स्टोर करता है, इसलिए धोखा इंजन बस जांचता है चर इस पते सीमा में है (इस खंड से अगले एक तक)।

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

पूरे प्रश्न के लिए, सभी गतिशील पता चर वैश्विक चर द्वारा इंगित नहीं किए जाते हैं। यह पूरी तरह से प्रोग्रामर पर निर्भर करता है। मैं एक स्थानीय चर बना सकता हूं और उदाहरण के लिए, सी प्रोग्राम में वैश्विक/स्थैतिक सूचक को अपना पता कभी भी असाइन नहीं कर सकता। इस मामले में उस पते को ढूंढने का एकमात्र निश्चित तरीका वास्तव में कोड को जानना है जब चर को पहली बार स्टैक में एक मान असाइन किया गया था।

कुछ चरों में गतिशील पता होता है क्योंकि वे केवल स्थानीय चर होते हैं, जो पहली बार स्टैक में संग्रहीत होते हैं जब उनके पास एक मान दिया जाता है।

कुछ अन्य चरों का एक स्थिर पता है क्योंकि उन्हें या तो संकलक के लिए वैश्विक या स्थैतिक चर घोषित किया जाता है। इन चरों में एक निश्चित पता ऑफसेट है जो निष्पादन योग्य फ़ाइल में .data अनुभाग का हिस्सा है।

निष्पादन योग्य फ़ाइल के अंदर प्रत्येक अनुभाग के लिए एक निश्चित ऑफ़सेट पता है, और .data अनुभाग कोई अपवाद नहीं है।

लेकिन यह ध्यान देने योग्य है कि निष्पादन योग्य के अंदर ऑफसेट तय किया गया है। ऑपरेटिंग सिस्टम में चीजें अलग-अलग हो सकती हैं (सभी यादृच्छिक पते), लेकिन यह एक ओएस का काम है, जो आपके लिए इस प्रकार की सामग्री को सारणीबद्ध करता है (इस मामले में निष्पादन योग्य वर्चुअल एड्रेस स्पेस बना रहा है)। तो ऐसा लगता है कि स्थैतिक चर वास्तव में स्थिर हैं, लेकिन केवल निष्पादन योग्य स्मृति स्थान के अंदर। राम चीजों पर कहीं भी हो सकता है।

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

+0

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

+0

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

+0

लेकिन फिर स्थानीय सूचक हमेशा एक ही ऑफ़सेट क्यों होता है? शायद क्योंकि यह ढेर में इतनी जल्दी आवंटित किया गया था, कि यह गेम के शुरुआती दिनों में खोले गए पहले क्षेत्रों में रहता है, जो मुख्य लूप से पहले हो सकता है, जो तब तक वैध रहेगा जब तक कि गेम पर्याप्त स्कॉप्स को बंद न करे, फिर इस पॉइंटर को कचरा स्मृति रखें। –

2

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

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

यदि आप और जानने में रुचि रखते हैं, तो मैं this tutorial over at OSDev जैसे कुछ की जांच करने की सलाह दूंगा!

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