c0de
Administrador
- Registrado
- 19 Abr 2020
- Mensajes
- 286
En primer lugar, el método que le mostraré no es la única forma de enganchar vmt, hay algunas otras posibilidades para hacerlo (cambiar el puntero de vtable, etc.) pero ese no es el alcance de este documento en este momento.
Antes de continuar, asegúrese de tener una comprensión exacta de lo que significa un método virtual y una tabla de métodos virtuales.
También debes saber que todo esto solo se puede usar cuando tu objetivo es en realidad una función virtual de una clase, de lo contrario ganó No esté en una tabla de método virtual (puede que no haya ninguna tabla), solo estará en el .text como todas las demás funciones.
Estoy usando Battlefield 3 como ejemplo para este tutorial. Y conectaré una de las funciones de actualización de physicsmanager de los juegos llamadas una vez por cuadro para poder llamar a rayquery desde el hilo de los juegos.
Así es como se ve la clase physicsmanager cuando no he hecho ningún cambio.
Tenga en cuenta que el puntero de la tabla de método virtual probablemente siempre estará al comienzo de la clase, que apuntará a la tabla de método virtual.
Ahora, esos métodos virtuales no son más o menos punteros a esas funciones: punteros de función.
Engancharé la quinta función a 0x10 en la tabla de métodos virtuales. Si eres un niño
genial, ya habrías adivinado que solo sobrescribiremos ese puntero para señalar nuestra función, lo cual es correcto, así que sobrescribiré ese 0x5AD160 para señalar mi gancho.
Ahora, cuando se llama a esa función a través de esa clase, llamará a mi función en su lugar, a partir de ahí podemos llamar a la función original, por supuesto.
Así es como podría verse su gancho, obviamente no necesariamente tiene que tenerlo como una función desnuda, si sabe cómo enganchar esta llamada (ps fastcall)
Ahora hay clases / funciones que le brindan un enlace de método virtual fácil, pero me gusta hacer el enlace vmt manualmente-
Creditos
c5
Antes de continuar, asegúrese de tener una comprensión exacta de lo que significa un método virtual y una tabla de métodos virtuales.
Please,
Acceder
or
Regístrate
to view URLs content!
Please,
Acceder
or
Regístrate
to view URLs content!
También debes saber que todo esto solo se puede usar cuando tu objetivo es en realidad una función virtual de una clase, de lo contrario ganó No esté en una tabla de método virtual (puede que no haya ninguna tabla), solo estará en el .text como todas las demás funciones.
Estoy usando Battlefield 3 como ejemplo para este tutorial. Y conectaré una de las funciones de actualización de physicsmanager de los juegos llamadas una vez por cuadro para poder llamar a rayquery desde el hilo de los juegos.
Así es como se ve la clase physicsmanager cuando no he hecho ningún cambio.

Tenga en cuenta que el puntero de la tabla de método virtual probablemente siempre estará al comienzo de la clase, que apuntará a la tabla de método virtual.
Ahora, esos métodos virtuales no son más o menos punteros a esas funciones: punteros de función.
Engancharé la quinta función a 0x10 en la tabla de métodos virtuales. Si eres un niño

Ahora, cuando se llama a esa función a través de esa clase, llamará a mi función en su lugar, a partir de ahí podemos llamar a la función original, por supuesto.
Así es como podría verse su gancho, obviamente no necesariamente tiene que tenerlo como una función desnuda, si sabe cómo enganchar esta llamada (ps fastcall)
C++:
Please,
Acceder
or
Regístrate to view codes content!
Ahora hay clases / funciones que le brindan un enlace de método virtual fácil, pero me gusta hacer el enlace vmt manualmente-
C++:
Please,
Acceder
or
Regístrate to view codes content!
Creditos
c5