[TUTORIAL] FindDMAAddy - Como puntero C++

  • Hola Invitado ¿Quieres conversar con todos los usuarios de GamerzHacking?, No esperes mas y entra al canal de Discord dando clic AQUI
  • Hola Invitado, hemos decidido no subir mas videos de Game Hacking a la mierda de YouTube, mas informacion AQUI. Nuestro nuevo canal de videos ahora es COCOSCOPE.

c0de

Administrador
Miembro del equipo
1 Nov 2015
1.240
306
83
29
Lima
gamerzhacking.com
Hola amigos de GamerzHacking, esta ves de manera escrita les explicare sobre como es un puntero en C++, posiblemente cuando disponga de mas tiempo realice un video tutorial con una presentacion mas dinamica con respecto al tema.

Muchas preguntas me han realizado o una de ellas son las siguientes ¿Como encontrar la dirección final de un pointer multi nivel usando C++?, ¿Como usar un pointer en C++? o ¿Como calcular un pointer con offsets?.

Debes saber que un puntero o pointer apunta a un sola dirección, pero cuando tienes una lista de offsets, puedes recorrer esa cada de punteros para encontrar la dirección final. Cuando encuentras un puntero en CheatEngine, lo que has encontrado es una ruta o camino de una dirección a otra, usando pointers y offsets relativos. Así es como las computadora localizan y actúan sobre los datos almacenados en la memoria. "No es magia", sino que la lógica detrás de esto se basa en 2 características importantes de la programación orientada a objetos moderna:

  • Las aplicaciones se vuelven eficientes en memoria asignando dinamicamente objetos de memoria solo cuando es necesario y asignado, punteros para señalarlos solo cuando sea necesario.
  • Las clases pueden contener variables miembros que son punteros, específicamente punteros a otros objetos en la memoria.

La dirección base o el primero puntero en la cadena de punteros es generalmente uno que existe en la memoria estática, lo que significa que siempre se encuentra en la misma dirección o se puede acceder utilizando un desplazamiento relativo desde la dirección base de un modulo.

C++:
Por favor, Acceder o Registrarse para ver el codigo.
Clase PlayerClass:

La vida(Health) se compensa 0x0, la armadura(armor) se compensa 0x4 y el nombre(name) se compensa 0x8, porque int es una variable de 4 bytes en este ejemplo (32 bit x86).

Primera Linea:

PlayerClass es el nombre de la clase, el "*" le dice al compilador que este es un puntero a un objeto de tipo PlayerClass y su identificador es localPlayer. En este ejemplo, no esta inicializado. Es decir, no se le ha asignado memoria.

Segunda Linea:

Cuando el jugador inicia un juego, al objeto localPlayer se le asigna un punto en la memoria en el monton y al puntero se le asigna la direccion del objeto.

La dirección del objeto localPlayer no seria consistente y necesitaría encontrar un puntero a ella. Si utilizo Cheat Engine "Find What Access This Address" (Encontrar lo que tiene acceso a esta dirección) o el puntero de escaner, encontrara un puntero con dirección base del puntero localPlayer y Offset 0x8.

Simplemente utiliza la misma lógica que la computadora para encontrar la dirección de la variable. En el código fuente de esta aplicación, si desea obtener el valor de la variable de nombre, de usar "->" (el operador de desreferenciacion de estructura) como este "locaPlayer-> name".

Cuando el compilador compila el código en ensamblador, la lógica que sigue el código es la siguiente:
  1. Redireccione el puntero localPlayer para obtener la dirección dinámica del objeto
  2. Agrega offset 0x8 para llegar al puntero del nombre
  3. Desreferencia el puntero del nombre para obtener la dirección dinámica del valor del nombre.
podemos hacerlo manualmente para cada puntero haciendo algo similar:

C++:
Por favor, Acceder o Registrarse para ver el codigo.
Pero no quiere perder el tiempo haciendo eso para cada puntero, en su lugar puedes realizar una función que lo hace por ti. Nosotros queremos emular esa logica exacta en nuestra funcion y hacerlo capaz de manejar el desreferencia de offsets multiples. Aqui hay una funcion que hace eso para x86 y x64, es un hubrido del codigo de Fleep, Rake e IXSO.

Externo

C++:
Por favor, Acceder o Registrarse para ver el codigo.
Para obtener la dirección actual de munición con arma, lo haría así.

C++:
Por favor, Acceder o Registrarse para ver el codigo.
Interno

C++:
Por favor, Acceder o Registrarse para ver el codigo.
Creditos
Rake
Fleep
 
Última edición:
  • Like
Reactions: 0x90