c++ pointers memory memory-address

Accediendo a direcciones de memoria directas y obteniendo los valores en C++.



pointers memory (5)

Me preguntaba si era posible acceder a un bloque directo de memoria usando C / C ++ y tomar el valor. Por ejemplo:

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

Si tomara el valor impreso aquí, me daría la dirección de la variable i, que contiene el valor 15. Solo diré que se imprimió 0x0ff9c1 para este ejemplo. Si tengo un programa separado que declara un puntero así ...

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

¿Sería posible imprimir ese 15 que la otra aplicación colocó en el bloque de memoria 0x0ff9c1? Sé que mi declaración de puntero con la dirección de memoria es incorrecta, no estoy seguro de cómo hacerlo de otra manera. He intentado usar memcopy pero tampoco he podido hacer que funcione. Sé que esto es posible de alguna manera ya que tengo un programa llamado Cheat Engine que modifica los valores de dirección de la memoria del juego para obtener ventajas injustas. He tenido éxito en colocar la ubicación de la memoria impresa y obtener el valor (15) a través de Cheat Engine. Mi objetivo es hacer esto usando C ++. Si esto es demasiado confuso, básicamente me gustaría acceder a una variable que otra aplicación almacenó usando su dirección de memoria e imprimir el valor. Estoy usando Windows 7 x64 con el compilador MinGW si eso importa. ¡Gracias!

PD: publicaré una foto de lo que hace Cheat Engine para dar una mejor idea.


En general, generalmente no es posible que un programa modifique la memoria de otro. El sistema hace todo lo posible para garantizar esto. Si no fuera así, ningún programa sería seguro. Esto es particularmente cierto en todas las variantes de Unix en las que he trabajado, aunque no en todos los sistemas operativos propietarios que he visto.

Tenga en cuenta que ninguna de estas reglas se aplica al kernel ...

También hay un paradigma de programación llamado memoria compartida, pero debe configurarlo explícitamente.

Respuesta corta: normalmente no se puede hacer eso. Creo que mencionaste las ventanas. No sé nada de Windows, por lo que su kilometraje puede variar.


Los dos procesos tienen espacios de direcciones separados. Un proceso no puede acceder a otra memoria de procesos a menos que sea una memoria compartida de forma explícita.


No se puede hacer de una manera independiente de la plataforma en C ++. Si bien no he usado este "motor de trucos" específicamente, casi con certeza está usando la misma API especial que usa un depurador. El código será específico de Windows y requerirá un cierto nivel de privilegio en el proceso en ejecución.

(Por ejemplo, si está utilizando Visual Studio y ejecuta un programa desde él en un modo de depuración, Visual Studio puede observar y modificar los valores de ese programa).

No he escrito un depurador en un tiempo, así que no sé dónde es un buen lugar para comenzar con la API de depuración, pero puedes buscar en la web cosas como este artículo:

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


Si desea cambiar la memoria utilizada por otro proceso, una forma sería inyectar su código en el otro proceso. Desde ese punto, puedes hacer lo que quieras en la memoria del otro programa como si fuera tuyo.

Buscar alrededor de la creación de hilos remotos o hooking . Hay más que unas pocas preguntas al respecto aquí (y here , para empezar).