• <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
            • 良師益友,千年水牛,引擎猛男,分析怪獸,墨鏡酷哥,臺球高手....

            搜索

            •  

            最新評論

            婷婷久久综合九色综合绿巨人| 精品久久久无码人妻中文字幕豆芽| 激情久久久久久久久久| 精品久久久久久国产牛牛app| 亚洲Av无码国产情品久久| 久久精品国产久精国产一老狼| av无码久久久久不卡免费网站| 久久久久亚洲AV成人网| 亚洲精品无码久久千人斩| 久久国产成人午夜AV影院| 亚洲国产精品无码久久| 久久久国产精品| 青青草国产精品久久久久| 77777亚洲午夜久久多喷| 久久久久无码专区亚洲av| 无码人妻久久一区二区三区免费丨 | 72种姿势欧美久久久久大黄蕉| 无码任你躁久久久久久老妇| 久久精品国产亚洲网站| 亚洲欧美日韩久久精品第一区| 久久涩综合| 久久久久久国产精品美女| 久久综合中文字幕| AV无码久久久久不卡网站下载| 久久精品国产99久久久古代| 久久久噜噜噜久久| 久久精品国产清自在天天线| 久久精品国产免费一区| 国产精品久久久久久久久免费 | 狠狠精品久久久无码中文字幕| 久久久久久一区国产精品| 久久人人爽人人爽人人片AV麻豆| 成人午夜精品久久久久久久小说| 国产午夜精品理论片久久影视| 久久AV高清无码| 国产精品久久久久久一区二区三区| 久久棈精品久久久久久噜噜| 青青草原精品99久久精品66 | 久久午夜夜伦鲁鲁片免费无码影视| 亚洲欧美日韩久久精品| 中文字幕人妻色偷偷久久|