एक प्रक्रिया से मेमोरी पढ़ने के बारे में कोई कैसे जाएगा? क्या यह OS द्वारा अलग है?


11

एक अनुभवी वेब-डेवलपर के रूप में, लेकिन एक नौसिखिए "निम्न स्तर" प्रोग्रामर, यह सामान मेरे लिए अभी भी वूडू की तरह है।

मैं इस बारे में उत्सुक हूं कि कोई एक मेमोरी ब्लॉक खोजने के बारे में कैसे जाना शुरू करेगा, और फिर इसे पढ़ना (उदाहरण के लिए, खानों के खेल में टाइमर पढ़ना)? क्या यह OS / OS संस्करण द्वारा भिन्न है?

जवाबों:


14

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

" खानों के खेल में टाइमर को पढ़ने " के अपने उदाहरण को ध्यान में रखते हुए :

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

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

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


क्या हर बार प्रक्रिया के चलने के दौरान चर का स्थान समान होगा?
ब्रुनेक

1
@brunoqc नहीं, लगभग आश्वस्त नहीं।
डैन

2

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

लिनक्स पर इसे कैसे करें: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux


क्या OS इसे अनुमति नहीं देगा? ऐसा लगता है कि आप इसे लिनक्स और विंडोज के तहत कर सकते हैं, कम से कम
ईवा

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

1

एक एप्लिकेशन को ओएस द्वारा मेमोरी की एक सीमा दी जाती है। आम तौर पर, एप्लिकेशन को मेमोरी का अनुरोध करना पड़ता है लेकिन उस कार्यक्षमता को भाषा की वजह से प्रोग्रामर को अस्पष्ट किया जा सकता है।

सी जैसी भाषाएं विशिष्ट आकारों के लिए ब्लॉक अनुरोधों की अनुमति देती हैं, जबकि अन्य भाषाओं जैसे सी ++, सी #, और जावा जैसे कीवर्ड के उपयोग के माध्यम से अनुरोधों की अनुमति देते हैं new। प्रत्येक भाषा में मेमोरी आवंटित करने के कई तरीके हैं, इसलिए यह एक संक्षिप्त अवलोकन है। स्मृति को ओएस पर वापस करना या तो स्पष्ट रूप से या कचरा कलेक्टर के माध्यम से किया जा सकता है।

मेमोरी को एप्लिकेशन के भीतर एक्सेस करना इस बात पर निर्भर करता है कि इसे कैसे आवंटित किया गया था। C और C ++ इंगित करने के लिए पॉइंटर्स की अवधारणा का उपयोग करने के लिए सबसे अच्छे रूप में जाना जाता है / जहां स्मृति स्थित है, ट्रैक करने के लिए। अन्यथा, मेमोरी एक्सेस को उस वर्ग या चर के माध्यम से नियंत्रित किया जाता है जिसे बनाया गया था।

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

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

जब आप एप्लिकेशन लिख रहे हों, तो मेरा उत्तर प्रासंगिक है, जबकि zxcdw का उत्तर किसी अन्य एप्लिकेशन से संबंधित मेमोरी तक पहुंचने के लिए प्रासंगिक है। आपके LMGTFY शब्द "डीबगिंग" और "रिवर्स-इंजीनियरिंग" उस विषय में आगे की ओर झुकेंगे।

कुछ अतिरिक्त पढ़ने:

  • कंप्यूटर मेमोरी पर विकिपीडिया लेख आपको चीजों का एक सभ्य अवलोकन देगा।
  • फिर मेमोरी-मैप किए गए I / O पर विकिपीडिया लेख देखें जो कि चलने वाले यंत्रों की गहरी समझ प्राप्त करता है।
  • अंत में, प्रत्येक ओएस दूसरों की तुलना में थोड़ी अलग तरीके से मेमोरी मैपिंग को कैसे हैंडल करेगा, इसके लिए बेहतर जवाब पाने के लिए वर्चुअल मेमोरी पर लेख देखें ।

उत्कृष्ट उत्तर, हालाँकि हाँ, इस मामले में मैं एक एप्लिकेशन से मेमोरी पढ़ने के बारे में अधिक चिंतित हूं जो मैंने खुद नहीं लिखा था। जैसे ही मेरे पास 15 प्रतिनिधि होंगे;)
ईवा

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