-
-
[原创] 通过windbg学习虚表继承及布局
-
发表于:
2019-7-29 10:47
6066
-
假设有一个类为ClassA,如果ClassA或者ClassA的父类中有虚函数,则ClassA就会有属于自己的虚表
子类会复制一份父类的虚表作为自己的虚表
子类会复制一份父类的虚表作为自己的虚表;
子类将需要覆盖的父类虚函数替换成自己的虚函数
假设ClassA继承了CBase1,CBase2且CBase1,CBase2都没有父类但都有虚函数,则ClassA将会有两张虚表,一张是从CBase1中拷贝过来的,一张是从CBase2中拷贝过来的
假设类的继承关系如下图所示:
图1
图1在加上第一段中的虚表继承规律可以知道:
CBase1,CBase2各有一张虚表;
ClassA,ClassB各有有两个虚表;
ClassA从CBase1中继承了一张表,从CBase2中继承了一张表,所以有两张表;
ClassB从ClassA中继承了两张表,因为ClassA有两张表
上述类对象的内存结构以及虚函数表在内存中的布局如下:
图2
我的代码在编译时取消了地址随机化,目的是为了方便测试。
运行结果
图3
将图3结果整合到图2中得到图3,图3方便我们理解。
每个虚表的前面都会有一个 _s__RTTICompleteObjectLocator 类型的指针。通过分析该结构体就能获得该类的继承关系。
接下来需要了解几个重要结构体:
Step1:查看objCBase1变量信息得到虚表地址
Step2:通过 __VFN_table - 4 查看虚表的 _s__RTTICompleteObjectLocator 结构体
step3: 通过pTypeDescriptor查看类型描述信息
step4:通过pClassDescriptor查看类的继承描述信息
step5:通过 pBaseClassArray 获取基类信息
整理了一下这几个结构体的关系图,图4.
图4
自己可以试着手动分析objClassB.
有时间再画一下剩下的两个关系图。
2- 虚函数表在内存中的布局情况
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)