博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2008中V表结束标记的分析
阅读量:4640 次
发布时间:2019-06-09

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

在逆向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

你可能感兴趣的文章
用java向mysql数据库中插入数据为空
查看>>
项目中非常有用并且常见的ES6语法
查看>>
mac 端口转发方案
查看>>
[2017.02.23] Java8 函数式编程
查看>>
Knowledge Point 20180305 数据在计算机中的表示
查看>>
谈谈对web标准的理解
查看>>
求二进制中1的个数(编程之美2.1)
查看>>
58前端内推笔试2017(含答案)
查看>>
Java学习笔记
查看>>
sprintf 和strcpy 的差别
查看>>
打表打表何谓打表?
查看>>
MPEG4与.mp4
查看>>
实验5
查看>>
git 下载 安装
查看>>
录制终端信息并回放
查看>>
JS中window.event事件使用详解
查看>>
ES6深入学习记录(一)class方法相关
查看>>
《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
查看>>
C语言对mysql数据库的操作
查看>>
SQL Server 数据库备份
查看>>