教程 逆向反彙編第五課

2021-05-23 17:06:43 字數 3290 閱讀 8841

全域性變數作用於整個程式,一直都存在這個我們稍微了解任何一門程式語言都知道,他放在全域性變數的記憶體區;而區域性變數則是存在於函式的堆疊區,當函式呼叫結束後便消失.在大多數程式中,常數一般放在全域性變數中,如一些註冊版標記 測試版標記等.

在大多數情況下,在彙編**中識別全域性變數比其他結構要容易的多.全域性變數通常位於資料塊(.data)的乙個固定位址上,當程式需要訪問全域性變數時,一般會用乙個固定的硬編碼的位址直接對記憶體定址.比如說這樣:mov eax,dword ptr [4084c0h] ;直接呼叫全域性變數,其中4084c0h是全域性變數的位址.

全域性變數可以被同乙個檔案中所有的函式修改,某個函式改變了全域性變數的值,就能影響到其他函式,相當於各個函式間的傳遞通道.因此就可以利用全域性變數傳遞引數 傳遞函式返回值等.全域性變數在程式的全部執行過程中都占用記憶體單元,而不像區域性變數需要時才開闢空間.

來看乙個利用全域性變數傳遞引數的例項,具體**如下:

view plain

copy to clipboard

print

?

intz; //全域性變數z

intadd (intx,inty);   

intmain(void)   

intadd(intx,inty)     

將其編譯成exe然後反彙編後,**就是下面這種樣子了:

view plain

copy to clipboard

print

?

psuh ebp   

mov ebp,esp   

sub esp,00000008   

mov [ebp-04],00000005 ;[ebp-04]是區域性變數,放引數1   

mov [ebp-08],00000006 ;[ebp-08]是區域性變數,放引數2   

mov dword ptr [004084c0],07 ;對全域性變數[004084c0]初始化   

mov eax,dword ptr [ebp-08]   

psuh eax   

mov ecx,dword ptr [ebp-04]   

push ecx   

call 00401034   

add esp,000008   

xor eax,eax   

mov esp,ebp   

pop ebp   

ret  

;add (x,y)函式的**

view plain

copy to clipboard

print

?

push ebp   

mov ebp,esp   

mov eax,dword ptr [ebp+08] ;[ebp+08]為引數1   

add eax,dword ptr [ebp+0c] ;[ebp+0c]為引數2   

add eax,dword ptr [004084c0] ;呼叫了全域性變數[004084c0]   

pop ebp   

ret  

全域性變數4084c0h所在的區段是.data區塊,這個區塊的屬性是可讀可寫.

這種對記憶體直接定址的硬編碼方式,比較容易識別出這是乙個全域性變數.一般編譯器會將全域性變數放到可讀寫的區塊裡,如果放到唯讀區塊裡,那麼這是乙個常量.另外,與全域性變數類似的是靜態變數,都可以按直接方式定址等,所不同的是,靜態變數作用範圍是有限的,僅在定義這些函式內有效.

然後是陣列

陣列是相同資料型別的元素的集合.它們在記憶體中按照順序連續存放在一起.彙編狀態下訪問陣列一般是基址加上某變數來實現的.看例項:

view plain

copy to clipboard

print

?

intmain(void)   

;   

inti,s=0,b[3];   

for(i=0;i<3;i++)   

for(i=0,i<3;i+=)   

return0;   

}  

編譯完畢後,反彙編**如下:

view plain

copy to clipboard

print

?

sub esp,0c ;為區域性變數分配記憶體,用來存放b   

xor ecx,ecx ;s=0   

xor eax,eax ;i=0   

push esi   

push edi   

@@:    

mov edi,dword ptr [eax+407030] ;407030只想陣列a,即陣列的基址   

add eax,4 ;訪問陣列的索引   

add ecx,edi ;s=s+a   

cmp eax,0c   

mov dword ptr [esp+eax+4],ecx ;b=s   

jl @f   

lea esi,dword ptr[esp+8]   

mov edi,3 ;計數器   

@@:    

mov eax,dword pttr [esi] ;esi指向b陣列   

push eax   

push 40703c   

call 00401050 ;printf ("%d/n"

,b)   

add esp,8   

add esi,4 ;指向陣列下一元素   

dec edi   

jnz @f  

陣列在記憶體中可以存在於堆疊 資料段以及動態記憶體中.我這次說的陣列a就儲存在.data段中,其定址可以用"基址+偏移量" 來實現.

mov eax,[407030h+eax]

|     |

基址 偏移量

這種間接定址一般出現在給一些陣列或結構賦值情況下,其定址形式一般式[基址+n],其中基址可以是常量也可以是暫存器,為定值.隨著n值的不同,就可對結構中相應單元賦值了.   

b陣列放在堆疊中,這些堆疊是編譯時刻進行分配的.陣列在宣告時可以直接計算偏移位址,針對陣列成員定址是採用實際的偏移量完成的.

C 教程第五課 方法

本節課向你介紹c 的方法,其目的是 1.了解方法的結構格式 2.了解靜態和例項方法之間的區別 3.學會例項物件的使用 4.學會如何呼叫例項化的物件 5.學會方法的四種引數型別的使用 6.學會使用 this 引用 以往,對於每個程式來說,所有的工作都在main 方法中實現。這對於功能簡單的程式是合適的...

新編日語教程 第五課

基礎語法 例1 我是小王。1.甲 乙 是提示助詞,讀作 wa 接在名詞後面提示 主語 是助動詞,相當於中文的 是 也可以說相當於英語的 be動詞 甲 乙 的句型相當於漢語的 甲是乙 例2 我不是日本人。2.甲 乙 這是上面句型的否定句,相當於漢語的 甲不是乙 上面句型中的 的否定形式就是 例3 你是...

VBscript教程 第五課 VBScript常數

vb教程 第五課 vbscript常數 什麼是常數?常數是具有一定含義的名稱,用於代替數字或字串,其值從不改變。vbscript 定義了許多固有常數。詳細資訊,請參閱 vbscript 語言參考。建立常數 您可以使用 const 語句在 vbscript 中建立使用者自定義常數。使用 const 語...