Otázka:
Co je uloženo v typeinfo (GNU C ++, Android NDK, ARM)
18446744073709551615
2014-05-12 18:54:17 UTC
view on stackexchange narkive permalink

IDA anotuje některé položky jako: typeinfo pro _classname_

Co je to typeinfo , je to stejné jako type_info ? Jaké informace z něj lze získat? (např. chtěl bych znát velikost objektu nebo velikost tabulky virtuálních funkcí).

Zajímá mě zejména GNU C ++ (G ++) z Androidu NDK pro ARM.

Dva odpovědi:
Igor Skochinsky
2014-05-12 19:43:59 UTC
view on stackexchange narkive permalink

Tyto objekty jsou skutečně instancemi třídy type_info (nebo spíše jednoho z jejích potomků). Struktura těchto tříd je popsána v Itanium C ++ ABI. Můžete také zkontrolovat soubor rtti.h z GCC.

Chcete-li ořezané, pouze pro data reprezentaci těchto tříd, podívejte se na moje Prezentace Recon 2012 (začněte přibližně na snímku 27).

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

Chcete-li přidat odpověď Igora Skochinského:

Vzhledem k adrese VFT můžete vytisknout název změněné třídy:

  unsigned int * vmtaddr = * (int *) obj_addr; DLOG ("název třídy: _Z% s", ((char ***) vmtaddr) [- 1] [1]);  

Název třídy lze dekódovat pomocí c++filt.

(Věc _Z tam není uložena, ale je vyžadována pro c ++ filt to work.)

Můžete také vytisknout dědický řetězec (trik spočívá v tom, že typeinfo je také objekt, a pokud se jedná o __cxxabiv1 :: __ si_class_type_info , proti jehož zmanipulované jméno jsme strcmp () , došlo k jediné dědičnosti a ukazatel na superclass typeinfo následuje za ukazatelem na název):

  char * classchain = strrealloccat ( NULL, "_Z"); char ** ptypeinfo = ((char ***) vmtaddr [-1]); for (; ptypeinfo; ptypeinfo =! strcmp (((char ***) ptypeinfo [0]) [- 1] [1], "N10__cxxabiv120__si_class_type_infoE")? (char **) ptypeinfo [2]: 0) {// DLOG ("tinfo:% p", ptypeinfo); // DLOG ("class: _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 ("dědický řetězec:% s", třída); free (classchain);  

kde strrealloccat () je definován jako:

  char * strrealloccat (char * buffer0, char * dodatek) {char * buffer = realloc (buffer0, (buffer0? strlen (buffer0): 0) + strlen (doplněk) + sizeof (char)); if (! buffer) {return buffer; } if (! buffer0) {* buffer = 0; } return strcat (buffer, addition);}  

_Z4hopeN4this5helpsE



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...