反汇编的call和retn
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
  ⽽带有操作数的RETN/RETF指令则是在POP之后,执⾏ESP=ESP+操作数1。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。