VS2008中V表结束标记的分析

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

康奈尔笔记法

一页有三栏:主栏、副栏、思考栏。主栏主要是在右上角,主要记录学到的内容。副栏在左边,主要是简单概括重点。思考栏在底部,主要是记录收获、感悟。 主栏:在听讲或阅读时把重要的内容或知识的要点记录在右侧的区域&…

string类的常用函数

string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2"hello";都是正…

Memcached 内存管理(一)

2019独角兽企业重金招聘Python工程师标准>>> Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用。这里简单谈一下我对…

相同字符串的string对象不等

今天遇到一个问题,用复制构造函数构造出来的String和同一个字符串的string对象居然不相等,即A和B是相同字符串的string,调用Cstring(A)之后,C和B不相等。 后来改成C string(A.c_str())后,C和B才相等转载于:https://www.cnblogs.c…

jitter 如何优化网络_网络推广如何做好网站SEO优化

网络推广做好网站整站SEO优化的方式有很多,如何才能做好SEO优化?网络推广如何做好网站SEO优化一、定位网站关键词SEO给一个网站刚开始做优化的时候,不是立马就设置关键词,而是先分析该网站主要是做什么产品/服务。知道网站的目的是…

PHP+Mysql查询上一篇和下一篇文章实例

PHPMysql查询上一篇和下一篇文章实例 简单的PHPMysql查询上一篇和下一篇文章实例,并输出上一篇和下一篇文章的标题和链接,适合新手学习获取当前浏览文章id: 1 $id isset($_GET[id]) > 0 ? intval($_GET[id]) : ""; 下一篇文章…

openssh-在win7上的搭建

2019独角兽企业重金招聘Python工程师标准>>> 参考 http://www.cnblogs.com/ericsun/archive/2012/06/10/2544413.html 1.下载OpenSSH:http://sourceforge.net/projects/sshwindows/files/OpenSSH%20for%20Windows%20-%20Release/3.8p1-1%2020040709%20B…

LeetCode8——String to Integer (atoi)(自己编写atoi函数)

题目: 参考解法: I think we only need to handle four cases: discards all leading whitespaces sign of the number overflow invalid input int myAtoi(char* str) {int sign 1, base 0, i 0;while (str[i] ) { i; }//去掉空格if (str[i…

5类6类7类网线对比_孩子们长高的黄金时期是从3月到5月,这阶段多吃6类食物长得快...

原标题:孩子们长高的黄金时期是从3月到5月,这阶段多吃6类食物长得快每个家长都希望孩子长大。当他们看到自己的孩子比同龄的孩子矮时,他们会非常担心。他们特别担心孩子的成长。事实上,儿童的生长发育有明显的季节性,一…

javascript之Partial Application

这一次来学习一下Partial Application。我们先看一下函数的介绍,在维基上有简单的介绍: 在数学中,一个函数是描述每个输入值对应唯一输出值的这种对应关系,符号为 f(x)。例如,表达式 f(x)x2表示了一个函数 f&#xff0…

根据对象的属性去重,获取新数组

() let cateArr arr.reduce(function (arr, current) { hash[current.category_id] ? : hash[current.category_id] true && arr.push(current); return arr }, []); () 转载于:https://www.cnblogs.com/gkxNB/p/11428433.html

快速地创建快顶尖的医学图像处理控件ImageGear Medical

ImageGear Medical控件使开发人员能够快速地创建快顶尖的医学图像处理控件,可以对DICOM文件进行浏览、创建、编辑,可以控制图像所有切面显示和打印,对图像进行注释,以及支持ISIS和TWAIN扫描和100多种图像文件格式,可用…

jj为什么会变大变小_为什么上过太空的种子果实会变大?射线会让生物向大变异吗?...

在科幻电影中,变异是不正常力量的重要来源之一,所谓“富人靠科技,穷人靠变异!”。但其实科幻在某种意义上一起在误导着我们,多数科幻作品其实是以科学为外衣的魔法故事,比如“爱你三千遍”的钢铁侠&#xf…

公司人才招聘管理系统

课程设计名称 公司人才招聘管理系统 完成时间(起、止) 所属小组 课程设计的目的 1、学习和巩固C语言程序设计的方法,充分体会C语言在程序设计方面的强大功能和独特之处; 2、了解用C语言开发项目的一般过程,…

RabbitMQ 示例-生产者-消费者-direct-topic-fanout

这是生产者和消费者2个项目, 包含 direct,topic,fanout模式下的消费,springboot rabbitmq 代码地址:https://github.com/duende99/RabbitMQ.git转载于:https://www.cnblogs.com/duende99/p/11440435.html

CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎

CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5 2D 渲染引擎,可以用于游戏开发。它是开源的,跨平台的,与现代的浏览器和移动设备兼容。CutJS 提供了一个类似 DOM 树的数据模型来编写应用程序,并在内部…

LeetCode65——Valid Number(使用DFA)来判断字符串是否为数字

题目: 参考解法:(DFA) class Solution { public:bool isNumber(string str) {int state0, flag0; // flag to judge the special case "."while(str[0] ) str.erase(0,1);//delete the prefix whitespace while(str[s…

win10商店下载位置_Win10删应用商店下载记录|Win10删Microsoft Store下载记录

Win10中的Microsoft Store,也称微软应用商店,提供给Windows用户下载安装使用各种应用,因此有些用户,会在这里下载软件,不过,在使用时间长了,也是会产生下载记录的。这篇文章是PE吧给大家带来的W…

HDU 1000 A + B Problem

Problem DescriptionCalculate A B.InputEach line will contain two integers A and B. Process to end of file.OutputFor each case, output A B in one line.Sample Input1 1Sample Output2题意:求输入的两个数之和。分析:注意题目暗含循环输入输出…

背景框代码

新建一个html文件,放入即可github: https://github.com/duende99/background_XXX.git 转载于:https://www.cnblogs.com/duende99/p/11442302.html