无条件转移jmp详细执行过程

时间:2022-02-01 04:49:19

无条件短转移机器码为EBxx,其中EB00~EB7F是向后转移(高址方向),EB80~EBFF是向前转移(低址方向),因为80~FF的二进制为1000 0000~1111 1111,高位为“1”代表负数。

转移指令的机器码 = “转移类别机器码” + “位移量”

位移量 = 目的地址 - 起始地址 - 跳转指令本身长度

跳转后执行EIP位于跳转指令下一行,这时应执行EIP + “位移量”处的指令,如下例:

向后转移:

汇编指令:

...

:401000 jmp 401005

...

:401005 xor eax,eax

...

内存中:

:00401000 EB jmp指令
:00401001 03 jmp指令
:00401002 ... 位移量
:00401003 ... 位移量
:00401004 ... 位移量
:00401005 33 xor指令
:00401006 c0 xor指令

位移量 = 401005 - 401000 - 2 = 3(注意这里为十六进制) 所以机器码为EB03 执行完转移指令后EIP为401002,所以之后应该执行EIP + “位移量” = 401002 + 3 = 401005 处的指令。
向前转移: 汇编指令: ... :401000xor eax,eax ... :401005 jmp 401000 ... 内存中:
:00401000 33 xor指令-位移量
:00401001 c0 xor指令-位移量
:00401002 ... 位移量
:00401003 ... 位移量
:00401004 ... 位移量
:00401005 EB jmp指令-位移量
:00401006 F9 jmp指令-位移量
位移量 = 401000 - 401005 - 2 = -7 (十六进制为F9)
所以机器码为EBF9 执行完转移指令后EIP为401007,所以之后应该执行EIP + “位移量” = 401007 + (-7) = 401000 处的指令。
无条件长转移于此类似,只是跳转指令占5个字节,E900000000~E97FFFFFFF 表示向后转移(高址方向),E980000000~E9FFFFFFFF 表示向前转移(低址方向)。