¿Cómo se puede leer la memoria de un proceso? ¿Es diferente según el sistema operativo?

11

Como un desarrollador web experimentado, pero un programador novato de "bajo nivel", esto todavía me parece un vudú.

Tengo curiosidad acerca de cómo uno podría comenzar a buscar un bloque de memoria y luego leerlo (por ejemplo, leer el temporizador en un juego de minas). ¿Es esto diferente según la versión de OS / OS?

Eva
fuente

Respuestas:

14

Esta es una pregunta algo complicada e incluso compleja, en el sentido de que puedes profundizar bastante en esto. Pero para simplificar un poco las cosas:

Considerando su ejemplo de " leer el temporizador en un juego de minas ":

El primer paso es encontrar la dirección de memoria . Esto generalmente se hace con una herramienta llamada editor de memoria (un depurador también lo haría, en algunos casos) que puede usar varios métodos para encontrar la ubicación de una variable en la memoria del proceso . La forma común es buscar un cierto valor (por ejemplo, el valor del temporizador) en el espacio de memoria del proceso objetivo, luego cambiar el valor objetivo (por ejemplo, avanzar el temporizador) y buscar coincidencias nuevamente. Este proceso identifica a los candidatos cada iteración hasta que solo quede la variable exacta. Tomar la dirección de esa variable dentro del espacio de memoria del proceso es solo cuestión de hacer clic con un editor de memoria.

El segundo paso es modificar los datos en esa dirección en particular . Cómo se hace esto depende del sistema operativo. Con Windows , hay una llamada WinAPI llamada WriteProcessMemoryque se puede usar para escribir datos predefinidos en una dirección determinada dentro del espacio de memoria del proceso de destino. En nuestro ejemplo, usaría esta función para sobrescribir la variable del temporizador en el proceso de destino con su propio valor deseado, cambiando efectivamente el temporizador en el juego.

En la práctica, tendría que encontrar la ID del proceso del proceso de destino y luego adjuntar su proceso falso al proceso de destino para obtener la capacidad de modificar su espacio de memoria. Esta es una tarea bastante trivial, pero no contribuye a responder la pregunta, así que la he dejado fuera como ejercicio para el lector. ;)

zxcdw
fuente
¿La ubicación de la variable será la misma cada vez que se ejecute el proceso?
brunoqc
1
@brunoqc No, casi seguro que no.
Dan
2

Es completamente diferente según el sistema operativo. Algunos no le permitirán hacerlo en absoluto, y debe tener algún medio para saber dónde están los datos que desea en el espacio de memoria del objetivo.

Aquí se explica cómo hacerlo en Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux

pjc50
fuente
¿Qué sistema operativo no lo permitiría? Parece que puedes hacerlo en Linux y Windows, al menos
Eva
@Evan Cada sistema operativo debe permitir (restringido, por razones de seguridad) medios para la modificación remota de la memoria del proceso con fines de depuración. Sin embargo, tenga en cuenta que, por ejemplo, las discrepancias de privilegios por razones de seguridad pueden hacer que no se pueda leer / escribir la memoria del proceso de un proceso con privilegios más altos. Un buen ejemplo de esto sería no permitir que un proceso con privilegios de usuario invitado lea / escriba la memoria de un proceso con derechos de administrador, ya que eso podría comprometer todo el sistema y ser una forma directa para que un usuario invitado obtenga privilegios de administrador en el sistema.
zxcdw
1

El sistema operativo proporciona una gama de memoria a una aplicación. En general, la aplicación debe solicitar la memoria, pero esa funcionalidad puede estar oculta para el programador debido al lenguaje.

Los lenguajes como C permiten solicitudes de bloque para tamaños específicos, mientras que otros lenguajes como C ++, C # y Java permiten solicitudes mediante el uso de palabras clave como new. Cada idioma tiene varias formas de asignar memoria, por lo que esta es solo una breve descripción. La liberación de la memoria al sistema operativo puede hacerse explícitamente o mediante un recolector de basura.

El acceso a la memoria dentro de la aplicación depende de cómo se asignó. C y C ++ son los más conocidos por usar el concepto de punteros para indicar / rastrear dónde se encuentra la memoria. De lo contrario, el acceso a la memoria se maneja a través de la clase o variable que se creó.

La mayoría de las veces, no tiene que preocuparse por el acceso específico a la memoria dentro de su programa. Las construcciones del lenguaje y el sistema operativo oscurecen efectivamente esa preocupación por usted.

Su ejemplo de un temporizador en un juego es un excelente ejemplo de dónde no debería preocuparse por la asignación de memoria subyacente. Tendrás una variable que representa el temporizador, y solo leerás de la variable.

Mi respuesta es relevante para cuando está escribiendo la aplicación, mientras que la respuesta de zxcdw es relevante para acceder a la memoria que pertenece a otra aplicación. Sus términos LMGTFY serían "depuración" y "ingeniería inversa" para profundizar en ese tema.

Algunas lecturas adicionales:

  • El artículo de Wikipedia sobre la memoria de la computadora le dará una visión general decente de las cosas.
  • Luego, consulte el artículo de Wikipedia sobre E / S mapeadas en memoria para obtener una comprensión más profunda de las maquinaciones que suceden.
  • Finalmente, mire el artículo sobre Memoria virtual para obtener una mejor respuesta de cómo cada sistema operativo manejará la asignación de memoria de manera un poco diferente a los demás.

fuente
excelente respuesta, aunque sí, en este caso estoy más preocupado por leer la memoria de una aplicación que no escribí yo mismo. Voy a votar en cuanto tenga 15 repeticiones;)
Eva
@Evan: definitivamente lea el artículo sobre Memoria virtual. Eso le dará una mejor comprensión del mapeo que continúa. Debe comprender el mapeo para separar una aplicación. La mayoría de los depuradores le permitirán adjuntar a un proceso en ejecución que le permitirá ver las instrucciones y la memoria de la aplicación.