第六部分 函式的工作原理一

2021-06-06 00:49:00 字數 2308 閱讀 2529

寫這篇文章得益於我最近錢林松、趙海旭寫的新書《c++反彙編與逆向分析》,一直希望學習相關的技術,但是一直沒有開始,看到此書後,激發起了我以前的興趣,最近一直在讀這本書,今日將我了解到的知識分享給大家。

首先讓我們來看一段最簡單的**

#includevoid func(int first, int second)

int main()

通過vc6++ 在win7 上編譯得到的彙編**如下:

public	_func

; comdat _func

_text segment

_func proc near ; comdat

; 4 :

pop edi ;還原暫存器

pop esi ;還原暫存器

pop ebx ;還原暫存器

mov esp, ebp ;還原 esp

pop ebp ;彈出呼叫者的棧底 即main函式的棧底

ret 0

_func endp

_text ends

public _main

extrn __chkesp:near

; comdat _main

_text segment

_first$ = -4

_second$ = -8

_main proc near ; comdat

; 8 :

pop edi ;還原暫存器

pop esi ;還原暫存器

pop ebx ;還原暫存器

add esp, 72 ; 00000048h 平衡棧空間

cmp ebp, esp ;棧平衡檢測

call __chkesp ;棧平衡檢測函式

mov esp, ebp ;還原 esp

pop ebp ;彈出呼叫者的棧底 注意main函式不是第乙個函式,它也是被其他函式呼叫的,有興趣的讀者請自行研究

ret 0

_main endp

_text ends

end

首先 我們

知識補充

(1)esp:棧指標暫存器(extendedstackpointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。

(2)ebp:基址指標暫存器(extendedbasepointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底部。

上圖為本測試例項的棧空間

細心的讀者會發現 彙編**中   add esp, 8  ;修正esp的操作

為什麼要做這部操作呢,因為在呼叫func 函式之前,main 函式中還做了兩次push 的入棧操作,將first second 兩個引數壓入棧中。呵呵可能有些讀者已經發現了,這就是所謂的 _cdecl 函式呼叫,由呼叫者清棧的操作,我們平時所用的變參的函式必須由這種方式實現,因為被調函式是無法清除到底有多少引數。還有其他的呼叫方式,如 _stdcall, _fastcall, thiscall 等。這裡給大家乙個鏈結

下面給大家乙個_stdcall的例子

#includevoid _stdcall func(int first, int second)

int main()

; 4    : 

mov esp, ebp

pop ebp

ret 8

; 10   : 	func(first,second);

mov eax, dword ptr _second$[ebp]

push eax

mov ecx, dword ptr _first$[ebp]

push ecx

call _func@8

; 11 : return 0;

xor eax, eax

通過觀察上面的彙編**main函式在呼叫func後,沒有做平衡棧的操作,在func函式中 ret 8 這個指令做了平衡棧的操作。

本例中沒有給出讀者函式是如何返回返回值的,讀者可以自行實驗,其實如果是簡單的變數,是通過暫存器返回的,如果是陣列,結構體呢??

ps:技術拙劣,如有錯誤請指教

第六部分總結(51 54)

這一部分主要學習了jquery的節點新增 刪除 替換 複製等操作。外插 1 從後面插after insertafter 效果一樣,寫法不同 2 從前面 efore insertafter 效果一樣,寫法不同 刪除 刪除指定元素 remove detach 效果一樣,寫法不同,如li.remove i...

第六部分 屬性3

attributeusage屬性 除了用於標註常規c 型別的自定義屬性以外,還可以使用attributeusage屬性定義你使用這些屬性的方式.文件記錄的attributeusage屬性呼叫慣例如下 attributeusage validon,allowmultiple allowmultiple...

MySQL入門,第六部分,關係代數

關係代數是一種集合操作為基礎過程化查詢語言,特點 運算物件是關係,運算結果亦為關係 運算物件 關係 運算結果 關係 運算子 四類 運算子型別 運算子含義 集合運算子 並集合運算子 差 集合運算子 交 集合運算子 廣義笛卡爾積 比較運算子 大於比較運算子 大於等於 比較運算子 小於 比較運算子 小於等...