以上有個問題:為什麼同樣的匯編指令JMP 12345678卻對應不同的機器碼呢?
首先,機器碼E9表明這是一個近跳轉(Near Jmp)
這裡需要補充下相關知識:
JMP分3種:
①短跳轉(Short Jmp,只能跳轉到256字節的范圍內),對應機器碼:EB
②近跳轉(Near Jmp,可跳至同一段范圍內的地址),對應機器碼:E9
③遠跳轉(Far Jmp,可跳至任意地址),對應機器碼: EA
短跳轉和近跳轉指令中包含的操作數都是相對於(E)IP的偏移。
遠跳轉指令中包含的是目標的絕對地址。
所以短/近跳轉會出現跳至同一目標的指令機器碼不同,不僅會不同,而且應該不同。
而遠跳轉中包含的是絕對地址,因此轉移到同一地址的指令機器碼相同 。
至此,我們知道了跳轉指令所對應的機器碼根據E(IP)計算出來的,那到底是怎麼計算的呢?
比如:
上圖的第一條指令:01007568 - E9 0BE13311 JMP 12345678
此時的EIP=01007568
12345678- 01007568 = 1133E110 這裡只是指向當前指令的EIP處,實際計算跳轉地址要去掉當前指令的長度,當前的跳轉指令需要5個字節, 1133E110 -5= 1133E10B
注意顛倒順序,高位在後