-
-
[旧帖]
[原创]从逆向分析角度看C++虚函数,可以获邀请码吗
0.00雪花
-
发表于:
2013-7-28 10:13
3276
-
[旧帖] [原创]从逆向分析角度看C++虚函数,可以获邀请码吗
0.00雪花
谈到虚函数,我想很多朋友都应该知道虚函数表指针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 ; ---------------------------------------------------------------------------
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!