PDA

Ver la Versión Completa : Lectura de variables


rauros
13-07-2008, 12:25:29
Saludos. Me gustaría saber si hay alguna manera de leer variables y zonas de memoria de otra aplicación con delphi, y si la hay, ¿Me podéis dar algo de información? Gracias a todos que siempre me ayudáis.

coso
13-07-2008, 14:06:31
Hola,
en teoria, variables no, puesto que se sustituye su simbolo por una dirección de memoria al momento de compilarse (si se han dejado las debug options activadas, no se sustituyen) y ejecutarse (objetos si: primero encontrando la form con findwindow y luego usar FindComponent). Eso si, una dirección de memoria conocida si puede leerse, mediante una funcion Peek o equivalente.
Saludos

rauros
13-07-2008, 14:33:36
Ahora me gustaría saber lo siguiente: Como puedo saber la vida de un juego (por ejemplo). Mi teoría es:

1· Desensamblar y buscar la región de memoria y la línea que llama a esa región, ya que en algunos ordenadores puede cambiar. Y usar esa línea para localizar la región.

¿Eso está bien o hay alguna equivocación?

coso
13-07-2008, 14:48:01
ufff... eso es complicadillo... en principio tendrias que cargar un juego en un debugger o lector dinamico de memoria....luego, poner 'flags' a las zonas de memoria que cambian y, mirando en el momento que te maten una vida, cual es el byte (o integer etc) que se ha reducido. Otra manera es grabar una partida, cargarla y acto seguido matarte (sin que cambie nada mas), grabar, y comparar los dos archivos (inicio->ejecutar->fc.com /b archivo1 archivo2 >> comparacion.txt). Este sistema por eso funcionaba bien en los juegos antiguos, pero en los modernos, donde en un segundo te cambia hasta la paleta de colores o las texturas, te sera bastante dificil encontrar en que posicion de memoria se guardan las vidas :confused:. Prueba eso, graba con 5 vidas, busca el caracter nº5, graba con 4, buscar el nº4, etc... y si tienes suerte que se te modifica en alguna posición concreta, quiza sea aquella la posición.

PD: no estoy seguro, pero creo que ya habran programas concretos para estas cosas X/ ...

rauros
13-07-2008, 15:18:05
Tranquilo, hay un programa llamado cheatengine, que debuggea y encuentra las zonas de memoria que le has dicho. Si tengo 5 vidas busco 5, si tengo 4 vidas busco 4... El problema no es ese, es como usarlo en delphi. Sobre debuggear y desensamblar estoy hecho un hacha xD.

coso
13-07-2008, 15:19:21
pero...a ver...en delphi no tienes vidas :D a no ser que haya algo que aun no haya descubierto yo...como quieres usar el 'cheatengine' este en delphi?

rauros
13-07-2008, 15:21:32
Hay jaja no me refiero a eso. Si no usar cheat engine para LEER ZONAS DE MEMORIA DE UN JUEGO, no usar delphi como juego xD.

coso
13-07-2008, 15:22:54
ya ya pero q tiene que ver delphi en esto??:confused:...:) nada curiosidad namas

rauros
13-07-2008, 15:26:14
No hay ninguna forma de leer una zona de memoria desde delphi. Por ejemplo:

Read(080000,byte,vidas);
Showmessage(IntToStr(vidas),etc...)


Y esto lee la zona de memoria 080000, tamaño byte (los dos primeros digitos hexadecimales), y los almacena en vidas (variable integer).

A eso me refiero...

coso
13-07-2008, 15:29:03
si...lo que se llama un 'peek'...voy a buscar que a mi tambien me interesa... a ver si alguien del foro ya lo sabe

rauros
13-07-2008, 15:31:54
Si nos ayudamos los dos mejor, yo te digo que si vas ha hacer algo parecido, usa cheat engine. Agrégame a ezeali@msn.com y hablamos directamente, pero luego ponemos por aquí el resultado de lo que hemos conseguido para compartirlo con los demás.

coso
13-07-2008, 15:33:29
no, no, no por los juegos, solo q se que en c si existe peek y es sencillo tambien acceder a una dirección de memoria (integer *p = 0x0a000) solo que en delphi me esta dando errores X/ leyendola directamente de esta manera, y no encuentro la funcion Peek susodicha...

rauros
13-07-2008, 15:35:35
Voy a buscar to también alguna especie de traducción para peek en delphi.

donald shimoda
13-07-2008, 17:18:53
si...lo que se llama un 'peek'...voy a buscar que a mi tambien me interesa... a ver si alguien del foro ya lo sabe

Ah Peek an Poke. La base de la programación en Commodore 64!
Hicieron que se me piante un lagrimón.:o

Me voy a ver mi commodore 64 y vuelvo. ;)

Saludos.

coso
13-07-2008, 17:24:19
:) quiza 'peek' esta obsoleto. Readmem o memread tampoco lo encuentro. no encuentro manera de leer una direccion de memoria directamente...


var
p : PInteger;
begin
p := PInteger($080000); // o p := Ptr($080000);
showmessage(inttostr(p^)); // Access error read memory $080000
end;

rauros
13-07-2008, 17:33:02
¿Cómo? Pero la memoria que quiero leer es de un programa, ¿o la memoria es la misma para todos los programas?

coso
13-07-2008, 17:46:33
hombre, la memoria es la memoria entera del ordenador... cada programa va reservando trozos segun los necesite (el getmem...) no se bien bien el funcionamiento, pero creo que se va asociando cada trozo al programa con un identificador del programa, que debe ser lo que lee el cheat engine este..si la duda es si la direccion es dinamica y cambia cada vez, creo que si (?)

rauros
14-07-2008, 14:49:54
¿Entonces como puedo saber que memoria se le ha dado a una aplicación? Por ejemplo:

Imáginate que en mi ordenador la vida está alojada en 089765, yo creo que 9765 no cambia, solo cambia 08 que es la memoria que le ha dado el ordenador, ¿No? (CORREGIDME SI ME EQUIVOCO).

Entonces



//Handle es un integer con el handle de la ventana.
//LocMemo es otro integer, vacío.
//Vidas es Int vacío.
GetMemAddress(handle,LocMemo) //Equivalente a 08 en mi ordenador
Vidas := PInteger $(locmemo + 9765) //Localización de las vidas





Yo pienso que debería ser algo así. Corregidme si hay algo mal.

coso
14-07-2008, 17:28:06
:( me gustaria ayudarte pero no se bien bien como va: se que la memoria esta paginada (00000:00000) de cierta manera, pero no se como el sistema operativo la va adjudicando a cada programa. A ver si alguien mas del foro lo sabe...

rauros
17-07-2008, 15:44:06
Vale, ahora lo tengo en un memo. ¿Como selecciono un texto de un memo?
Yo se que para copiar parte de un string a otro:

repeat
copiado:=copiado+texto[i];
i:=i+1;
until me_de_la_gana

Pero de un memo pff... Ni idea. Lo siento.

donald shimoda
17-07-2008, 15:50:12
Vale, ahora lo tengo en un memo. ¿Como selecciono un texto de un memo?
Yo se que para copiar parte de un string a otro:

repeat
copiado:=copiado+texto[i];
i:=i+1;
until me_de_la_gana

Pero de un memo pff... Ni idea. Lo siento.

Si lo que quieres es el texto completo de todo el memo:

copiado := copiado + memo1.Text;

si lo que quieres es linea a linea

repeat
copiado:=copiado+memo1.lines[i];
i:=i+1;
until me_de_la_gana

Espero te sirva, saludos.