• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 101,  comments - 57,  trackbacks - 0

            1.代碼

            #include<iostream>

            using namespace std;

            class A
            public:
                
            virtual void fun1(){ cout<<"A::fun1"<<endl;}
                
            virtual void fun2(){cout<<"A::fun2"<<endl;}
            }
            ;


            class B : public A
            {     
            public:    
                
            virtual void fun1(){ cout<<"B::fun1"<<endl;}
                
            virtual void fun2(){cout<<"B::fun2"<<endl;}
            }
            ;

            void main(){
                
                
            void (A::*f1)();  
                
            void (A::*f2)();  
                
                A 
            *p=new B;
                
                f1 
            = &A::fun1;
                f2 
            = &A::fun2;
                (p
            ->*f1)();
                (p
            ->*f2)();

                printf(
            "f1 = %p f2 = %p\n", f1, f2);
                printf(
            "B::fun1 = %p, B::fun2 = %p\n"&A::fun1, &A::fun2);
                delete p;
                system(
            "pause");
                
            }

            2.結果
            B::fun1
            B::fun2
            f1 = 004010AA f2 = 004010B4
            B::fun1 = 004010AA, B::fun2 = 004010B4

            3.解惑
              i. 如果對于為什么f  = A::funx 卻輸出的是B::funx?
              ii. 為什么A::funx = B::funx

             以上兩個問題可以當作是一個,看看匯編就知道了,他們將生成一個虛函數的選擇函數,短小的函數負責選對應虛函數中的位置,根據對象的虛函數表而定,所以....

            4.匯編
              debug

            0040121E   .  C745 F0 AA104>mov     dword ptr [ebp-10], 004010AA
            00401225   .  C745 EC B4104>mov     dword ptr [ebp-14], 004010B4
            0040122C   .  8BF4          mov     esi, esp
            0040122E   .  8B4D E8       mov     ecx, [ebp
            -18]
            00401231   .  FF55 F0       call    [ebp-10]
            00401234   .  3BF4          cmp     esi, esp
            00401236   .  E8 A5870000   call    _chkesp
            0040123B   .  8BF4          mov     esi, esp
            0040123D   .  8B4D E8       mov     ecx, [ebp
            -18]
            00401240   .  FF55 EC       call    [ebp-14]
            00401243   .  3BF4          cmp     esi, esp
            00401245   .  E8 96870000   call    _chkesp
            0040124A   .  8B55 EC       mov     edx, [ebp
            -14]

            0040124D   .  52            push    edx                              ; /<%p>
            0040124E   .  8B45 F0       mov     eax, [ebp-10]                    ; |
            00401251   .  50            push    eax                              ; |<%p>
            00401252   .  68 48404300   push    00434048                         ; |format = "f1 = %p f2 = %p",LF,""
            00401257   .  E8 14820000   call    printf                           ; \printf
            0040125C   .  83C4 0C       add     esp, 0C
            0040125F   .  68 B4104000   push    004010B4                         ; /<%p> = Cplusplu.004010B4
            00401264   .  68 AA104000   push    004010AA                         ; |<%p> = Cplusplu.004010AA
            00401269   .  68 24404300   push    00434024                         ; |format = "B::fun1 = %p, B::fun2 = %p",LF,""
            0040126E   .  E8 FD810000   call    printf                           ; \printf

            00402300 > > \8B01          mov     eax, [ecx]                     // 第一個虛函數
            00402302   .  FF20          jmp     [eax]
            00402304      CC            int3
            00402305      CC            int3
            00402306      CC            int3
            00402307      CC            int3
            00402308      CC            int3
            00402309      CC            int3
            0040230A      CC            int3
            0040230B      CC            int3
            0040230C      CC            int3
            0040230D      CC            int3
            0040230E      CC            int3
            0040230F      CC            int3
            00402310 > >  8B01          mov     eax, [ecx]          // 第二個虛汗數
            00402312   .  FF60 04       jmp     [eax+4]



            release

            00401019  |> \33F6          xor     esi, esi
            0040101B  
            |>  8BCE          mov     ecx, esi
            0040101D  
            |.  E8 5E060000   call    00401680
            00401022  |.  8BCE          mov     ecx, esi
            00401024  |.  E8 67060000   call    00401690
            00401029  |.  68 90164000   push    00401690                         ;  Entry address
            0040102E  
            |.  68 80164000   push    00401680                         ;  Entry address
            00401033  |.  68 C4F04000   push    0040F0C4                         ;  ASCII "f1 = %p f2 = %p",LF
            00401038  |.  E8 2D310000   call    0040416A
            0040103D  
            |.  83C4 0C       add     esp, 0C
            00401040  |.  68 90164000   push    00401690                         ;  Entry address
            00401045  |.  68 80164000   push    00401680                         ;  Entry address
            0040104A  
            |.  68 A8F04000   push    0040F0A8                         ;  ASCII "B::fun1 = %p, B::fun2 = %p",LF
            0040104F  
            |.  E8 16310000   call    0040416A

            00401680   $  8B01          mov     eax, [ecx]
            00401682   .  FF20          jmp     [eax]
            00401684      CC            int3
            00401685      CC            int3
            00401686      CC            int3
            00401687      CC            int3
            00401688      CC            int3
            00401689      CC            int3
            0040168A      CC            int3
            0040168B      CC            int3
            0040168C      CC            int3
            0040168D      CC            int3
            0040168E      CC            int3
            0040168F      CC            int3
            00401690   $  8B01          mov     eax, [ecx]
            00401692   .  FF60 04       jmp     [eax+4]


            posted on 2008-03-08 18:12 margin 閱讀(311) 評論(0)  編輯 收藏 引用 所屬分類: C/C++ 、逆向工程
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            收藏夾

            常去的壇子

            • CVC電腦病毒論壇
            • 很多人說我是AV,我告訴他們:別瞧不起人,我們也能創造價值
            • 安全焦點
            • 黑客聚集的地方,一般是好酒最多的地方...
            • 看雪論壇
            • 國內最強的加密解密論壇,成醉其中經常夜不歸宿
            • 驅動開發論壇
            • 厭倦了啤的朋友們,來我們來整點白的...痛痛快快的BSOD也好過隔鞋瘙癢!

            我的朋友

            • Sen的blog
            • IDE方面資深的受害者...經常為一個變量的定義找不著北的痛苦程序員(深表同情)
            • 老羅的blog
            • 良師益友,千年水牛,引擎猛男,分析怪獸,墨鏡酷哥,臺球高手....

            搜索

            •  

            最新評論

            国内精品久久久久影院一蜜桃 | 久久久久波多野结衣高潮| 久久夜色tv网站| 久久久久人妻精品一区三寸蜜桃| 漂亮人妻被中出中文字幕久久| 国产真实乱对白精彩久久| 国产福利电影一区二区三区,免费久久久久久久精 | 精品国产一区二区三区久久| 一本大道加勒比久久综合| 99热精品久久只有精品| 欧美日韩精品久久久免费观看| 国产精品99久久免费观看| 久久免费高清视频| 国产精品久久新婚兰兰| 国产成人精品久久亚洲| 久久久久亚洲Av无码专| 日日狠狠久久偷偷色综合96蜜桃 | 91精品国产综合久久婷婷| 国内精品久久久久久久久| 色综合久久久久久久久五月| 久久久久亚洲精品男人的天堂| 国内精品伊人久久久久av一坑| 久久久久九国产精品| 国产精品美女久久久久久2018| 久久伊人色| 久久99国产综合精品免费| 久久人妻少妇嫩草AV蜜桃| 久久九九久精品国产| 国产成人久久精品麻豆一区| 久久99热精品| 国产亚洲欧美成人久久片 | 国产精品久久久久久搜索 | 久久精品国产91久久综合麻豆自制| 午夜视频久久久久一区 | 三上悠亚久久精品| 国产精品久久久香蕉| 亚洲中文字幕伊人久久无码| 久久夜色撩人精品国产小说| 久久一区二区三区99| 久久人人爽人人精品视频| 久久久久无码精品|