Un puntero en sí mismo apunta a una sola dirección. Pero cuando tiene una lista de offsets, puede recorrer esa cadena de punteros para encontrar la dirección final.
Cuando encuentre un puntero en Cheat Engine, lo que encontrará es una ruta de una dirección a otra utilizando punteros y offsets relativos. Así es como las computadoras ubican y actúan sobre los datos almacenados en la memoria. ¡No es mágico! La lógica detrás de esto se basa en 2 características importantes de la programación moderna orientada a objetos:
Imagina este código:
Class:
La salud está compensada 0x0, la armadura está compensada 0x4 y el nombre está compensado 0x8, porque int es una variable de 4 bytes en este ejemplo (32 bits x86)
Primera línea:
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 se inicializa. Es decir, no se le ha asignado memoria.
Segunda línea:
Cuando el jugador comienza un juego, al objeto localPlayer se le asigna un lugar en la memoria en el montón y al puntero se le asigna la dirección del objeto.
La dirección del objeto localPlayer no sería coherente y necesitaría encontrar un puntero al mismo. Si usó "Buscar lo que accede a esta dirección" de Cheat Engine o el escáner de puntero, encontrará un puntero con la BaseAddress del puntero localPlayer y el desplazamiento 0x8.
Simplemente usa 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 quisiera obtener el valor de la variable de nombre, usaría "->" (el operador de desreferencia de estructura) como este: "localPlayer-> name".
Cuando el compilador compila este código en ensamblador, la lógica que sigue el código es la siguiente:
Pero no desea perder el tiempo haciendo eso por cada puntero, en su lugar, crea una función que lo hace por usted: Queremos emular esa lógica exacta en nuestra función y hacer que pueda manejar la desreferenciación de múltiples offsets.
Aquí hay una función que hace eso para x86 y x64, es un híbrido de código de Fleep, Rake y IXSO
External:
Para obtener la dirección de munición de arma actual, debe hacerlo así:
Interno:
Creditos
Rake
Cuando encuentre un puntero en Cheat Engine, lo que encontrará es una ruta de una dirección a otra utilizando punteros y offsets relativos. Así es como las computadoras ubican y actúan sobre los datos almacenados en la memoria. ¡No es mágico! La lógica detrás de esto se basa en 2 características importantes de la programación moderna orientada a objetos:
- Las aplicaciones hacen que la memoria sea eficiente al asignar dinámicamente objetos de memoria solo cuando sea necesario y al asignar punteros para apuntarlos solo cuando sea necesario.
- Las clases pueden contener variables miembro que son punteros, específicamente punteros a otros objetos en la memoria.
Imagina este código:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Class:
La salud está compensada 0x0, la armadura está compensada 0x4 y el nombre está compensado 0x8, porque int es una variable de 4 bytes en este ejemplo (32 bits x86)
Primera línea:
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 se inicializa. Es decir, no se le ha asignado memoria.
Segunda línea:
Cuando el jugador comienza un juego, al objeto localPlayer se le asigna un lugar en la memoria en el montón y al puntero se le asigna la dirección del objeto.
La dirección del objeto localPlayer no sería coherente y necesitaría encontrar un puntero al mismo. Si usó "Buscar lo que accede a esta dirección" de Cheat Engine o el escáner de puntero, encontrará un puntero con la BaseAddress del puntero localPlayer y el desplazamiento 0x8.
Simplemente usa 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 quisiera obtener el valor de la variable de nombre, usaría "->" (el operador de desreferencia de estructura) como este: "localPlayer-> name".
Cuando el compilador compila este código en ensamblador, la lógica que sigue el código es la siguiente:
- Desreferenciar el puntero localPlayer para obtener la dirección dinámica del objeto
- Agregue offset 0x8 para llegar al puntero de nombre
- Desreferenciar el puntero de nombre para obtener la dirección dinámica del valor del nombre
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Pero no desea perder el tiempo haciendo eso por cada puntero, en su lugar, crea una función que lo hace por usted: Queremos emular esa lógica exacta en nuestra función y hacer que pueda manejar la desreferenciación de múltiples offsets.
Aquí hay una función que hace eso para x86 y x64, es un híbrido de código de Fleep, Rake y IXSO
External:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Para obtener la dirección de munición de arma actual, debe hacerlo así:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Interno:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Creditos
Rake