2011-09-01 20 views
16

में मान प्राप्त करने के लिए मैं सोच रहा था कि सी/सी ++ का उपयोग करके स्मृति के प्रत्यक्ष ब्लॉक तक पहुंचना संभव था और मूल्य को पकड़ना संभव था। उदाहरण के लिए:प्रत्यक्ष मेमोरी पतों तक पहुंचने और सी ++

int i = 15; 
int *p = &i; 
cout << &i; 

अगर मैं मुद्रित मूल्य यहाँ ले लिया है, कि मुझे चर मैं, जो मूल्य 15. मैं सिर्फ यह इस उदाहरण के लिए 0x0ff9c1 मुद्रित कहेंगे शामिल पता देना होगा। अगर मैं एक अलग कार्यक्रम जो इतनी तरह एक सूचक की घोषणा की ...

int *p = 0x0ff9c1; 
cout << *p; 

यह है कि 15 प्रिंट आउट करने के लिए संभव नहीं होगा कि अन्य अनुप्रयोग स्मृति ब्लॉक 0x0ff9c1 में रखा? मुझे पता है कि मेमोरी एड्रेस के साथ मेरी पॉइंटर घोषणा गलत है, मुझे यकीन है कि इसे अन्यथा कैसे करना है। मैंने memcopy का उपयोग करने का प्रयास किया है, लेकिन मैं इसे काम करने में सक्षम नहीं हूं। मुझे पता है कि यह संभव है क्योंकि मेरे पास धोखा इंजन नामक एक प्रोग्राम है जो अनुचित फायदे पाने के लिए गेम मेमोरी एड्रेस वैल्यू को संशोधित करता है। मैं मुद्रित स्मृति स्थान रखने और मूल्य प्राप्त करने में सफल रहा हूं (15) हालांकि धोखा इंजन। मेरा लक्ष्य सी ++ का उपयोग करके ऐसा करना है। यदि यह बहुत भ्रमित है, मूल रूप से मैं एक चर का उपयोग करना चाहता हूं जो कि एक अन्य एप्लिकेशन को इसके मेमोरी पते का उपयोग करके संग्रहीत किया जाता है और मूल्य प्रिंट करता है। यदि मायने रखता है तो मैं मिनी 7 डब्ल्यू कंपाइलर के साथ विंडोज 7 एक्स 64 का उपयोग कर रहा हूं। धन्यवाद!

पीएस: मैं एक तस्वीर पोस्ट करूंगा जो धोखा इंजन बेहतर विचार देने के लिए करता है। enter image description here

+5

+1 ऐसे प्रयोगों के लिए। – Nawaz

+3

वर्चुअल मेमोरी के बारे में एक पुस्तक पढ़ें। एक अतिरिक्त नोट के रूप में: लिनक्स और विंडोज़ के कुछ नए संस्करण बेकार यादृच्छिकता को नियोजित करते हैं, इसलिए प्रोग्राम चर के बीच स्थानीय चर के पते अलग-अलग होंगे। – unkulunkulu

+0

हां, हालांकि प्रयोग मैंने पाया। मैं दूसरे कार्यक्रम के निष्पादन तर्क के बावजूद पते का निर्यात करने की सोच रहा था। मैं आभासी स्मृति में देखूंगा, टिप के लिए धन्यवाद। – llk

उत्तर

6

दो प्रक्रियाओं में अलग पता रिक्त स्थान हैं। एक प्रक्रिया अन्य प्रक्रियाओं मेमोरी तक नहीं पहुंच सकती है जब तक कि यह स्पष्ट रूप से स्मृति साझा नहीं की जाती है।

+0

@ एडडो के उत्तर पर छायादार बिल्डिंग, पॉइंटर के अंदर का पता आपके रैम के अंदर वास्तविक भौतिक पता नहीं है, यह केवल एप्लिकेशन के लिए स्थानीय पता है (एक अर्थ में, एक आभासी पता)। –

+0

डिबगर्स और अन्य कार्यक्रम जैसे धोखा इंजन उन्हें तब तक कैसे पहुंचाते हैं? मेरी समझ से, OLLYDbg और Cheat Engine कर्नेल ड्राइवर या किसी भी गंभीर हुक स्थापित नहीं करते हैं। मुझसे गलती भी हो सकती है। – llk

+1

जो विंडोज के तहत 'ReadProcessMemory() 'और' WriteProcessMemory() 'का उपयोग करेगा। – trojanfoe

1

सामान्यतः, एक प्रोग्राम के लिए आमतौर पर किसी अन्य की स्मृति को संशोधित करना संभव नहीं होता है। यह सुनिश्चित करने के लिए सिस्टम बहुत अधिक समय तक चला जाता है। यदि ऐसा नहीं होता है, तो कोई प्रोग्राम सुरक्षित नहीं होगा। यह उन सभी यूनिक्स वेरिएंट्स में विशेष रूप से सच है जिन पर मैंने काम किया है, हालांकि मैंने देखा है कि सभी स्वामित्व ओएस पर नहीं।

ध्यान दें कि इन नियमों में से कोई भी गिरी पर लागू होते हैं ...

वहाँ भी है एक प्रोग्रामिंग प्रतिमान साझा स्मृति कहा जाता है, लेकिन आप स्पष्ट रूप से वह सेट करने के लिए की है।

संक्षिप्त उत्तर: आप आमतौर पर ऐसा नहीं कर सकते हैं। I मानते हैं कि आपने विंडोज़ का उल्लेख किया है। मुझे विंडोज़ के बारे में कुछ नहीं पता, इसलिए आपका माइलेज भिन्न हो सकता है।

+0

उत्तर थोड़ा गलत तरीके से केंद्रित है और कड़ाई से बिल्कुल सही नहीं है, क्योंकि ओएस एक दूसरे की स्मृति को संशोधित करने के लिए प्रक्रियाओं के लिए साधन प्रदान करता है। उत्तर इस तथ्य पर ध्यान केंद्रित करना चाहिए कि स्मृति रिक्त स्थान अलग हैं, इसलिए समान मान वाले पॉइंटर्स विभिन्न प्रक्रियाओं में विभिन्न भौतिक स्मृति स्थानों का संदर्भ देते हैं। – unkulunkulu

+0

मुझे लगता है कि एक पूर्ण वर्चुअल मेमोरी सबक की आवश्यकता नहीं थी, हालांकि शायद इसकी आवश्यकता थी। –

5

आप इसे C++ में प्लेटफ़ॉर्म-अज्ञेय तरीके से नहीं कर सकते हैं। हालांकि मैंने विशेष रूप से इस "धोखा इंजन" का उपयोग नहीं किया है, यह लगभग निश्चित रूप से उसी विशेष एपीआई का उपयोग कर रहा है जो एक डीबगर उपयोग करता है। कोड विंडोज के लिए विशिष्ट होगा, और आपको चल रहे प्रक्रिया पर एक निश्चित विशेषाधिकार स्तर की आवश्यकता होगी।

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

मैं में एक डिबगर नहीं लिखा है थोड़ी देर है, इसलिए मैं जहां एक अच्छी जगह पर डीबग एपीआई है आरंभ करने के लिए पता नहीं है, लेकिन आप इस लेख जैसी चीजों के लिए वेब के आसपास खोज सकते हैं:

http://www.woodmann.com/fravia/iceman1.htm

+0

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

3

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

remote thread creation या hooking के लिए चारों ओर खोजें। यहां इसके बारे में कुछ प्रश्न हैं (और here, स्टार्टर्स के लिए)।

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