C++获取虚表中的函数并调用
生活随笔
收集整理的這篇文章主要介紹了
C++获取虚表中的函数并调用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
虛表的基本概念
在此鏈接中
https://blog.csdn.net/qq78442761/article/details/84800688
?
獲取虛表中函數(shù)的原理
對象空間的最開始四字節(jié)內容,就是虛表(虛函數(shù)列表)的地址,叫虛指針
把虛表強轉為int*,這樣虛表就剛好是一個int型數(shù)組了
如:
可以改為如下的寫法:
定義函數(shù)指針去調用,如下所示:
?
如何找虛表的尾巴:
int *pp = (int*)*((int*)*(int*)base + 3);?
完整例子
這里給出完整的例子,源碼如下:
#include <iostream> using namespace std;class Base{ public:virtual void print1(){cout << "Base print1 called" << endl;}virtual void print2(){cout << "Base print2 called" << endl;}virtual void print3(){cout << "Base print3 called" << endl;}virtual ~Base(){cout << "Base disconstruction called" << endl;} };class SubClass: public Base{ public:void print1(){cout << "SubClass print1 called" << endl;}void print3(){cout << "SubClass print3 called" << endl;}virtual ~SubClass(){cout << "SubClass disconstruction called" << endl;}};void main(){Base *base = new SubClass;typedef void (*p)();((p)(*((int*)*(int*)base + 0)))();((p)(*((int*)*(int*)base + 1)))();((p)(*((int*)*(int*)base + 2)))();int *tail = (int*)*((int*)*(int*)base + 3);int *tailAdd1 = (int*)((int*)*(int*)base +4);delete base;getchar(); }運行截圖如下:
尾部如下:
?
總結
以上是生活随笔為你收集整理的C++获取虚表中的函数并调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-QML与C++交互
- 下一篇: s3c2440移植MQTT