首页
社区
课程
招聘
[旧帖] [原创]从逆向分析角度看C++虚函数,可以获邀请码吗 0.00雪花
发表于: 2013-7-28 10:13 3276

[旧帖] [原创]从逆向分析角度看C++虚函数,可以获邀请码吗 0.00雪花

2013-7-28 10:13
3276

谈到虚函数,我想很多朋友都应该知道虚函数表指针VPTR和虚函数表VTABLE,如果不清楚的朋友,建议先看看侯捷先生翻译的《深度探索C++对象模型》:)

刚开始的时候,我仅仅知道虚函数的多态机制是通过VPTR和VTABLE操控的,完全地相信书上所描述的,并没有亲自去证明过,或许是因为那时候我还没有接触到逆向分析吧:)

提几个问题:

1.      VPTR的大小如何确定?

2.      VPTR在的类实例中的偏移值是多少?

3.      VPTR是如何索引到需要调用的函数的?

4.      VTABLE中函数的顺序是如何确定的?

 
了解上述问题的朋友,可以关闭这个窗口了:)

考虑如下代码:

#include <cstdio>

class Base
{
public:
  int i;
  char c;
  double d;

  Base()
  {
    i  = 4;
    c  = 'A';
    d  = 2.0;
  }
  
  virtual void Virtual_Func_A()
  {
    printf("Virtual_Func_A()\n");
  }
  virtual void Virtual_Func_B()
  {
    printf("Virtual_Func_B()\n");
  }
};

int main(void)
{
  Base* b = new Base;
  b->Virtual_Func_A();
  b->Virtual_Func_A();

  return 0;
}
#include <cstdio>

class Base
{
public:
  virtual void Common_Func()
  {
    printf("Base::Common_Func()\n");
  }
  virtual void Base_Func()
  {
    printf("Base::Func()\n");
  }
};

class Derived : public Base
{
public:
  virtual void Common_Func()
  {
    printf("Derived::Common_Func()\n");
  }
  virtual void Derived_Func()
  {
    printf("Derived::Func()\n");
  }
};

int main(void)
{
  Base* b = new Base;
  b->Common_Func();
  b->Base_Func();

  Derived* d = new Derived;
  d->Common_Func();
  d->Base_Func();
  d->Derived_Func();

  return 0;
}
.text:00401000    push    esi
.text:00401001    push    4               ; 为 Base::VPTR 申请 4 个字节的栈空间
.text:00401003    call    ??2@YAPAXI@Z    ; operator new(uint)
.text:00401008    add     esp, 4
.text:0040100B    test    eax, eax
.text:0040100D    jz      short loc_401019
.text:0040100F    mov     dword ptr [eax], offset Base_VPTR ; *b 的堆空间放入 Base::VPTR
.text:00401015    mov     esi, eax
.text:00401017    jmp     short loc_40101B
.text:00401019 ; ---------------------------------------------------------------------------

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (3)
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持原创
2013-7-28 15:25
0
雪    币: 218
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持你的分享
2017-8-29 20:36
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
感谢分享~
2017-8-29 20:45
0
游客
登录 | 注册 方可回帖
返回
//