jmp指令的機器碼編寫

2021-07-13 09:31:30 字數 1573 閱讀 6497

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 定義乙個位元組資料 ...