美文网首页
虚函数地址的vcall引入

虚函数地址的vcall引入

作者: 404Not_Found | 来源:发表于2021-09-03 08:58 被阅读0次
  • 作者: 雪山肥鱼
  • 时间:20210903 21:10
  • 目的: 虚函数地址的vcall 引入

研究代码如下

#include <iostream>
using namespace std;

class Myclass
{
public:
    virtual void myvirfunc1()
    {
        cout << "I am myvirfun1()" << endl;
    }
    virtual void myvirfunc2()
    {
        cout << "I am myvirfun2()" << endl;
    }
};

int main(int argc, char ** argv)
{
    printf("myvirfunc1 的 地址 :%p\n", &Myclass::myvirfunc1);//0x00481474
    printf("myvirfunc2 的 地址 :%p\n", &Myclass::myvirfunc2);//0x004812BC

    Myclass * pMyObj = new Myclass();
        //[0] = 0x00481037 {Project1.exe!Myclass::myvirfunc1(void)}
        //[1] = 0x004813f2 {Project1.exe!Myclass::myvirfunc2(void)}
    return 0;
}

只要不重新编译 虚函数表中存的虚函数地址就不会更改。


图片.png

vcall 的引入

正常流程 应该如所示:


虚函数内存布局与调用.png

对于直接使用 类 去调用函数

&MyClass::myvirfunc1();//00481474
&MyClass::myvirfunc2();//004812BC
vcall调用的地址.png

这两个地址不是虚函数的地址, 又是什么呢?

断点 打在 &MyClass::myvirfunc1:
offset MyCalss::`vcall{0} (00481474)

00481474  jmp         Myclass::`vcall'{0}' (048254Dh)  

0048254D  mov         eax,dword ptr [ecx]  //this

//虚函数地址
00481037  jmp         Myclass::myvirfunc1 (04827E0h) 
直接类内调用.png

最后一步的汇编不太懂。理解了再回来修改把。

所以这种调用方式是通过 vcall{n} 的方式兜了一圈,找到虚函数的。记住这个就行了。

相关文章

  • 3.0 C++远征:虚函数与虚析构函数实现原理

    2-7虚函数与虚析构函数实现原理 [TOC] 1.虚函数的实现原理 (1)引入概念:函数指针。 ​ 指向函数的...

  • CTF Pwn中的 UAF 及 pwnable.kr UAF w

    考察点 虚函数的内存地址空间 UAF 前置知识1:虚函数的内存地址空间 在C++中,如果类中有虚函数,那么它就会有...

  • C++ 重/难点

    1. 虚函数机制 之 5大问题 (1) 虚成员函数指针 vs. 虚成员函数地址 vtbl 中 的 偏移/数组索引 ...

  • 多态在内存中的实现--虚函数表

    引入 虚函数本是c++中的概念,但在java中应用非常广泛,因为虚函数是为了实现多态而生,需要为函数添加vritu...

  • C++多态分析:虚函数调用是如何实现的?

    什么是虚函数? 简单来说,虚函数是动态调用。相比于一般的函数调用在编译期确定了函数地址,而调用虚函数是在运行时决定...

  • C++——虚函数,纯虚函数,函数重载

    异质链表 虚函数虚函数主要用于多态 若一个类中含有虚函数则系统会自动的创建一个表,该表用于存放虚函数的入口地址称该...

  • 2.0 C++远征:虚析构函数

    2-4虚析构函数 [TOC] 1.为什么引进虚析构函数? 多态中存在的问题:内存泄漏。为了解决内存泄漏的问题,引入...

  • C++多态

    c++的多态总结是:当派生类被强制类型转换为基类时,派生类的虚函数表地址是不会被替换为基类的虚函数表地址的。 运行...

  • C++ 总结

    1.函数重载是为了实现 虚函数的副产品,函数重载引进了操作符重载,但也引入了工程函数的歧义性。 反例:定义了fun...

  • C++ 虚函数

    C++ 虚函数 虚函数 基类中使用virtual关键字声明的函数,称为虚函数。虚函数的实现,通过虚函数表来实现的。...

网友评论

      本文标题:虚函数地址的vcall引入

      本文链接:https://www.haomeiwen.com/subject/nixlwltx.html