匯編 JMP 詳解
關鍵詞說明
RVA: 相對虛擬地址(Relative Virtual Address),在內存中相對於PE文件裝入地址的偏移位置,是一個相對地址。
JMP 的 3 種類型
- 短跳轉(Short Jmp,只能跳轉到256字節的范圍內),對應機器碼:EB
- 近跳轉(Near Jmp,可跳至同一段范圍內的地址),對應機器碼:E9
- 遠跳轉(Far Jmp,可跳至任意地址),對應機器碼: EA
短跳轉 和 近跳轉 指令中包含的操作數都是相對於(E)IP的偏移。
遠跳轉指令中包含的是目標的絕對地址。
所以短/近跳轉會出現跳至同一目標的指令機器碼不同,不僅會不同,而且應該不同。
而遠跳轉中包含的是絕對地址,因此轉移到同一地址的指令機器碼相同 。
至此,我們知道了跳轉指令所對應的機器碼根據E(IP)計算出來的,那到底是怎么計算的呢?
JMP 目標地址計算方式
目標地址 = 當前指令地址 + 指令長度 + RVA
舉例說明
如圖: 想要從 001392DB 處跳轉到 001392E1 這個地址,那么E9后面應該跟多少呢?
RVA = 001392E1 - 001392DB - 5
在計算機中使用上面的公式計算結果就是 RVA = 1 所以后面應該是跟 E9 01 00 00 00
其中 5 是指令長度 E9 后面需要跟 4 字節的地址,所以指令(1)+地址(4) = 5
ps: 如果計算結果是負數,則數值后面應該用 FF 填充,如負一則應該用 E9 01 FF FF FF