博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四章——64位软件逆向技术-基本语法(下 虚函数)
阅读量:5145 次
发布时间:2019-06-13

本文共 802 字,大约阅读时间需要 2 分钟。

虚函数
   VC++实现虚函数的方式就是虚表,如果一个类至少要有一个虚函数,编译器会为这个类产生一个虚表。不同的类虚表就不同,相同的类虚表就会共享
    识别构造和析构 如果在函数入口有 lea reg,off_xxxxxx,  mov [reg],reg 初始化虚表,且返回值为this指针,我们就可以怀疑这是一个构造函数,同理我们发现同样的汇编我们也可以怀疑这是析构函数,可以根据顺序来区分。
    有一种情况,我们写了一个虚析构函数,但是编译器生成了两个析构函数,其中一个是普通的析构函数,对象出作用于时候调用,另一个放到虚表中,在delete对象时候调用。对比两个析构函数,虚表中的析构多了一个delete this 操作。如果代码写成如下
        Cvtual * Object = new Cvtual();
        Object ->~Cvtual();
        delete Object;
因为Object ->~Cvtual();属于多态调用所以会直接调用虚表中的析构,这时候对象就被释放了,如果在调用了delete Object,这时候我们发现,对象空间被重复释放,出现问题。为了解决这个问题,VC++编译器会在Object ->~Cvtual();时候传递参数0,代表对象不被释放,delete Object传递参数1 对象会被释放,这样就解决了上面的问题。gcc的编译器会采用在虚表中存放两个析构函数地址
 
总结一下虚表的特点:
  • 如果一个类至少一个虚函数,这个类起码有一个虚表指针
  • 不同的类虚表不同,相同类对象公用一个虚表
  • 虚表指针存放对象首地址处
  • 虚表地址在全局数据区
  • 虚表的每个元素都指向一个类成员函数指针
  • 虚表不一定以0结尾
  • 虚表成员函数顺序是以类声明的顺序排列
  • 虚表在构造函数中会被初始化
  • 虚表在析构函数中会被赋值

转载于:https://www.cnblogs.com/Tempt/p/10099624.html

你可能感兴趣的文章
ASP.NET MVC 入门
查看>>
day28飞机大战-战斗机.js
查看>>
中英互译软件测试计划
查看>>
Js 类定义的几种方式
查看>>
空间数据全文检索初步设计和实现
查看>>
最长递增子串
查看>>
Linux 的 Crontab 命令运用(转)
查看>>
【单页应用】view与model相关梳理(转载)
查看>>
8.1Solr API使用(分页,高亮)
查看>>
【web】基础 安全
查看>>
为CentOS下的Docker安装配置python3【转】
查看>>
python_面向对象—代码练习
查看>>
Linux kali信息探测以及 Nmap 初体验
查看>>
Java中Atomic包的实现原理及应用
查看>>
Vue延迟点击
查看>>
Django
查看>>
位运算的自我解释
查看>>
Unity入门知识
查看>>
接口和抽象类之间的关系
查看>>
错题纠正(三)
查看>>