Foros del Web » Programación para mayores de 30 ;) » C/C++ »

¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Estas en el tema de ¿Cómo utilizar ReadProcessMemory con una dirección dinámica? en el foro de C/C++ en Foros del Web. Hace poco me inicié con C++. Y me surgió esta duda : Yo puedo leer datos de otra aplicación obteniendo el handle del proceso y ...
  #1 (permalink)  
Antiguo 18/06/2009, 22:19
 
Fecha de Ingreso: junio-2009
Mensajes: 8
Antigüedad: 14 años, 10 meses
Puntos: 0
¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Hace poco me inicié con C++.
Y me surgió esta duda : Yo puedo leer datos de otra aplicación obteniendo el handle del proceso y luego leyendo la dirección de memoria con ReadProcessMem ory.
Pero esta dirección es dinámica lo cual implica que cuando se reinicie windows o a veces cuando se reinicie la aplicación en cuestión, cambie. Y al cambiar, mi aplicación modifica una dirección de memoria no deseada. Si, es la misma dirección que modifiqué anteriormente, y que funcionó. Pero al ser reiniciada la aplicación los datos que yo deseo leer ya no están en esa dirección. Y al modificarla podría interrumpir la ejecución del programa o causar errores (cosa que no deseo) ya que la aplicación podría estar usando esa dirección para otro propósito.

En resumen. ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?
O mejor dicho : ¿Cómo averiguar desde qué dirección lee los datos luego de reiniciar el programa/pc?

Gracias a todo el que se disponga a ayudarme.
  #2 (permalink)  
Antiguo 19/06/2009, 02:10
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Tendras que depurar el programa para ver de donde viene esa direccion, puede que sea memoria dinamica, en ese caso seguramente habra un puntero a la misma y este puede ser invariable.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 19/06/2009, 10:40
 
Fecha de Ingreso: junio-2009
Mensajes: 8
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Gracias por responder.
Si, ya tengo el puntero.
El problema que tengo es que en ReadProcessMemory tengo un parámetro que es la dirección de memoria de la que voy a leer (no el puntero).
Es decir, necesito leer antes lo que hay dentro del puntero que conseguí usando Cheat Engine.

Pero al leerlo (con ReadProcessMemory) me devuelve 0.
Debo estar haciendo algo mal seguramente, no se si se puede leer lo que está dentro de un puntero. (Según lei un puntero almacena una dirección de memoria, pero no se si es la manera correcta de leerlo)
Al hacer debug veo que el puntero tiene todos 0.
Pero abajo, en el dump (si no me equivoco de nombre) aparece en bytes la dirección de memoria a la que apunta el puntero.

Alguna idea?

Gracias por la ayuda.
  #4 (permalink)  
Antiguo 19/06/2009, 10:45
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Tal vez el codigo que estes usando o alguno de los datos sea incorrecto, tendriamos que verlos para saber.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 19/06/2009, 11:15
 
Fecha de Ingreso: junio-2009
Mensajes: 8
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Gracias de nuevo por el interés.
Esta screen del CheatEngine tendría que aclarar la parte de la búsqueda :

i217.photobucket.com/albums/cc181/mordor2/CE1.jpg

PINBALL.exe es igual a 0x400000 (Corríganme si me equivoco)
Por lo tanto 0x400000+0x00025658 = 0x00425658
0x00425658 es el puntero.

Pongo la parte del código que interesa (Cuando trato de leer lo que está dentro del puntero)
La anterior parte del código esta bien ya que si hago ReadProcessMemory directamente desde la dirección de memoria dinámica me guarda bien el dato.

DWORD dir; //Acá voy a almacenar la dirección a la que apunta el puntero (La que estoy intentando leer, la dinámica).

DWORD puntero = 0x00425658;

//Acá voy a intentar leer la dirección dentro del puntero y guardarla en mi variable dir.
ReadProcessMemory(hProcess,(LPVOID)puntero,&dir,si zeof(dir),0);

Pero devuelve 0.

Y según parece devuelve 0 porque esta bien.
Screen :

i217.photobucket.com/albums/cc181/mordor2/CE2.jpg

Alguna idea?

Última edición por ahrion; 19/06/2009 a las 11:24
  #6 (permalink)  
Antiguo 19/06/2009, 11:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

¿Y ReadProcessMemory devuelve true? No se de donde sale el valor 0x00025658 y al no tener ese tal pinball.exe no se cual es su base address aunque supongo que sera la que decis (es la direccion por defecto).

Fijate con un depurador que valor tiene esa direccion en el momento que tratas de leerla.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 19/06/2009, 12:48
 
Fecha de Ingreso: junio-2009
Mensajes: 8
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Ya encontré la solución.
Tenías razón, la base address no necesariamente es 0x04000000. La del PINBALL es 0x01000000.
Ya con estos datos lo unico que hice fue sumar 0x010000000 con 0x00025658 y con ReadProcessMemory guardar los bytes dentro de ese puntero (la dirección). Luego sumarle el offset (+52) y listo. Esa es la dirección.

Lo que leí es que la Base Address (No la del pinball) pero la de otros programas pueden cambiar, asi que a buscar como obtenerla desde C++.

Se agradece la ayuda Eternal!
  #8 (permalink)  
Antiguo 19/06/2009, 12:50
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

De nadas

Para conseguir la base address desde codigo tenes que leer el ejecutable (formato PE) sino usa el Dependency Walker.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 19/06/2009, 12:54
 
Fecha de Ingreso: junio-2009
Mensajes: 8
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: ¿Cómo utilizar ReadProcessMemory con una dirección dinámica?

Gracias por la info ;)
Suerte
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:49.