Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Lectura de variables (https://www.clubdelphi.com/foros/showthread.php?t=58238)

rauros 13-07-2008 12:25:29

Lectura de variables
 
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:
Código Delphi [-]
 
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

Cita:

Empezado por coso (Mensaje 299986)
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...

Código Delphi [-]
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


Código Delphi [-]
//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.


La franja horaria es GMT +2. Ahora son las 07:08:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi