2012-02-07 16 views
6

Corrígeme si me equivoco. Estoy haciendo esta pregunta para aclarar algunas ideas que tengo.cuando leer y escribir en la memoria es legal?

Hoy en la escuela aprendí que cuando se ejecuta un proceso (programa), el sistema operativo le da un espacio en la memoria. Así que toma, por ejemplo, estos dos programas:

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.");      
      } 

     } 

Programa 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); 
     } 
    } 

por lo que entiendo que en el programa 2 voy a tener un error. Estaré accediendo a la memoria restringida. Hasta ahora, lo que he aprendido tiene sentido.

Ok, sé que aquí es donde las cosas no tienen sentido.

Hay un muy buen programa llamado AutoIt que se usa para automatizar tareas. Por ejemplo, puede enviar clics del mouse, mover el mouse, enviar pulsaciones de tecla, etc.

De todos modos, Autoit viene con un programa llamado AutoIt Window Info donde ese programa le permite obtener los identificadores (controles) de las ventanas. Por ejemplo pude ver el mango de control de la ventana por arrastrando la herramienta de búsqueda con el control que deseo en la obtención de información:

enter image description here

int esta foto estoy arrastrando la herramienta de búsqueda de control de entrada de la calculadora. También podría arrastrarlo al botón 7, por ejemplo.

Así que si ves en la imagen, ahora tengo la dirección de ese control. ¡Entonces podría acceder a él desde mi programa!


Sin embargo, otro ejemplo de cómo se puede acceder a la memoria que no pertenece a mi programa

Paso 1) Obtener el puntero de cualquier ventana con autoit ventana de información

Paso 2) En mi equipo que es puntero:

enter image description here

esa es la ventana de google Chrome el lugar donde estoy t yping esta pregunta.

Esta clase enviará una ventana a la parte posterior:

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); 
     }    
    } 

y luego, si yo llamo el método con el poniter que yo acabo con la ayuda de autoit y lo llaman como:

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

yo enviaré entonces esa ventana a la parte posterior


he puesto un poco de examen ples para ilustrar mi punto. Pero mi pregunta es cuándo se te permite acceder a otras partes de la memoria. Si hago pública mi variable, ¿otros programas podrán acceder a ella? ¿Por qué puedo acceder a algunos controles de Windows desde mi propio programa?

Respuesta

5

Está confundiendo "Manijas" y "Punteros". Solo porque parece una dirección, puede que no lo sea. Windows usa muchos identificadores y el sistema operativo puede permitirle hacer cosas para manejar aunque no las haya creado. Puede representar un Handle como un IntPtr, pero si realmente lo tratara directamente como un puntero, probablemente (probablemente) se bloquee.

+0

Entonces, ¿qué es un mango? ¡Tu respuesta tiene mucho sentido gracias! –

+1

Un identificador es solo una identificación. En el caso de una ventana, el sistema operativo tendrá una lista de ventanas en algún lugar y cuando llame a SendWndToBack (ID) buscará la ventana con esa identificación y luego le hará "magia del sistema operativo" para enviarla a la parte posterior. – John3136

Cuestiones relacionadas