跳转指令与机器码
跳轉指令和對應的機器碼
0xE8 CALL 后面的四個字節是地址
0xE9 JMP 后面的四個字節是偏移
0xEB JMP 后面的二個字節是偏移
0xFF15 CALL 后面的四個字節是存放地址的地址
0xFF25 JMP 后面的四個字節是存放地址的地址
0x68 PUSH 后面的四個字節入棧
0x6A PUSH 后面的一個字節入棧
x32與x64系統區別
32為的x86系統中,CALL/JMP指令的使用個形式為“地址 指令 CALL/JMP”。
例如:
FF15 XXXXXXXX 指令用于調用API,其中XXXXXXXX “絕對地址”只想IAT區域的某個位置。x64系統中仍使用相同指令,但解析方法不同。
首先指令地址由原來的4個字節變為8個字節,然后,x86中FF15指令后跟著4個字節的絕對地址(VA)。若x64中也采用與x86相同的方式,則FF15后面應該跟著8個字節的絕對地址(VA),這樣指令的長度就增加了。但是實際x64系統中指令后面仍然跟這著4個字節大小的地址,只不過該地址被解析為“相對地址”(RVA)。所以上面的指令,FF15后面的4個字節(A212E)被識別為相對地址,并通過下面的方法將相對地址轉換為絕對地址。
00007FFC DAEF0ECC + A212E + 6 = 7FF CDAF93000
- 00007FFC DAEF0ECC :CALL 指令地址
- A212E :相對地址
- 6 :CALL指令(FF15XXXXXXXX)長度
- 000007FF CDAF93000 :變換后的絕對地址
CALL指令地址 + 相對地址 + CALL指令(FF15XXXXXXXX)長度 = 變換后的絕對地址
總結
- 上一篇: Spectre漏洞
- 下一篇: 360加固分析(一)