Estuve aplicando ingeniería inversa a un programa con el fín de encontrar la ubicación de ciertas funciones virtuales de un objeto de una clase que hereda de por los menos como 4 clases que cada una hereda de una clase anterior, así llegando a la clase principal. Cada clase incluso contiene sus propias funciones virtuales y algunas "sobre-escritas", el tema es que no encuentro la manera de obtener un offset o distancia de dicha función virtual en la tabla de direcciones.
Hice un programa ejemplo que ilustra mi consulta:
Código
#include <cstdio> class CAbuelo { public: virtual void Funcion1() {} virtual void Funcion2() {} virtual void Funcion3() {} // .... virtual void Funcion20() {} virtual void Funcion21() {} }; class CPadre : CAbuelo { public: virtual void Funcion22() {} virtual void Funcion23() {} // .... virtual void Funcion45() {} virtual void Funcion46() {} virtual void Funcion47() {} }; class CNieto : CPadre { public: virtual void Funcion48() {} virtual void Funcion49() {} virtual void Funcion50() {} // .... virtual void Funcion101() {} virtual void Funcion102() {} virtual void Funcion103() {} }; CNieto objNieto; CNieto *pNieto = &objNieto; int main() { printf("direccion nieto en direccion 0x%X, funcion48 en direccion 0x%X y indice o distancia en %i", pNieto, &((int)pNieto->Funcion48), indice_de_funcion_virtual_o_distancia(pNieto,Funcion48)); }
Mi consulta sería entonces como poder obtener una salida como la siguiente:
Citar
direccion nieto en direccion 0xDEADBAFF, funcion48 en direccion 0xBAFFDEAD y indice o distancia en 48
Estuve buscando en google y lo más cercano fue esto, el problema es que crea una especie de "objeto" el cuál no se como obtiene la dirección base y cada resultado de salida es la dirección siguiente...
EDIT: Vale aclarar que el programa "objeto de estudio" fue compilado con alguna versión antigua de VC como la VC5 o VC6...
B#