首页
社区
课程
招聘
[原创][分享]c++虚函数表的调用与修改
发表于: 2019-10-9 21:27 12001

[原创][分享]c++虚函数表的调用与修改

2019-10-9 21:27
12001

在c++中虚函数继承会生成一个虚函数表,来确定父类指针指向子类对象时所需要调用的具体的方法,用以实现多态。那么可不可以像静态方法一样直接调用类中的虚函数呢,答案是可行的

这个东西可以去百度

大致原理如下:

原理

如题,在子类对象中,首地址存在一个指向虚函数表的地址,虚函数表中保存着子类具体需要调用的函数地址,代码如下

我们先定义一个父类和两个子类,父类中有一个虚函数,子类分别重写这个虚函数

定义一个数组,数组中有一个父类对象和两个子类对象,循环调用数组元素的fun()函数,结果如下
正常结果

现在我们了解了虚函数表在内存中的位置,那么可以通过特定的方法直接调用虚函数

没有通过类对象,也可以调用到类内的函数

函数指针调用

同样,还有一种更为高级的写法(来自韦老师的代码)

上述代码也可以不通过类对象调用类内函数

我们知道,如果可以直接调用函数,那么应该有方法来替换掉虚函数表中函数的地址,把他改成我们想要执行的函数

现在,我们先来创建一个想要被执行的函数

把原来要执行的虚函数替换成我们想要让他执行的函数(来自韦老师的代码)


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

最后于 2019-10-9 21:30 被Knocked编辑 ,原因:
收藏
免费 11
支持
分享
最新回复 (14)
雪    币: 38
活跃值: (185)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
写的不错,看了以后学到了新东西,点赞
2019-10-9 21:36
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
,以前做XNF得游戏外挂时,修改人物得虚函数表实现某些功能。
2019-10-9 23:22
0
雪    币: 201
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
总结的很好,上课没懂的在你这看懂了
2019-10-10 08:53
0
雪    币: 381
活跃值: (165)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
韦一笑, 哈哈
这种通过虚表的直接调用方式, 如果是类似静态函数类型<函数内部没有使用该类的成员变量或者成员函数>, 是可行的...
但如果函数内部有用到 this 指针的话, 自己构造函数指针时应该怎么传 this 参数呢?
难道用内联汇编修改ecx? 调用完成后再改回来
2019-10-10 09:34
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
6
最后改虚表哪里.可以理解为虚表HOOK. using语法 新的C++语法.
2019-10-10 10:13
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
7
DlyWtF700 韦一笑, 哈哈 这种通过虚表的直接调用方式, 如果是类似静态函数类型, 是可行的... 但如果函数内部有用到 this 指针的话, 自己构造函数指针时应该怎么传 this 参数呢? 难道用内联汇 ...
方法很简单,自己写一个class,写一个成员函数,取到函数指针再进行替换即可。
当然内联也不是不可以。
2019-10-10 15:38
0
雪    币: 8764
活跃值: (5240)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
有缺点指出下,这个方法,没有传this指针,如果访问成员变量就要出错了。
2019-10-12 13:17
1
雪    币: 5514
活跃值: (2254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
能不能讲讲运算符重载?
2019-10-12 13:51
0
雪    币: 859
活跃值: (1290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
关键就是获取虚函数表在内存中的位置
2019-10-12 14:02
0
雪    币: 5
活跃值: (71)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
11
敏而好学 能不能讲讲运算符重载?
上一篇就是运算符重载
2019-10-12 15:46
0
雪    币: 104
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
请问一下为什么要加上最后一句呢?VirtualProtect(pVirtualFunctionTable, 4, old, &old);  测试的时候如果没有这句也是可以的
2019-10-12 19:24
0
雪    币: 5
活跃值: (71)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
13
让利润奔跑 请问一下为什么要加上最后一句呢?VirtualProtect(pVirtualFunctionTable, 4, old, &old); 测试的时候如果没有这句也是可以的
把内存属性改回来,不改当然也行啊
2019-10-12 19:55
0
雪    币: 104
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
Knocked 把内存属性改回来,不改当然也行啊
好的,谢谢您
2019-10-13 15:24
0
雪    币: 5
活跃值: (637)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看一篇好文章胜似看十篇半通不通的坏文章!  篇幅不需要多长,图件画得到位,言简意赅最好了
2023-6-9 13:51
0
游客
登录 | 注册 方可回帖
返回
//