VS中的反彙編代碼學習


title: VS中的反彙編代碼學習
date: 2016-06-02 11:06:16
categories: 彙編
tags:
- 彙編
- Visual Studio


反彙編

程序在內存中的模型

編譯器爲程序分配的內存在邏輯上可分爲:代碼段、數據段、堆、棧

代碼段: 保存程序文本
數據段: 保存初始化的全局變量和靜態變量
BSS:    未初始化的全局變量和靜態變量
堆:      動態內存分配,向地址增大的方向增長
棧:      存放局部變量,向地址減小的方向增長

寄存器的作用

  • EAX:累加(Accumulator)寄存器,常用於函數返回值
  • EBX:基址(Base)寄存器,以它爲基址訪問內存
  • ECX:計數器(Counter)寄存器,常用作字符串和循環操作中的計數器
  • EDX:數據(Data)寄存器,常用於乘除法和I/O指針
  • ESI:源變址寄存器
    DSI:目的變址寄存器
  • ESP:堆棧(Stack)指針寄存器,指向堆棧頂部
  • EBP:基址指針寄存器,指向當前堆棧底部
  • EIP:指令寄存器,指向下一條指令的地址

彙編代碼常用指令

  • add:加法指令,第一個是目標操作數,第二個是源操作數,格式爲:目標操作數 = 目標操作數 + 源操作數;

  • sub:減法指令,格式同 add;

  • call:調用函數,一般函數的參數放在寄存器中

  • ret:跳轉會調用函數的地方。對應於call,返回到對應的call調用的下一條指令,若有返回值,則放入eax中;

  • push:把一個32位的操作數壓入堆棧中,這個操作在32位機中會使得esp被減4(字節),esp通常是指向棧頂的

  • pop:與push相反,esp每次加4(字節),一個數據出棧。pop的參數一般是一個寄存器,棧頂的數據被彈出到這個寄存器中;

  • mov:數據傳送。第一個參數是目的操作數,第二個參數是源操作數,就是把源操作數拷貝到目的一份。

  • xor:異或指令,這本身是一個邏輯運算指令,但在彙編指令中通常會見到它被用來實現清零功能。
    用 xor eax,eax這種操作來實現 mov eax,0,可以使速度更快,佔用字節數更少。

  • lea:取得第二個參數地址後放入到前面的寄存器(第一個參數)中。
    然而lea也同樣可以實現mov的操作,例如:lea edi,[ebx-0ch]
    方括號表示存儲單元,也就是提取方括號中的數據所指向的內容,然而lea提取內容的地址,這樣就實現了把(ebx-0ch)放入到了edi中,但是mov指令是不支持第二個操作數是一個寄存器減去一個數值的。

  • stos:串行存儲指令,它實現把eax中的數據放入到edi所指的地址中,同時edi後移4個字節,這裏的stos實際上對應的是stosd,其他的還有stosb,stosw分別對應1,2個字節。

  • jmp:無條件跳轉指令,對應於大量的條件跳轉指令。

  • jg:條件跳轉,大於時成立,進行跳轉,通常條件跳轉之前會有一條比較指令(用於設置標誌位)。

  • jl:小於時跳轉

move ax,[bx]

[]表示間接尋址

bx和[bx]的區別是:

前者操作數就是bx中存放的數,後者操作數是以bx中存放的數爲地址的單元中的數

比如:
bx中存放的數是40F6H,40F6H、40F7H兩個單元中存放的數是22H、23H,則:

move ax,[bx];//2223H傳送到ax中
move ax,bx;//40F6H傳送到ax中

ILT 是靜態函數跳轉表。

作用是記錄了一些函數的入口然後跳過去,每個跳轉jmp佔一個字節,然後就是一個四字節的內存地址,加起來爲五個字節。

函數的參數傳遞方式

函數調用規則指的是調用者和被調用函數間傳遞參數及返回參數的方法,在Windows上,常用的有

Pascal方式、WINAPI方式(_stdcall)、C方式(_cdecl)。

  1. _cdecl C調用規則

    參數從右到左進入堆棧
    在函數返回後,調用者要負責清除堆棧。
    這種調用方式通常會生成較大的可執行程序。

  2. _stdcall又稱爲WINAPI,調用規則爲

    參數從右到左進入堆棧
    被調函數在返回前自行清理堆棧

    這種方式生成的代碼比cdecl小

  3. Pascal調用規則(現在基本不用)

    參數從左到右進入堆棧
    被調函數在返回前自行清理堆棧
    不支持可變參數的函數調用

參考文章

  1. 淺析VS2010反彙編,[寒山拾得 的專欄],http://blog.csdn.net/u013467442/article/details/47060261
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章