IDA 将一些项目注释为:typeinfo
for_classname_
。
那typeinfo
是什么,是一样的type_info
吗?可以从中提取哪些信息?(例如,我想知道对象大小或虚函数表大小)。
我对来自 Android NDK for ARM 的 GNU C++ (G++) 特别感兴趣。
IDA 将一些项目注释为:typeinfo
for_classname_
。
那typeinfo
是什么,是一样的type_info
吗?可以从中提取哪些信息?(例如,我想知道对象大小或虚函数表大小)。
我对来自 Android NDK for ARM 的 GNU C++ (G++) 特别感兴趣。
这些对象确实是type_info
类的实例(或者更有可能是它的后代之一)。Itanium C++ ABI 中描述了这些类的结构。您还可以rtti.h
从 GCC检查文件。
对于这些类的精简、仅数据表示,请查看我的Recon 2012 演示文稿(从幻灯片 27 左右开始)。
给定 VFT 地址,您可以打印损坏的类名:
unsigned int* vmtaddr = *(int*)obj_addr;
DLOG("class name: _Z%s",((char***)vmtaddr)[-1][1]);
类名可以用c++filt
.
(_Z
东西没有存储在那里,而是c++filt
工作所必需的。)
您还可以打印继承链(诀窍是 typeinfo 也是一个对象,如果它是 a __cxxabiv1::__si_class_type_info
,则根据其损坏的名称 we strcmp()
,存在单一继承,并且指向超类 typeinfo 的指针跟在指向名称的指针之后):
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("inheritance chain: %s",classchain);
free(classchain);
其中strrealloccat()
定义为:
char* strrealloccat(char* buffer0, char *addition)
{
char* buffer = realloc(buffer0, (buffer0 ? strlen(buffer0) : 0) + strlen(addition) + sizeof(char));
if (!buffer) {
return buffer;
}
if(!buffer0) {
*buffer = 0;
}
return strcat(buffer, addition);
}
_Z4hopeN4this5helpsE