教程 逆向反彙編第六課

2021-05-23 17:07:45 字數 2721 閱讀 5297

既然要玩逆向,驅動那我們就算不懂但至少要了解下c/c++語言,c++是一門支援oo的語言,對面想物件的軟體開發提供了豐富的支援庫.但要高效 正確的使用c++中的繼承 多型等語言的特性,必須對這些特性性的底層實現有一定得了解.

其實就核心概念而言,c++的物件模型的核心概念並不多,但最核心的是虛函式.虛函式是在程式執行時刻定義的函式,虛函式的位址是不能在編譯時刻確定的,它只能在呼叫即將進行之前加以確定.對所有虛函式引用通常放在乙個專用陣列--虛函式表中,每個至少使用乙個虛函式的物件裡面都具有虛函式表指標.虛函式通常通過指向虛函式表的指標間接的加以呼叫.

將例項的普通成員改編為虛函式呼叫,來看看vc在虛函式上面是如何處理的.

view plain

copy to clipboard

print

?

classcsum    

virtual

intsub(inta,intb)    

};    

voidmain()    

這是c的乙個簡單**,我們看反彙編後的**是如何的樣式,

view plain

copy to clipboard

print

?

push    esi    

push    4    

call    00401060    

add        esp,4            ;為新建物件實力分配4位元組記憶體    

test    eax,eax    

jeshort00401019    

mov        dword ptr [eax],4050a0    ;將4050a0h寫入建立的物件例項中4050a0h是csum類虛函式表的指標,表中的元素是csum類的虛函式,他們指向csum函式的成員    

mov        esi,eax            ;esi是4050a0hcsum類虛函式表的指標    

jmpshort0040101b    

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

0040101b:    

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

push    2    

push    1    

mov        ecx,esi            ;ecx=this

call    dword ptr [eax]            ;對虛函式的呼叫,此時eax=**add(),也就是call 401040    

mov        edx,dword ptr [esi]    

push    2    

push    1    

mov        ecx,esi    

call    dword ptr [edx+4]    

pop        esi    

retn   

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

vtbl裡有兩組資料

[vtbl]=401040h

[vtbl+4]=401050h

進一步看看這兩個指標是什麼內容,

;401040h內容如下:add函式

view plain

copy to clipboard

print

?

mov        eax,dword ptr [esp+8]    

mov        ecx,dword ptr [esp+4]    

add        eax,ecx    

retn    8   

401050h函式如下:sub 函式

view plain

copy to clipboard

print

?

mov        eax,dword ptr [esp+4]    

mov        ecx,dword ptr [esp+8]    

sub        eax,ecx    

retn  8   

原來虛函式是通過浙西iangxuhanshubiaode指標間接地加以呼叫的,程式仍然使用ecx作為this指標的載體傳遞給虛成員函式,並且利用兩次間接定址,得到虛函式的正確位址,從而執行

view plain

copy to clipboard

print

?

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

push    2    

push    1    

mov        ecx,esi                                ;ecx=this

call    dword ptr [eax]  

Android OpenGL教程 第六課

android opengl 教程 第六課紋理對映 在這一課裡,我將教會你如何把紋理對映到立方體的六個面。激動的時刻來了,載入了。複習一下android載入的知識。放乙個png到drawable裡面。新增乙個工具類,方便我們使用。這樣我們是不是可以直接用 bitmap mbitmap dataman...

第六課 字型

a.字型系列 font family times new roman times,serif b.字型樣式 font style normal 正常 正常顯示文字 font style italic 斜體 以斜體字顯示的文字 font style oblique 傾斜的文字 文字向一邊傾斜 和斜體非...

第六課 列表

序列是python中最基本的 種資料結構。序列 於儲存 組有序的資料,所有的資料在序列當中都有 個唯 的位置 索引 並且序列中的資料會按照新增的順序來分配索引。資料結構指計算機中資料儲存的 式。python 基礎教程 第二版 對序列的定義為 資料結構。資料結構是通過某種方式 例如對元素進行編號 組織...