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 WriteProcessMemory
que 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. ;)
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
fuente
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:
fuente