反汇编RETN 0x0c的理解
生活随笔
收集整理的這篇文章主要介紹了
反汇编RETN 0x0c的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.CALL指令:
CALL指令可不是如喚指令,而是子程序調用指令。那么匯編語言中的子程序是什么呢?子程序能被其它程序調用,在實現某種功能后能自動返回到調用程序去的程序。其最后一條指令一定是返回指令,故能保證得新返回到調用它的程序中去。也可調用其它子程序,甚至可自身調用。
我們可以暫時把子程序理解為一個代碼段,是一個模塊化的代碼面。這個代碼段可以完成某一特定功能,當程序在執行過程中需要用到這一功能,將會進入這個代碼段。這塊代碼段執行完畢后,會跳出這塊代碼段。而進入代碼段這一過程就是子程序的調用,也就是這里所說的CALL指令所要完成的工作。
反匯編經常看到的CALL指令的基本格式如下:
CALL?? 地址1
功能:調用地址1處的子程序
CALL指令分為兩種情況,一種是段內轉移;另一種是段間轉移。這兩種情況類似于JMP指令的相對跳轉和絕對跳轉(只不過相對跳轉的JMP指令會有short標識)。
在CALL指令進行的是段內轉移的情況時,跟在CALL后面的地址1為一個相對位移;而CALL指令進行的是段間轉移的情況時,跟在CALL后面的地址1為一個絕對內存地址。
(1) 段內轉移 的CALL指令等價于兩條指令:
push eip
jmp?? 目的位置
也就是說,執行段內轉移的CALL指令時,相當于先后執行以上兩條指令。
(2) 段間轉移 的CALL指令等價于三條指令:
push CS
push eip
jmp?? 目的位置
2.RETN/RETF指令:
按照前面講CALL指令舉的那個例子,CALL指令是進入子程序的指令,而例子中所說的跳出子程序這一過程也需要2條指令,它們是RETN/RETF。
RETN/RETF是跳出子程序的指令,被稱為返回指令。RETN指令用于從段內轉移CALL進的子程序中返回;RETF指令用于從段間轉移CALL進的子程序中返回。
RETN/RETF在反匯編代碼中呈現的形式如下:
RETN
RETN?? 操作數1
RETF
RETF?? 操作數1
RETN等價于一條指令:POP?? eip
RETF等價于兩條指令:
POP?? eip
POP?? CS
CALL指令可不是如喚指令,而是子程序調用指令。那么匯編語言中的子程序是什么呢?子程序能被其它程序調用,在實現某種功能后能自動返回到調用程序去的程序。其最后一條指令一定是返回指令,故能保證得新返回到調用它的程序中去。也可調用其它子程序,甚至可自身調用。
我們可以暫時把子程序理解為一個代碼段,是一個模塊化的代碼面。這個代碼段可以完成某一特定功能,當程序在執行過程中需要用到這一功能,將會進入這個代碼段。這塊代碼段執行完畢后,會跳出這塊代碼段。而進入代碼段這一過程就是子程序的調用,也就是這里所說的CALL指令所要完成的工作。
反匯編經常看到的CALL指令的基本格式如下:
CALL?? 地址1
功能:調用地址1處的子程序
CALL指令分為兩種情況,一種是段內轉移;另一種是段間轉移。這兩種情況類似于JMP指令的相對跳轉和絕對跳轉(只不過相對跳轉的JMP指令會有short標識)。
在CALL指令進行的是段內轉移的情況時,跟在CALL后面的地址1為一個相對位移;而CALL指令進行的是段間轉移的情況時,跟在CALL后面的地址1為一個絕對內存地址。
(1) 段內轉移 的CALL指令等價于兩條指令:
push eip
jmp?? 目的位置
也就是說,執行段內轉移的CALL指令時,相當于先后執行以上兩條指令。
(2) 段間轉移 的CALL指令等價于三條指令:
push CS
push eip
jmp?? 目的位置
2.RETN/RETF指令:
按照前面講CALL指令舉的那個例子,CALL指令是進入子程序的指令,而例子中所說的跳出子程序這一過程也需要2條指令,它們是RETN/RETF。
RETN/RETF是跳出子程序的指令,被稱為返回指令。RETN指令用于從段內轉移CALL進的子程序中返回;RETF指令用于從段間轉移CALL進的子程序中返回。
RETN/RETF在反匯編代碼中呈現的形式如下:
RETN
RETN?? 操作數1
RETF
RETF?? 操作數1
RETN等價于一條指令:POP?? eip
RETF等價于兩條指令:
POP?? eip
POP?? CS
而帶有操作數的RETN/RETF指令則是在POP之后,執行ESP=ESP+操作數1。
==============================================================================================
call編輯
這個命令是訪問子程序的一個匯編基本指令。也許你說,這個我早就知道了!別急請繼續看完。 call真正的意義是什么呢?我們可以這樣來理解:1.向堆棧中壓入下一行程序的地址;2.JMP到call的子程序地址處。例如: 00401029 . E8 DA240A00 call 004A3508 0040102E . 5A pop edx 在執行了00401029以后,程序會將0040102E壓入堆棧,然后JMP到004A3508地址處!RET編輯
與call對應的就是RET了。對于RET我們可以這樣來理解:1.將當前的ESP中指向的地址出棧;2.JMP到這個地址。堆棧平衡原理編輯
如果要返回父程序,則當我們在堆棧中進行堆棧的操作的時候,一定要保證在RET這條指令之前,ESP指向的是我們壓入棧中的地址。總結
以上是生活随笔為你收集整理的反汇编RETN 0x0c的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7下反汇编程序程序基址改变问题
- 下一篇: __declspec(naked)详解