elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Consulta acerca de posición/distancia de funciones virtuales en una clase
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta acerca de posición/distancia de funciones virtuales en una clase  (Leído 1,791 veces)
BloodSharp


Desconectado Desconectado

Mensajes: 814


¡ Hiperfoco !


Ver Perfil WWW
Consulta acerca de posición/distancia de funciones virtuales en una clase
« en: 16 Diciembre 2018, 02:14 am »

Buenos noches gente querida del foro, el tema es el siguiente:

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
  1. #include <cstdio>
  2.  
  3. class CAbuelo
  4. {
  5. public:
  6. virtual void Funcion1() {}
  7. virtual void Funcion2() {}
  8. virtual void Funcion3() {}
  9. // ....
  10. virtual void Funcion20() {}
  11. virtual void Funcion21() {}
  12. };
  13.  
  14. class CPadre : CAbuelo
  15. {
  16. public:
  17. virtual void Funcion22() {}
  18. virtual void Funcion23() {}
  19. // ....
  20. virtual void Funcion45() {}
  21. virtual void Funcion46() {}
  22. virtual void Funcion47() {}
  23. };
  24.  
  25. class CNieto : CPadre
  26. {
  27. public:
  28. virtual void Funcion48() {}
  29. virtual void Funcion49() {}
  30. virtual void Funcion50() {}
  31. // ....
  32. virtual void Funcion101() {}
  33. virtual void Funcion102() {}
  34. virtual void Funcion103() {}
  35. };
  36.  
  37. CNieto objNieto;
  38. CNieto *pNieto = &objNieto;
  39.  
  40. int main()
  41. {
  42. printf("direccion nieto en direccion 0x%X, funcion48 en direccion 0x%X y indice o distancia en %i",
  43. pNieto, &((int)pNieto->Funcion48), indice_de_funcion_virtual_o_distancia(pNieto,Funcion48));
  44. }

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#


« Última modificación: 16 Diciembre 2018, 02:18 am por BloodSharp » En línea



MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Consulta acerca de posición/distancia de funciones virtuales en una clase
« Respuesta #1 en: 16 Diciembre 2018, 17:20 pm »

Los métodos, internamente, no son miembros de las funciones.

En la memoria, código y datos están en segmentos separados, ya de por sí no pueden pertenecer al mismo objeto.

Después está la forma en que C++ nombra a los métodos. Las clases pueden compartir el mismo nombre en sus métodos y los propios métodos con los mismos nombres pero diferente firma hacen cosas diferentes. El compilador, a la hora de generar la tabla de símbolos y saber a qué método referirse, lo que hace es decorarlos. Partiendo de su nombre  le suma a éste datos de la firma e incluso puede añadir el nombre de la base.

Así se puede modificar un poco tu ejemplo anterior para que veas que, a pesar de que se generan tres objetos CNieto, cada uno con su propio espacio, su método Funcion48 son exactamente el mismo, es decir, sólo hay una copia de ellos en memoria. Lo que nos lleva a concluir que no son miembros propiamente dichos de la clase.

Código
  1. #include <cstdio>
  2. #include <cstddef>
  3.  
  4. class CAbuelo
  5. {
  6. public:
  7. virtual void Funcion1() {}
  8. virtual void Funcion2() {}
  9. virtual void Funcion3() {}
  10. // ....
  11. virtual void Funcion20() {}
  12. virtual void Funcion21() {}
  13. };
  14.  
  15. class CPadre : CAbuelo
  16. {
  17. public:
  18. virtual void Funcion22() {}
  19. virtual void Funcion23() {}
  20. // ....
  21. virtual void Funcion45() {}
  22. virtual void Funcion46() {}
  23. virtual void Funcion47() {}
  24. };
  25.  
  26. class CNieto : CPadre
  27. {
  28. public:
  29. virtual void Funcion48() {}
  30. virtual void Funcion49() {}
  31. virtual void Funcion50() {}
  32. // ....
  33. virtual void Funcion101() {}
  34. virtual void Funcion102() {}
  35. virtual void Funcion103() {}
  36. };
  37.  
  38. CNieto objNieto1;
  39. CNieto objNieto2;
  40. CNieto objNieto3;
  41.  
  42. int main()
  43. {
  44. printf("objNieto1: 0x%p\nobjNieto1.Funcion48(): 0x%p\n",
  45. &objNieto1, &objNieto1.Funcion48);
  46. puts("");
  47. printf("objNieto2: 0x%p\nobjNieto2.Funcion48(): 0x%p\n",
  48. &objNieto2, &objNieto2.Funcion48);
  49. puts("");
  50. printf("objNieto3: 0x%p\nobjNieto3.Funcion48(): 0x%p\n",
  51. &objNieto3, &(objNieto3.Funcion48));
  52. }


« Última modificación: 16 Diciembre 2018, 17:27 pm por MAFUS » En línea

BloodSharp


Desconectado Desconectado

Mensajes: 814


¡ Hiperfoco !


Ver Perfil WWW
Re: Consulta acerca de posición/distancia de funciones virtuales en una clase
« Respuesta #2 en: 16 Diciembre 2018, 18:39 pm »

Los métodos, internamente, no son miembros de las funciones.

En la memoria, código y datos están en segmentos separados, ya de por sí no pueden pertenecer al mismo objeto.

Después está la forma en que C++ nombra a los métodos. Las clases pueden compartir el mismo nombre en sus métodos y los propios métodos con los mismos nombres pero diferente firma hacen cosas diferentes. El compilador, a la hora de generar la tabla de símbolos y saber a qué método referirse, lo que hace es decorarlos. Partiendo de su nombre  le suma a éste datos de la firma e incluso puede añadir el nombre de la base.

Así se puede modificar un poco tu ejemplo anterior para que veas que, a pesar de que se generan tres objetos CNieto, cada uno con su propio espacio, su método Funcion48 son exactamente el mismo, es decir, sólo hay una copia de ellos en memoria. Lo que nos lleva a concluir que no son miembros propiamente dichos de la clase.

Gracias por tu respuesta, sin embargo mi consulta era como obtener la posición, distancia o índice en el vector del array de la tabla de direcciones de funciones virtuales... Como dije al principio del primer tema, estoy realizando ingeniería inversa a un programa el cuál encontré un "objeto interesante" al que analizarlo con IDA (en la versión de Linux del programa que tiene toda la data de DWARF) me arroja que hay una clase la cuál tiene funciones virtuales y que deriva de varias clases como mostré en el ejemplo.

El tema es que en Windows el desarrollador no dejó tan abiertamente los datos de depuración como en Linux, además estoy analizando una versión antigua de Windows, que si bién gracias a los datos de linux pude encontrar dichas funciones en Windows mayormente a través de referencias de strings...

Mi objetivo sería ver si las definiciones que yo extraje coinciden con las de Windows y ver posibles modificaciones a lo largo de las distintas versiones, por eso necesito los índices, para comprobar que no haya muchos cambios y además asegurarme que tengo todas las definiciones correctas.


B#
« Última modificación: 16 Diciembre 2018, 18:43 pm por BloodSharp » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Inventan una máquina de besos virtuales enfocada a relaciones a distancia
Noticias
wolfbcn 4 2,631 Último mensaje 20 Julio 2012, 15:49 pm
por L3I_W0N6
Funciones virtuales
Programación C/C++
eleon 2 2,101 Último mensaje 29 Julio 2012, 22:51 pm
por eleon
Consulta sobre máquinas virtuales
ASM
zonahurbana 3 2,737 Último mensaje 9 Abril 2014, 03:09 am
por Eternal Idol
Tengo una duda sobre redefinición de funciones virtuales en C++
Programación C/C++
theluigy13etv 1 2,026 Último mensaje 20 Febrero 2015, 19:49 pm
por _Enko
Cual es el sentido de las funciones virtuales puras?
Programación C/C++
digimikeh 8 2,937 Último mensaje 7 Octubre 2019, 04:32 am
por digimikeh
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines