GodSys

GodSys
El Poder de la Programación

sábado, 20 de febrero de 2010

Direccion de memoria dinámicas y estáticas, Pointers y Offsets.

Bueno. Bienvenidos nuevamente a otro tutorial. Creo que después de este tuto van a salir todos hechos unos programados de cheats excelentes xD.
Hoy vamos a ver lo más difícil de las direcciones de memoria: las direcciones de memoria dinámicas.
Qué son las direcciones de memoria dinámicas? Recuerdan que en la publicación anterior vimos como editar un valor de una dirección de memoria, bueno, resulta que esta dirección de memoria en la que editamos el valor era estática, es decir, nunca cambia, siempre va a ser la misma, en este caso era 0100579C. Las direcciones de memoria dinámicas en un programa cambian cuando este se cierra y se vuelve a abrir, o cuando se reinicia, o cuando en un juegos se cambia de mapa, o en el medio del juego. Por ejemplo, tenemos el Counter-Strike y queremos encontrar la dirección de memoria donde se almacena el valor del dinero. Buscamos con el Cheat Engine hasta que logramos encontrarla, por ejemplo, es esta 03fbf5c4. Todo bien, cambiamos el valor del dinero y nos ponemos 16.000. Luego, cerramos el juego y cuando lo volvemos a ejecutar y lo abrimos con el Cheat Engine nos damos cuenta que el valor del dinero ya no se encuentra en la dirección 03fbf5c4, sino que ahora el valor del dinero se encuentra en otra dirección que desconocemos, como por ejemplo 01aa25c4. Lo que ha pasado acá es que la dirección es dinámica y cambió.
Qué problemaaa!!! Ahora cada vez que queramos cambiar valores en el Counter-Strike tendremos que buscar las direcciones de memoria cada vez que cambiemos de mapa, o reiniciemos el juego.
Bueno. Calma!.. Hay una solución: el "Offset" y el "Address of Pointer".
Qué es esto? Pongansen a pensar. De donde salen las direcciones dinámicas? La respuesta es de la suma del "Pointer" y del "Offset". Sé que aún no entienden, pero intentaré explicarlo lo más fácil.

Bueno...supongamos que tenemos la dirección dinámica donde se guarda el dinero del Counter-Strike, la dirección es 03fbf5c4. Esta dirección es guardada en otra dirección de memoria pero que es estática, por ejemplo, en 03bb546c. O sea, la dirección dinámica donde se almacena el dinero es un número hexadecimal en sí, y este número es almacenado en la dirección 03bb546c, que es una dirección estática, no cambia. Pero la dirección del dinero (que es dinámica) no se almacena tal cual en la dirección estática, sino se le resta algun numero, como por ejemplo, 1CC (este número es llamado Offset, es diferente en todos los programas, pero es estático, nunca cambia). Depués de restarle a la dirección dinámica el Offset, queda un número (llamado Pointer) que es el que realmente se almacena en la dirección estática (en este caso es 03bb546c la dirección estática).

Ahora sí, está calrito.

Dirección de memoria donde se guarda el dinero del CS 1.6 (es dinámica la dirección) = 03fbf5c4.
A
03fbf5c4 se le resta 1cc (que es el Offset) y da como resultado 3fbf3f8 (este es el denominado Pointer). Este Pointer es el que se almacena en la dirección de memoria estática.
Ahora, si queremos encontrar la dirección de memoria dinámica que almacena el valor del dinero en CS 1.6, debemos ver que valor esta almacenado en la dirección de memoria estática(
03bb546c), en este caso va a ser 3fbf3f8 (que es el Pointer) y sumarle 1cc (que es el Offset). Y nos da como resultado la dirección de memoria dinámica que contiene el valor del dinero!!!

Vamos a ilustrarlo:
Pointer + Offset = Dirección de memoria dinámica.
Pointer se almacena en dirección de memoria estática.
Offset es estático.

Para aclarar duda, la dirección de memoria del dinero es dinámica porque lo que cambia es el Pointer. Puede ser cualquier número, que sumado más el Offset, nos da como resultado la dirección de memoria dinámica.

Esto ha sido una breve explicación. Cualquier duda comuniquensen conmigo o busquen en internet, aunque no hay demasiada explicación sobre esto, pero seguro encuentran algo por los foros (como Foro PortalHacker)

En la próxima publicación veremos como aplicar todo esto en un Cheat creado y programado en C++ por nosotros para el CS 1.6 u otros juegos. Vayan practicando y estudiando..!!

4 comentarios:

  1. Genial, esto me ayudó mucho. :D

    PD. Exelente blog.

    Saludos.

    ResponderEliminar
  2. Gracias por la info seria fenomenal que publicaras en tu blog mas temas de estos ya que no se encuentra mucha info de como hacer hack, trainers, cheats, etc... en c++ y seria bueno saber dodne aprendistes a hacer estas cosas.

    Gracias maestro ;).

    ResponderEliminar
  3. Me gustaria hacerte una consulta hay un juego "Rage" el cual realizo el escaneo con cheat engine de la cantidad de municiones de una de las armas, despues de tres o cuatro escaneos determino que son 4 valores los que afectan (variables dinamicas) el hecho es que no las puedo congelar y a veces ni cambiar, es decir a medida que disminuye el valor en el juego en cheat engine veo disminuir en estas variables pero si yo les cambio el valor o congelo no me lo refleja en el juego

    ResponderEliminar
  4. PERO ESO FUNCIONA PARA JUEGO OFFLINE Y PARA JUEGOS ONLINE como se encontraria el tan buscado pointer ?????

    ResponderEliminar