C++ Internals: VC RTTI - 基本数据结构

本文探讨了VC++中RTTI(运行时类型信息)的数据结构,包括_s_RTTICompleteObjectLocator、_s_RTTIClassHierarchyDescriptor和_s_RTTIBaseClassDescriptor等。通过示例代码展示了如何查看多态类的RTTI信息,揭示了VC++ RTTI处理多重和虚继承的复杂性。
摘要由CSDN通过智能技术生成
返回目录

网上资料比较少,ms还是有研究的价值 ^_^

相关资源:
Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTI
Reversing C++

C++的RTTI一旦遇上了多重和虚继承,简直就是噩梦 -.-

这里介绍一下VC中用来表示RTTI的内部数据结构(具体可以参考《Reversing C++》里的描述)。利用下面的程序可以察看多态类的RTTI信息,我们可以借此熟悉一下RTTI到底长什么样子 :-)

#include <windows.h>

#include <iostream>
using namespace std;

#include <typeinfo>
using std::type_info;

typedef type_info TypeDescriptor;

struct PMD
{
    ptrdiff_t mdisp; //vftable offset
    ptrdiff_t pdisp; //vbtable offset
    ptrdiff_t vdisp; //vftable offset (for virtual base class)

    void Output();
};

struct _s_RTTICompleteObjectLocator;
struct _s_RTTIClassHierarchyDescriptor;
struct _s_RTTIBaseClassDescriptor;

struct _s_RTTICompleteObjectLocator
{
    DWORD signature;
    DWORD offset; //vftable offset to this
    DWORD cdOffset;
    TypeDescriptor *pTypeDescriptor;
    _s_RTTIClassHierarchyDescriptor *pClassHierarchyDescriptor;

    void Output(size_t tabs);
};
struct _s_RTTIClassHierarchyDescriptor
{
    DWORD signature;
    DWORD attributes; //bit 0 multiple inheritance, bit 1 virtual inheritance
    size_t numBaseClasses; //at least 1 (all base classes, including itself)
    _s_RTTIBaseClassDescriptor **pBaseClassArray;

    void Output(size_t tabs);
};
struct _s_RTTIBaseClassDescriptor
{
    TypeDescriptor *pTypeDescriptor;
    size_t numBaseClasses; //direct base classes
    PMD pmd; //Len=0xC
    DWORD attributes;
    _s_RTTIClassHierarchyDescriptor *pClassHierarchyDescriptor; //of this base class

    void Output(size_t tabs);
};

void PMD::Ou
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值