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表到底有多少个虚函数!
转载于:https://www.cnblogs.com/bitxj/archive/2013/01/06/2848418.html
VS2008中V表结束标记的分析相关推荐
- ORACLE中seq$表更新频繁的分析
在分析ORACLE的AWR报告时,发现SQL ordered by Executions(记录了按照SQL的执行次数排序的TOP SQL.该排序可以看出监控范围内的SQL执行次数)下有一个SQL语句执 ...
- VS2008中的ncb、pdb文件分析
NCB是"No Compile Browser"的缩写,称为"无编译浏览文件".其中存放了供ClassView.WizardBar和Component Gall ...
- SpringBoot中访问Thymeleaf提示:元素类型 meta 必须由匹配的结束标记终止。
场景 新建SpringBoot项目后整合Thymelaf后访问页面提示: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止. ...
- mysql中单个表脏读_如何在Outlook中单击邮件后立即将其标记为已读
mysql中单个表脏读 Do you ever feel annoyed that Outlook doesn't mark messages as read as soon as you click ...
- Oracle中V$SESSION等各表的字段解释,Oracle官方解释
https://www.cnblogs.com/grey-wolf/p/10119219.html Oracle中V$SESSION等各表的字段解释,Oracle官方解释 阅读目录 一.常用的视图 1 ...
- 【WORD文档部分消失】元素结束标记中的名称必须与开始标记中的元素类型相匹配
[WORD 出错无法打开]元素结束标记中的名称必须与开始标记中的元素类型相匹配_yezizhangxinya的博客-CSDN博客_元素结束标记中的名称必须与开始标记的元素类型相匹配使用工具 Rebui ...
- C语言中输入一组正整数,以-1作为结束标记,统计输入正整数的个数,并计算其平均值。
今天在做一道编程题时遇到这样一种输入方式:不知道输入个数为多少,苦思之下终于想出将scanf放入循环之内的方式. 雕虫小技不足挂齿. 请笑纳: 题目要求 输入一组正整数,以-1作为结束标记,统计输入正 ...
- linux源码文件名,Linux中文件名解析处理源码分析
Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...
- 2021-IEEE论文-深度神经网络在文档图像表格识别中的应用现状及性能分析
2021年5月12日收到, 2021年6月4日接受, 出版日期2021年6月9日, 当前版本日期2021年6月24日. 原论文下载地址 摘要 - Abstract 表格识别的第一阶段是检测文档中的 ...
最新文章
- $(function(){}) 与(function(){})()在执行时的优先级
- Java反序列化json内存溢出_反序列化JSON时出现线程错误
- Java EE 7社区调查结果!
- JAVA中线程同步的方法
- ThinkPHP医疗门诊病人挂号管理在线付款系统源码
- python模拟三次输入密码_python 3.0 模拟用户登录功能并实现三次错误锁定
- 两个简洁的页面:404和Loading
- 【OC】线性二次型(LQR)性能指标最优控制(1)
- Windows, 使用https访问网页提示此网站的安全证书有问题解决方法
- SaaS商城是什么,赢利点在哪儿?
- 路由器AP、路由、桥接模式有什么区别【详细介绍】
- 大风车吱呀吱悠悠地转
- 系统分析与控制_多智能体协同控制研究中各定位系统分析
- Linux在安装Python时:zipimport.ZipImportError: can‘t decompress data; zlib not available
- 【转载】linux top命令及参数详解
- Python 教你训练一个98%准确率的微博抑郁文本分类模型(含数据)
- 《python灰帽子》笔记四
- 擦地机器人排行榜_扫地机器人十大排行榜
- android 程序优化
- 关于如何在sublime text3中添加字体问题解决,保姆级教程
热门文章
- ajax get请求成功,成功()函数的AJAX GET请求
- 特殊mac地址文档_Mac颜值秒杀Win10?五款神器让Win10化身macOS
- java 抽象类对象_Java基础___面向对象__抽象类
- * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。
- linux 挂载san存储,新手看招:Linux操作系统下挂载SAN资源
- java 对比工具_Java几款性能分析工具的对比
- jsp中生成的验证码和存在session里面的验证码不一致的处理
- 写题过程中碰见的小问题
- 小猫的java基础知识点汇总(下)
- C++(STL):34--- multiset容器详解