var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年08月08日

    C++ 虚函数表

    分类:

    C++ 虚函数表解析介绍了一般继承多重继承有无虚函数覆盖,虚函数表的情况。

    取虚函数表的地址:

    #include <iostream> 

    using std::cout;

    using std::endl;

     

    class Base {

    public:

          virtual void f() { cout << "Base::f" << endl; }

          virtual void g() { cout << "Base::g" << endl; }

          virtual void h() { cout << "Base::h" << endl; }

    };

     

    typedef void(*Fun)(void);

    int _tmain(int argc, _TCHAR* argv[])

    {

          Base b;

          Fun pFun = NULL;

     

          cout << "虚函数表地址:" << *(int*)(&b)<< endl;//虚函数表首地址

          cout << "虚函数表第一个地址:" << (int*)*(int*)(&b) << endl;//该地址内的内容为第一个函数地址

        cout << "虚函数表 第一个函数地址:" << *(int*)*(int*)(&b) << endl;

          cout << "虚函数表第二个地址:" << (int*)(*(int*)(&b) +1  << endl;

          cout << "虚函数表第三个地址:" << (int*)(*(int*)(&b) +2  << endl;

     

          // Invoke the first virtual function 

          pFun = (Fun)*((int*)*(int*)(&b));

          pFun();

          return 0;

    }

    静态分析看到:

    .rdata:00417824 ; const Base::`vftable'

    .rdata:00417824 ??_7Base@@6B@   dd offset j_?f@Base@@UAEXXZ

    .rdata:00417824                                         ; DATA XREF: Base::Base(void)+26o

    .rdata:00417824                                         ; Base::f(void)

    .rdata:00417828                 dd offset j_?g@Base@@UAEXXZ ; Base::g(void)

    .rdata:0041782C                 dd offset j_?h@Base@@UAEXXZ ; Base::h(void)

    注:.idata是导入表,OS在加载应用程序时要根据导入表来连接动态库;.data是初始化数据;.bss是未初始化数据;.rdata是只读的初始化数据。   

     

    【资源】

    C++中外部程序的调用

    轻松解决内存泄露(不依赖MFC)VC使用CRT调试功能检测内存泄漏收藏

    API Hook完全手册揭开木马的神秘面纱

    Windows下进程通信的几种方式

    分享到:

    历史上的今天:

    内存泄漏检测工具 2007年08月08日