虛函式的識別1

2021-07-22 16:47:07 字數 3402 閱讀 9678

1.有虛函式的類在編譯中會加入乙個隱藏資料成員,虛表指標。這就使得類的大小比資料成員的大小大4。

2.使用預設建構函式時,建構函式中會出現虛表指標,特徵是二次跳轉後到跳轉表,虛函式表。

cvirtual

myvirtual;

004076d5 8d 4d

e8lea

ecx,[myvirtual]

004076d8

e8a5

c6ff

ffcall

cvirtual

::cvirtual (0403d82h) ;呼叫預設建構函式

;虛表

_memmove:

00403d78 e9 c3 bf 08

00jmp memmove (048fd40h)

charnode::length:

00403d7d e9 7e 5d 01

00jmp charnode::length (0419b00h)

cvirtual::cvirtual:

00403d82 e9 49

3800

00jmp cvirtual::cvirtual (04075d0h) ;跳轉

__get_thread_local_invalid_parameter_handler:

00403d87 e9 74 a1 05

00jmp _get_thread_local_invalid_parameter_handler (045df00h)

;預設建構函式

cvirtual::cvirtual:

004075d0

55push ebp

004075d1 8b ec mov ebp,esp

004075d3 81 ec cc 00

0000

sub esp,0cch

004075d9 53 push ebx

004075da 56 push esi

004075db 57 push edi

004075dc 51 push ecx

004075dd 8d bd 34 ff ff ff lea edi,[ebp-0cch]

004075e3 b9 33 00 00 00 mov ecx,33h

004075e8 b8 cc cc cc cc mov eax,0cccccccch

004075ed f3 ab rep stos dword ptr es:[edi]

004075ef 59 pop ecx

004075f0 89 4d f8 mov dword ptr [this],ecx

004075f3 8b 45 f8 mov eax,dword ptr [this]

004075f6 c7 00 54 8e 49 00 mov dword ptr [eax],offset cvirtual::`vftable' (0498e54h)

; 虛表指標

004075fc 8b 45 f8 mov eax,dword ptr [this]

004075ff 5f pop edi

00407600

5e pop esi

00407601

5b pop ebx

00407602

8b e5 mov esp,ebp

00407604

5d pop ebp

00407605 c3 ret

;虛表中位置 004034bd 00402ca2 一次跳轉

00498e53 ?? ?? ??

00498e54 bd 34

4000 a2 mov ebp,0a2004034h

00498e59

2c 40

sub al,40h

00498e5b 00

00

004034bd 二次跳轉

@_guard_check_icall_nop@4:

004034b8 e9 93

7100

00jmp _guard_check_icall_nop (040a650h)

cvirtual::getnumber:

004034bd e9 5e 41

0000

jmp cvirtual::getnumber (0407620h)

___acrt_show_wide_message_box:

004034c2 e9 29 d2 05

00jmp __acrt_show_wide_message_box (04606f0h)

00402ca2 二次跳轉

__expand_base:

00402c9d e9 de 61

0700

jmp _expand_base (0478e80h)

cvirtual::setnumber:

00402ca2 e9 b9 49

0000

jmp cvirtual::setnumber (0407660h)

3.虛函式的識別:

類中隱式定義了乙個資料成員

該資料成員在首位址處,佔4位元組

建構函式會將此資料成員初始化為某個陣列的首位址

這個位址屬於資料區,是相對固定的位址

在這個資料內,每個元素都是函式指標

他們被呼叫時,第乙個引數必然是this指標

在這些函式內部,很有可能會對this指標使用相對間接的使用方式

虛函式的識別2

1.虛函式呼叫過程 void showspeak cperson pperson pperson showspeak 00407cfe 8b 45 08mov eax,dword ptr pperson 00407d01 8b 10 mov edx,dword ptr eax 取虛表首位址 0040...

C 虛函式和純虛函式(1)

學習過c 類的繼承與多型的時候,但是很多的童鞋回過頭來都忘記之中關於虛函式和純虛函式的細節,甚至將他們混淆。虛函式是動態多型性的基礎,其呼叫的方式是動態聯編 又稱晚期聯編,簡單解釋為只有在程式執行時才決定呼叫基類的還是子類的,系統會根據基類指標所指向的物件來決定要呼叫的函式 非虛函式與其相反,是靜態...

C 虛函式和純虛函式(1)

寫在前面的 學習過c 類的繼承與多型的時候,但是很多的童鞋回過頭來都忘記之中關於虛函式和純虛函式的細節,甚至將他們混淆。虛函式是動態多型性的基礎,其呼叫的方式是動態聯編 又稱晚期聯編,簡單解釋為只有在程式執行時才決定呼叫基類的還是子類的,系統會根據基類指標所指向的物件來決定要呼叫的函式 非虛函式與其...