Question:
Ce qui est stocké dans typeinfo (GNU C ++, Android NDK, ARM)
18446744073709551615
2014-05-12 18:54:17 UTC
view on stackexchange narkive permalink

IDA annote certains éléments comme suit: typeinfo for _classname_, est-ce le même que type_info ? Quelles informations peut-on en extraire? (par exemple, j'aimerais connaître la taille de l'objet ou la taille de la table des fonctions virtuelles).

Je suis particulièrement intéressé par GNU C ++ (G ++) d'Android NDK pour ARM.

Deux réponses:
Igor Skochinsky
2014-05-12 19:43:59 UTC
view on stackexchange narkive permalink

Ces objets sont en effet des instances de la classe type_info (ou, plus probablement, de l'un de ses descendants). La structure de ces classes est décrite dans Itanium C ++ ABI. Vous pouvez également inspecter le fichier rtti.h de GCC.

Pour une représentation réduite et uniquement des données de ces classes, vérifiez mon Présentation Recon 2012 (à partir de la diapositive 27 environ).

18446744073709551615
2014-05-14 10:17:58 UTC
view on stackexchange narkive permalink

Pour ajouter la réponse d'Igor Skochinsky:

Étant donné l'adresse VFT, vous pouvez afficher le nom de la classe mutilée:

  unsigned int * vmtaddr = * (int *) obj_addr; DLOG ("nom de la classe: _Z% s", ((car ***) vmtaddr) [- 1] [1]);  

Le nom de la classe peut être décodé avec c++filt.

(La chose _Z n'est pas stockée ici, mais requise pour c ++ filt pour fonctionner.)

Vous pouvez également imprimer la chaîne d'héritage (l'astuce est que typeinfo est aussi un objet, et s'il s'agit d'un __cxxabiv1 :: __ si_class_type_info , contre dont le nom mutilé nous strcmp () , il y a eu un héritage unique et un pointeur vers la superclasse typeinfo suit le pointeur vers le nom):

  char * classchain = strrealloccat ( NULL, "_Z"); char ** ptypeinfo = ((char ***) vmtaddr [-1]); pour (; ptypeinfo; ptypeinfo =! strcmp (((char ***) ptypeinfo [0]) [- 1] [1], "N10__cxxabiv120__si_class_type_infoE")? (char **) ptypeinfo [2]: 0) {// DLOG ("tinfo:% p", ptypeinfo); // DLOG ("classe: _Z% s meta: _Z% s", ptypeinfo [1], ((char ***) ptypeinfo [0]) [- 1] [1]); // DLOG ("meta: _Z% s", ((char ***) ptypeinfo [0]) [- 1] [1]); classchain = strrealloccat (strrealloccat (classchain, ptypeinfo [1]), "_Z"); } DLOG ("chaîne d'héritage:% s", chaîne de classes); free (classchain);  

strrealloccat () est défini comme:

  char * strrealloccat (char * buffer0, char * addition) {char * buffer = realloc (buffer0, (buffer0? strlen (buffer0): 0) + strlen (addition) + sizeof (char)); if (! buffer) {tampon de retour; } if (! buffer0) {* buffer = 0; } return strcat (buffer, addition);}  

_Z4hopeN4this5helpsE



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...