C++虛表引出的問題笆制。黑客指日可待绅这。

筆者環(huán)境:

$ gcc --version
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
$ uname -a
Linux debian9-64-Desktop 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux

虛表:

#include<iostream>

typedef void (*fun)(void) ;

 class A{
     private:
     virtual void printA(){
         std::cout<<"hello A"<<std::endl;
     }
     virtual void printB(){
         std::cout<<"hello B"<<std::endl;
     }
     void printC(){
         std::cout<<"hello C"<<std::endl;
     }
 };

int main(int argc,char * argv[]){
    A a;
    long* pa =(long*)&a;
    long* ppa = (long*)(*pa);
    void (*funA)(void) =(void (*)(void))(*ppa);
    funA();
    fun funB =(fun)(*(++ppa));
    funB();
    return 0;
}

問題一:

請問上例中的,sizeof(A) 有多少個(gè)字節(jié)在辆?

在64位機(jī)证薇,是8個(gè)字節(jié)

在32位機(jī)度苔,是4個(gè)字節(jié),

問題二:

請問上例中棕叫,為什么要使用 long * 呢林螃?

因?yàn)楣P者的環(huán)境是64位機(jī)奕删,void* 是占用8個(gè)字節(jié)的俺泣。所以這里使用long 方便我調(diào)用下一個(gè)虛方法,只需要通過 long* +1 即可

問題三:

請問上例中完残,為啥會取了那么多次的指針伏钠,分別是干什么的。

long* pa =(long*)&a; 表示取得類的地址

long* ppa = (long*)(*pa); 表示取得虛表的地址

void (*funA)(void) =(void (*)(void))(*ppa); 表示取得在虛表中首個(gè)虛函數(shù)的地址

++ppa 表示地址往后偏移8個(gè)字節(jié)谨设,就是第二個(gè)虛函數(shù)的地址

問題四:

請問上例中熟掂,如果編譯出可執(zhí)行文件,可以看得到 printC 的函數(shù)符號嗎扎拣?為什么赴肚?

讓我們執(zhí)行編譯然后驗(yàn)證一下:

$ g++ -I. main.cpp

$ objdump -Tt a.out  |grep print
0000000000000b0a  w    F .text 0000000000000037              _ZN1A6printBEv
0000000000000ad2  w    F .text 0000000000000037              _ZN1A6printAEv

經(jīng)過 粉碎命名 ,但是也依舊可以看到是沒有 printC 的簽名的二蓝。

那我們換種方式

$ strings a.out |grep print
vfwprintf
printB
vwprintf
vswprintf
printA
_ZN1A6printAEv
printC
_ZN1A6printBEv
_ZN1A6printCEv
_ZN1A6printBEv
_ZN1A6printAEv

可以看到也是有的誉券,證明這個(gè)符號在,并且存在在代碼區(qū)刊愚。

問題五:

請問上例中踊跟,如果我要按照你這樣調(diào)用 printC 可不可以呢?

經(jīng)過一通詢問鸥诽,與查找商玫,發(fā)現(xiàn),可以使用這里的文章所列舉的方法進(jìn)行調(diào)用

參考

虛表(C++)virtual table

C++訪問類中私有成員變量的方法

C++獲取private的變量-偷走private

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牡借,一起剝皮案震驚了整個(gè)濱河市拳昌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钠龙,老刑警劉巖炬藤,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俊鱼,居然都是意外死亡刻像,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門并闲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來细睡,“玉大人,你說我怎么就攤上這事帝火×镝悖” “怎么了湃缎?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蠢壹。 經(jīng)常有香客問我嗓违,道長,這世上最難降的妖魔是什么图贸? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任蹂季,我火速辦了婚禮,結(jié)果婚禮上疏日,老公的妹妹穿的比我還像新娘偿洁。我一直安慰自己,他們只是感情好沟优,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布涕滋。 她就那樣靜靜地躺著,像睡著了一般挠阁。 火紅的嫁衣襯著肌膚如雪宾肺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天侵俗,我揣著相機(jī)與錄音锨用,去河邊找鬼。 笑死坡慌,一個(gè)胖子當(dāng)著我的面吹牛黔酥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洪橘,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跪者,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熄求?” 一聲冷哼從身側(cè)響起渣玲,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弟晚,沒想到半個(gè)月后忘衍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卿城,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年枚钓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑟押。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搀捷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫩舟,我是刑警寧澤氢烘,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站家厌,受9級特大地震影響播玖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饭于,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一蜀踏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镰绎,春花似錦脓斩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莺褒。三九已至烛缔,卻和暖如春驱负,著一層夾襖步出監(jiān)牢的瞬間媳否,已是汗流浹背妒峦。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工伤疙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谤民,地道東北人沸停。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓膜毁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愤钾。 傳聞我的和親對象是個(gè)殘疾皇子瘟滨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355