170521 逆向 虛函式

2021-08-01 10:54:02 字數 1310 閱讀 9994

1625-5 王子昂 總結《2023年5月21日》 【連續第232天總結】

a.加密與解密虛函式

b.c++的物件導向模型的最核心概念是虛函式。

虛函式是在程式執行時定義的函式,虛函式的位址是不能再編譯時 確定的,只能在呼叫即將進行時確定

對所有虛函式的引用通常都放在乙個專用陣列,虛函式表,中,每個至少使用乙個虛函式的物件裡面都具有的虛函式表指標

虛函式通常通過指向虛函式表的指標間接加以引用

eg源**:

class csum

virtual int sub(int a, int b)

}; void main()

用vc++編譯後的彙編**為:

push esi

push 4

call 00401060;new(), 位新建物件例項分配4位元組

add esp,4

test eax,eax

je short 00401019

mov dword ptr [eax], 4050a0;將4050a0h寫入建立的物件例項之中。

4050a0h是csum類虛函式表的指標(vrbl),表中的元素是csum類的虛函式,它們指向csum函式的成員

mov esi,eax;esi=vtbl

jmp short 0040101b

xor esi,esi;用null指向物件例項指標,該分支在記憶體分配失敗才會來到,空指標將啟用seh

mov eax,dword ptr [esi];eax=*btbl=**add()

push 2

push 1

mov ecx,esi;bcx=this

call dword ptr [eax];對虛汗的呼叫,此時eax=*vtbl=**add(),即call 401040

mov edx,dword ptr [esi]

push 2

push 1

mov ecx,esi;ecx=this

call dword ptr [edx+4];call [vtbl+4]

pop esi

retn

這段**首先呼叫new函式分配類所需的記憶體,呼叫成功後eax儲存分配記憶體的指標,然後將物件例項指向csum類虛函式表(vtbl)4050a0h。

而此時在vtbl中有兩組資料:

[vtbl]=401040h;add()

[vtbl+4]=401050h;sub()

也就是說,虛函式的使用仍然是利用this指標找到物件位址,然後再根據vtbl找到所呼叫的虛函式的位址的

c.明日計畫

加密與解密控制語句

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...

虛函式 純虛函式

一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...

虛函式 純虛函式

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標引用來訪問基類和派生類中的同名函式。include using namespace std class student student類成員函式的實現 宣告抽象基類shape class shape virtual float...