访问简单的vtable(虚函数表),不成功.我的程序错在哪里?
我想用一个小程序探索一个虚函数表的性质。通常gcc/vc编译器都把多态对象的第一个函数作为虚函数表的指针。那么我把一个对象指针,强转成指向虚函数表(数组)的指针,再通过该指针来直接调用一个类的成员函数:
typedef void (*pf)();
struct C
{
virtual void f(){
printf("weird\n");
}
};
int main()
{
C c1;
C* p=&c1;
pf* pvtable=(pf*)p;
pf func1=pvtable;
(*func1)();
return 0;
}
运行到函数调用的这个语句的时候,程序core dump了。
我的程序错在哪里?
C c1;
C* p = &c1;
pf func1 = (void(*)(void))*(int*)(*(int*)p);
func1(); 这个程序core dump的原因是编译器和OS对你太友好了,本来你的电脑应该爆炸才对,至少也应该冒点烟。 class dtest
{
public:
dtest()
{
}
virtual ~dtest()
{
}
virtual void vvv()
{
printf("ddddddd\n");
}
int o;
int b;
protected:
private:
};
void ffff()
{
printf("ffffff\n");
}
int main()
{
DWORD oldpro;
dtest *pt0 = new dtest;
VirtualProtect((void*)(*(int*)pt0), 4096, PAGE_EXECUTE_READWRITE, &oldpro);
*((int*)*(int*)pt0+1)=(int)&ffff;//修改虚函数表
pt0->vvv();//这里调用ffff()函数
return 0;
}
页:
[1]