免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1109 | 回复: 3
打印 上一主题 下一主题

[C++] 访问简单的vtable(虚函数表),不成功.我的程序错在哪里? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-13 19:38 |只看该作者 |倒序浏览
我想用一个小程序探索一个虚函数表的性质。
通常gcc/vc编译器都把多态对象的第一个函数作为虚函数表的指针。那么我把一个对象指针,强转成指向虚函数表(数组)的指针,再通过该指针来直接调用一个类的成员函数:

  1. typedef void (*pf)();
  2. struct C
  3. {
  4.     virtual void f(){
  5.       printf("weird\n");
  6.     }
  7. };
  8. int main()
  9. {
  10.     C c1;
  11.     C* p=&c1;
  12.     pf* pvtable=(pf*)p;
  13.     pf func1=pvtable[0];
  14.     (*func1)();
  15.     return 0;
  16. }
复制代码

运行到函数调用的这个语句的时候,程序core dump了。
我的程序错在哪里?

论坛徽章:
0
2 [报告]
发表于 2016-09-13 21:52 |只看该作者
        C c1;
        C* p = &c1;
        pf func1 = (void(*)(void))*(int*)(*(int*)p);
        func1();

评分

参与人数 1信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2016-09-14 00:05 |只看该作者
这个程序core dump的原因是编译器和OS对你太友好了,本来你的电脑应该爆炸才对,至少也应该冒点烟。

评分

参与人数 1信誉积分 +5 收起 理由
lxyscls + 5 赞一个!

查看全部评分

论坛徽章:
0
4 [报告]
发表于 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信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP