-
-
[原创]从反汇编的角度学C/C++之虚继承
-
发表于: 2021-10-4 11:05 6514
-
先修改定义如下,看不是虚继承的情况下的内存情况
先看sub构造函数
可以看到这里和多继承时候的调用是一样的,只是由于成员变量变多偏移不同罢了,在看看Base1和Base2的构造函数
接下来看看Base的构造函数
可以看到不是虚继承的情况下,程序会分别调用两个父类的构造函数,由于两个父类又同时有父类,它们都会在内存中留空间给父类成员也就是x赋值。所以数据的排布以及在内存中的情况会如下图所示
可以看到在没有使用虚继承的情况下程序会生成两份Base类的数据成员。接下来看看虚函数表的情况,根据上面的方法重命名以后结果如下
其中的sub_40137E函数情况如下
由此可以看出虚函数表内容和前面的多继承是一样的。接下来看看虚继承的情况,修改定义如下
首先看看转换成虚继承以后,对构造函数的调用有什么改变
可以看到,此时在调用构造函数的时候,除了会给ecx赋值为类变量的地址以外,还会压入一个参数,值为1。这里需要补充一点的是,在虚继承中,编译器会产生一个叫虚基类偏移表的东西。简单来说,上面的Base1和Base2都会产生,这张表偏移为4的地方存储的是类的变量在内存中的地址和虚基类,也就是Base的类变量的地址的偏移。
接下来首先看看Sub构造函数的内容
上面的虚偏移表内容如下
接下来继续看Base的构造函数
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-10-20 11:23
被1900编辑
,原因:
赞赏记录
参与人
雪币
留言
时间
Ally Switch
为你点赞~
2022-10-7 15:23
一笑人间万事
为你点赞~
2022-7-28 00:12
hey james
为你点赞~
2022-1-26 12:19
赞赏
他的文章
- [原创]CVE-2022-21882提权漏洞学习笔记 16383
- [原创]CVE-2021-1732提权漏洞学习笔记 19489
- [原创]CVE-2014-1767提权漏洞学习笔记 15192
- [原创]CVE-2018-8453提权漏洞学习笔记 18526
- [原创]CVE-2020-1054提权漏洞学习笔记 13542
看原图
赞赏
雪币:
留言: