zoukankan      html  css  js  c++  java
  • 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表到底有多少个虚函数!

  • 相关阅读:
    常见面试测试要点
    怎样在 CentOS/RHEL 7/6 上安装和配置 Sendmail 服务器
    Cannot uninstall 'pyparsing'. It is a distutils installed project
    Linux下校验SHA1和MD5的方法
    Linux查看进程启动时间和运行多长时间
    sqlplus -S参数表示什么意思?
    dnspython模块报错 AttributeError: 'CNAME' object has no attribute 'address'
    CentOS7中安装pip的方法
    四则运算中遇到的一个问题
    动手动脑
  • 原文地址:https://www.cnblogs.com/bitxj/p/2848418.html
Copyright © 2011-2022 走看看