typeinfo 中存储了什么(GNU C++、Android NDK、ARM)

逆向工程 艾达 C++ 安卓 手臂
2021-07-05 22:43:21

IDA 将一些项目注释为:typeinfofor_classname_

typeinfo什么,是一样的type_info吗?可以从中提取哪些信息?(例如,我想知道对象大小或虚函数表大小)。

我对来自 Android NDK for ARM 的 GNU C++ (G++) 特别感兴趣。

2个回答

这些对象确实是type_info类的实例(或者更有可能是它的后代之一)。Itanium C++ ABI 中描述了这些类的结构您还可以rtti.h从 GCC检查文件。

对于这些类的精简、仅数据表示,请查看我的Recon 2012 演示文稿(从幻灯片 27 左右开始)。

添加Igor Skochinsky 的回答

给定 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