2012-02-07 11 views
6

अगर मैं गलत हूं तो कृपया मुझे सही करें। मैं इस सवाल से कुछ विचारों को स्पष्ट करने के लिए कह रहा हूं।जब स्मृति को पढ़ना और लिखना कानूनी है?

आज स्कूल में मैंने सीखा कि जब एक प्रक्रिया (प्रोग्राम) निष्पादित होती है, तो ऑपरेटिंग सिस्टम इसे स्मृति में एक स्थान देता है। तो यह दो कार्यक्रमों उदाहरण के लिए ले:

Program1:

static void Main(string[] args) 
    { 

     unsafe // in debug options on the properties enable unsafe code 
     { 

      int a = 2; 

      int* pointer_1 = &a; // create pointer1 to point to the address of variable a 

      // breakpoint in here !!!!!!!!!!!!!!!!! 

      // in the debug I should be able to see the address of pointer1. Copy it and 
      // type it in the console 

      string hexValue = Console.ReadLine(); 

      // convert the hex value to base 10 
      int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber); 

      // create a new pointer that point to the address that I typed in the console 
      IntPtr pointer_2 = new IntPtr(decValue); 

      Console.WriteLine("The address of a: {0} Value {1}", ((int)&a), a); 

      try 
      { 
       Console.WriteLine("The address of {0} points to value {1}", (int)&pointer_1, (int)pointer_2); 

       // different approach of acomplishing the same 
       Console.WriteLine(Marshal.ReadInt32(pointer_2)); 
      } 
      catch 
      { 
       Console.WriteLine(@"you are supposed to be debuging this program.");      
      } 

     } 

कार्यक्रम 2

static void Main(string[] args) 
    {    
     unsafe 
     { 
      IntPtr pointer_0 = new IntPtr(95151860); // see address of variable from program1 
      int* pointer_1 = (int*)pointer_0; 
      // try to access program's 1 object 
      Console.WriteLine("addrees of {0} points to value {1} ", (int)&pointer_1, *pointer_1); 
     } 
    } 

तो मैं समझता हूँ कि कार्यक्रम 2 में मैं एक त्रुटि मिल जाएगा। मैं प्रतिबंधित स्मृति तक पहुंच जाएगा। अब तक जो मैंने सीखा है वह समझ में आता है।

ठीक है यहां पता है कि चीजें समझ में नहीं आती हैं।

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

वैसे भी ऑटोिट ऑटोट विंडो जानकारी नामक प्रोग्राम के साथ आता है जहां वह प्रोग्राम आपको विंडोज़ पर नियंत्रण के हैंडल (पॉइंटर्स) प्राप्त करने में सक्षम बनाता है। उदाहरण के लिए मैं नियंत्रण है कि मैं हो रही सूचना के आधार पर करने के लिए इच्छा खोजक उपकरण draging द्वारा खिड़की के नियंत्रण से संभाल देख सकते हैं:

enter image description here

पूर्णांक इस तस्वीर मैं कैलकुलेटर के इनपुट नियंत्रण करने के लिए खोजक उपकरण खींच रहा हूँ। उदाहरण के लिए मैं इसे बटन 7 पर भी खींच सकता हूं।

तो यदि आप तस्वीर में देखते हैं तो अब मेरे पास उस नियंत्रण का पता है। मैं उसके कार्यक्रम से इसे एक्सेस करने में सक्षम हो सकता था !!


फिर भी कैसे आप स्मृति है कि मेरे कार्यक्रम

चरण 1) से संबंधित नहीं है का उपयोग कर सकते autoit विंडो जानकारी

चरण 2) में के साथ किसी भी खिड़की के सूचक जाओ का एक और उदाहरण मेरी कंप्यूटर कि सूचक है:

enter image description here

गूगल की खिड़की है कि जगह है जहाँ मैं टी हूं क्रोम इस सवाल को yping।

इस वर्ग के वापस करने के लिए एक खिड़की भेज देंगे:

public static class SendWndToBack 
    { 
     [DllImport("user32.dll")] 
     static extern bool SetWindowPos(
      IntPtr hWnd, 
      IntPtr hWndInsertAfter, 
      int X, 
      int Y, 
      int cx, 
      int cy, 
      uint uFlags); 

     const UInt32 SWP_NOSIZE = 0x0001; 
     const UInt32 SWP_NOMOVE = 0x0002; 
     const UInt32 SWP_NOACTIVATE = 0x0010; 

     static readonly IntPtr HWND_BOTTOM = new IntPtr(1); 

     static readonly IntPtr k = new IntPtr(12); 

     public static void WindowHandle(IntPtr windowHandle) 
     { 
      SetWindowPos(windowHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 
     }    
    } 

और फिर अगर मैं poniter कि मैं सिर्फ autoit की मदद से मिला है और के रूप में यह फोन के साथ विधि कॉल:

  SendWndToBack.WindowHandle(new IntPtr(0x00000000000510B2)); 

तो मैं वापस


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

उत्तर

5

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

+0

तो फिर एक हैंडल क्या है? आपका जवाब बहुत समझ में आता है धन्यवाद! –

+1

एक हैंडल सिर्फ एक आईडी है। खिड़की के मामले में, ओएस में कहीं भी खिड़कियों की एक सूची होगी और जब SendWndToBack (आईडी) को कॉल करें तो वह उस आईडी के साथ विंडो की खोज करेगा और फिर उसे वापस भेजने के लिए "ओएस जादू" करेगा। – John3136

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