1.首先直接的jmp分3種 :
short jump(短跳轉)機器碼 eb rel8
只能跳轉到256位元組的範圍內
near jump(近跳轉)機器碼 e9 rel16/32
可跳至同乙個段的範圍內的位址
far jump(遠跳轉)機器碼ea ptr 16:16/32
可跳至任意位址,使用48位/32位全指標
2.下面來看乙個網上的例子:
位址
hex
反彙編
010073b4
- e9 7b9e8787
jmp88881234
010073b9
- e9 769e8787
jmp88881234
010073be
- e9 719e8787
jmp88881234
010073c3
- e9 6c9e8787
jmp88881234
010073c8
- e9 679e8787
jmp88881234
010073cd
- e9 629e8787
jmp88881234
010073d2
- e9 5d9e8787
jmp88881234
010073d7
- e9 589e8787
jmp88881234
010073dc
- e9 539e8787
jmp88881234
010073e1
- e9 4e9e8787
jmp88881234
010073e6
- e9 499e8787
jmp88881234
(可以看到同樣的彙編指令,在不同的位址上的機器碼不一樣)
要注意的是,
短跳轉和近跳轉指令中包含的運算元都是相對於(e)ip的偏移,而遠跳轉指令中包含的是目標的絕對位址,所以短/近跳轉會出現跳至同一目標的指令機器碼不同,不僅會不同,而且應該不同。而遠跳轉中包含的是絕對位址,因此轉移到同一位址的指令機器碼相同
第一條:88881234-010073b4=87879e80
這個值跟e9後面的那個值差了5(e9後面那個值要反過來看,因為x86是大端模式)
3.指令是這樣計算偏移的.
004a2fce
^ e9 072bfeff
jmp
00485ada
485ada-4a2fce=
fffe2b0c
這裡只是指向當前指令的ip處,實際計算跳轉位址要去
掉當前指令的長度,當前的跳轉指令需要5個位元組,fffe2b0c-5=fffe2b07
計算公式: 要跳轉的位址-指令所在的位置-5=機器碼
結合上面的博文,可以在被hook的位址出寫入jmp指令跳回到原來的地方,
被hook的位址-原來位址-5 = 機器碼(這個就是要寫入到 被hook位址的地方)。
jmp指令對應的機器碼
od隨便開啟乙個記事本,彙編幾條jmp指令,可以看到如下 位址 hex 反彙編 010073b4 e9 7b9e8787 jmp 88881234 010073b9 e9 769e8787 jmp 88881234 010073be e9 719e8787 jmp 88881234 010073c3...
機器碼轉彙編指令
在用logisim初步畫完cpu電路後,配合educoder除錯電路。提交 到educoder後,後台會檢測錯誤資訊,根據報錯資訊中的週期數或者pc值,可以找到錯誤的指令機器碼。但是機器碼太抽象,因此使用下面的程式將指令機器碼翻譯成指令名稱,進而繼續除錯電路。32位mips指令翻譯器 輸入一條16進...
機器碼和偽指令
m ov 立即數受限的原因 因為根據下圖,mov 的機器指令中立即數最多能有 12位,其中有四位代表移位,所以立即數最多能有8位。偽指令有兩種 操作類偽指令和定義類偽指令 定義類偽指令 global 定義乙個全域性的變數 data 定義資料段 ascii 定義乙個字串 byte 定義乙個位元組資料 ...