VS2008中V表结束标记的分析

在逆向C++目标时,我们有时候可能会关注一个V表中到底有多少个虚函数。

这种细节大概多半是与编译器实现相关。

为了弄清楚这个问题,我在VS2008下写了一个简单的测试程序来探求这个问题的答案。

下面是C++的测试程序源码:

class IBox {
public:
    virtual void f1() = 0;
    virtual void f2() = 0;
    virtual void f3() = 0;
    virtual void f4() = 0;
};

class Box : public IBox {
protected:
    int id;
public:
    Box() {
        id = 0;
    }
    Box(int boxId) {
        id = boxId;
    }
    Box(Box const& box) {
        id = box.id;
    }
public:
    virtual void f1() {
        printf("f1: %d\n", id);
    }
    virtual void f2() {
        printf("f2: %d\n", id);
    }
    virtual void f3() {
        printf("f3: %d\n", id);
    }
    virtual void f4() {
        printf("f4: %d\n", id);
    }
};

上面例子中,在IBox中依次定义了4个虚函数,分别为f1, f2, f3, f4

我将使用Windbg调试器进行测试。

测试过程分为次4次测试,每次测试调整虚函数数量为:

no1: vtbl: f1

no2: vtbl: f1 f2

no3: vtbl: f1 f2 f3

no4: vtbl: f1 f2 f3 f4

每次测试又包括了Debug和Release版本,下面是实际上的V表输出:

no1 /debug:

00df1023 00000000 00000000 00000000

no1 /release:

011b1000 00000048 00000000 00000000

no2 /debug:

00c41023 00c4119a 00000000 00000000

no2 /release:

00d21000 00d21020 00000048 00000000

no3 /debug:

00321023 00321230 0032122b 00000000

no3 /release:

011d1000 011d1020 011d1040 00000048

no4 /debug:

00a81023 00a8119a 00a81226 00a81221

00000000 005f005f 0061006e 00690074

no4 /release:

011b1000 011b1020 011b1040 011b1060

00000000 00000048 00000000 00000000

总结:

相信上面的结果已经一目了然了。我们可以得出初步结论:

在Debug下V表是以0结束;而在Release下V表是48结束。

对于其它类型的编译器,例如VC8,VC6或者G++而言,大家可以自行测试。

通过以上结论,我们可以容易得定位出一个V表到底有多少个虚函数!

posted on 2013-01-06 22:54 孤注一掷 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/bitxj/archive/2013/01/06/2848418.html

VS2008中V表结束标记的分析相关推荐

  1. ORACLE中seq$表更新频繁的分析

    在分析ORACLE的AWR报告时,发现SQL ordered by Executions(记录了按照SQL的执行次数排序的TOP SQL.该排序可以看出监控范围内的SQL执行次数)下有一个SQL语句执 ...

  2. VS2008中的ncb、pdb文件分析

    NCB是"No Compile Browser"的缩写,称为"无编译浏览文件".其中存放了供ClassView.WizardBar和Component Gall ...

  3. SpringBoot中访问Thymeleaf提示:元素类型 meta 必须由匹配的结束标记终止。

    场景 新建SpringBoot项目后整合Thymelaf后访问页面提示: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止. ...

  4. mysql中单个表脏读_如何在Outlook中单击邮件后立即将其标记为已读

    mysql中单个表脏读 Do you ever feel annoyed that Outlook doesn't mark messages as read as soon as you click ...

  5. Oracle中V$SESSION等各表的字段解释,Oracle官方解释

    https://www.cnblogs.com/grey-wolf/p/10119219.html Oracle中V$SESSION等各表的字段解释,Oracle官方解释 阅读目录 一.常用的视图 1 ...

  6. 【WORD文档部分消失】元素结束标记中的名称必须与开始标记中的元素类型相匹配

    [WORD 出错无法打开]元素结束标记中的名称必须与开始标记中的元素类型相匹配_yezizhangxinya的博客-CSDN博客_元素结束标记中的名称必须与开始标记的元素类型相匹配使用工具 Rebui ...

  7. C语言中输入一组正整数,以-1作为结束标记,统计输入正整数的个数,并计算其平均值。

    今天在做一道编程题时遇到这样一种输入方式:不知道输入个数为多少,苦思之下终于想出将scanf放入循环之内的方式. 雕虫小技不足挂齿. 请笑纳: 题目要求 输入一组正整数,以-1作为结束标记,统计输入正 ...

  8. linux源码文件名,Linux中文件名解析处理源码分析

    Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...

  9. 2021-IEEE论文-深度神经网络在文档图像表格识别中的应用现状及性能分析

    2021年5月12日收到, 2021年6月4日接受, 出版日期2021年6月9日, 当前版本日期2021年6月24日. 原论文下载地址 摘要 - Abstract   表格识别的第一阶段是检测文档中的 ...

最新文章

  1. $(function(){}) 与(function(){})()在执行时的优先级
  2. Java反序列化json内存溢出_反序列化JSON时出现线程错误
  3. Java EE 7社区调查结果!
  4. JAVA中线程同步的方法
  5. ThinkPHP医疗门诊病人挂号管理在线付款系统源码
  6. python模拟三次输入密码_python 3.0 模拟用户登录功能并实现三次错误锁定
  7. 两个简洁的页面:404和Loading
  8. 【OC】线性二次型(LQR)性能指标最优控制(1)
  9. Windows, 使用https访问网页提示此网站的安全证书有问题解决方法
  10. SaaS商城是什么,赢利点在哪儿?
  11. 路由器AP、路由、桥接模式有什么区别【详细介绍】
  12. 大风车吱呀吱悠悠地转
  13. 系统分析与控制_多智能体协同控制研究中各定位系统分析
  14. Linux在安装Python时:zipimport.ZipImportError: can‘t decompress data; zlib not available
  15. 【转载】linux top命令及参数详解
  16. Python 教你训练一个98%准确率的微博抑郁文本分类模型(含数据)
  17. 《python灰帽子》笔记四
  18. 擦地机器人排行榜_扫地机器人十大排行榜
  19. android 程序优化
  20. 关于如何在sublime text3中添加字体问题解决,保姆级教程

热门文章

  1. ajax get请求成功,成功()函数的AJAX GET请求
  2. 特殊mac地址文档_Mac颜值秒杀Win10?五款神器让Win10化身macOS
  3. java 抽象类对象_Java基础___面向对象__抽象类
  4. * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。
  5. linux 挂载san存储,新手看招:Linux操作系统下挂载SAN资源
  6. java 对比工具_Java几款性能分析工具的对比
  7. jsp中生成的验证码和存在session里面的验证码不一致的处理
  8. 写题过程中碰见的小问题
  9. 小猫的java基础知识点汇总(下)
  10. C++(STL):34--- multiset容器详解