cdsfiui 发表于 2016-09-13 19:38

访问简单的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了。
我的程序错在哪里?

收到 发表于 2016-09-13 21:52

        C c1;
        C* p = &c1;
        pf func1 = (void(*)(void))*(int*)(*(int*)p);
        func1();

windoze 发表于 2016-09-14 00:05

这个程序core dump的原因是编译器和OS对你太友好了,本来你的电脑应该爆炸才对,至少也应该冒点烟。

收到 发表于 2016-09-14 21:12

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]
查看完整版本: 访问简单的vtable(虚函数表),不成功.我的程序错在哪里?