【破解小札記】--call、retn 和 retf


CALL指令
  CALL是子程序調用指令。
  CALL指令的基本格式如下:
  
CALL   地址1
  功能:調用地址1處的子程序

  CALL指令分爲兩種情況,一種是段內轉移;另一種是段間轉移。這兩種情況類似於JMP指令的相對跳轉和絕對跳轉(只不過相對跳轉的JMP指令會有short標識)。
  在CALL指令進行的是段內轉移的情況時,跟在CALL後面的地址1爲一個相對位移;而CALL指令進行的是段間轉移的情況時,跟在CALL後面的地址1爲一個絕對內存地址。
  段內轉移的CALL指令等價於兩條指令:
  push eip
  jmp   目的位置
  也就是說,執行段內轉移的CALL指令時,相當於先後執行以上兩條指令。
  段間轉移的CALL指令等價於三條指令:
  push CS
  push eip
  jmp   目的位置


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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章