首页
社区
课程
招聘
[原创] 通过windbg学习虚表继承及布局
发表于: 2019-7-29 10:47 6013

[原创] 通过windbg学习虚表继承及布局

2019-7-29 10:47
6013

假设有一个类为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- 虚函数表在内存中的布局情况


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (5)
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
光是这个格式,看着就很舒服,内容也很实在,mark
2019-7-29 11:17
0
雪    币: 2107
活跃值: (1429)
能力值: ( LV8,RANK:126 )
在线值:
发帖
回帖
粉丝
3
可以
2019-7-29 14:01
0
雪    币: 9
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
位于虚表地址-4的地方
2019-7-29 21:11
0
雪    币: 347
活跃值: (57)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
8月1号我再把自己的测试源码和编译后的程序上传一下。
2019-7-30 22:15
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
6
配合《深度探索c++对象模型》这本书看更舒服哦~理论结合实际
2019-7-31 11:24
0
游客
登录 | 注册 方可回帖
返回
//