jmp指令對應的機器碼

2021-07-04 06:04:07 字數 1606 閱讀 3973

od隨便開啟乙個記事本,彙編幾條jmp指令,可以看到如下

位址           hex              反彙編

010073b4     - e9 7b9e8787      jmp 88881234

010073b9     - e9 769e8787      jmp 88881234

010073be     - e9 719e8787      jmp 88881234

010073c3     - e9 6c9e8787      jmp 88881234

010073c8     - e9 679e8787      jmp 88881234

010073cd     - e9 629e8787      jmp 88881234

010073d2     - e9 5d9e8787      jmp 88881234

010073d7     - e9 589e8787      jmp 88881234

010073dc     - e9 539e8787      jmp 88881234

010073e1     - e9 4e9e8787      jmp 88881234

010073e6     - e9 499e8787      jmp 88881234

可以看到同樣的彙編指令,在不同的位址上的機器碼不一樣。

有啥關係呢?看第一條:88881234-010073b4=87879e80

這個值跟e9後面的那個值差了5(e9後面那個值要反過來看,因為x86是大端模式)

同樣這個規律也使用與後面幾條。

為什麼呢?

下面摘錄乙個網上的

直接的jmp分3種 

short jump(短跳轉)機器碼 eb rel8 

只能跳轉到256位元組的範圍內 

near jump(近跳轉)機器碼 e9 rel16/32 

可跳至同乙個段的範圍內的位址 

far jump(遠跳轉)機器碼ea ptr 16:16/32 

可跳至任意位址,使用48位/32位全指標 

要注意的是,短跳轉和近跳轉指令中包含的運算元都是相對於(e)ip的偏移,而遠跳轉指令中包含的是目標的絕對位址,所以短/近跳轉會出現跳至同一目標的指令機器碼不同,不僅會不同,而且應該不同。而遠跳轉中包含的是絕對位址,因此轉移到同一位址的指令機器碼相同 

下面的指令是這樣計算偏移的. 

004a2fce    ^ e9 072bfeff   jmp     00485ada 

*****=== 

485ada-4a2fce=  fffe2b0c  這裡只是指向當前指令的ip處,實際計算跳轉位址要去 

掉當前指令的長度,當前的跳轉指令需要5個位元組,fffe2b0c-5=fffe2b07

我們一般就用e9了,所以計算公式就是 要跳轉的位址-指令所在的位置-5=機器碼

當然 如果我們要在記憶體中寫的話,肯定是寫機器碼的。也就是也e9 機器碼。

結合上面的博文,可以在被hook的位址出寫入jmp指令跳回到原來的地方,

被hook的位址-原來位址-5 = 機器碼(這個就是要寫入到 被hook位址的地方)

為什麼不直接修改ssdt表,因為很多程式都會迴圈去看又沒有被改回來,又會被修改回去。

jmp指令的機器碼編寫

1.首先直接的jmp分3種 short jump 短跳轉 機器碼 eb rel8 只能跳轉到256位元組的範圍內 near jump 近跳轉 機器碼 e9 rel16 32 可跳至同乙個段的範圍內的位址 far jump 遠跳轉 機器碼ea ptr 16 16 32 可跳至任意位址,使用48位 32...

彙編中call指令和其對應的機器碼

call這個指令很神奇,他和別的指令不太一樣 對比下,當我們執行 mov eax,1 的時候,他的對應機器碼是 66 b8 01 00 00 00 這其中 66 b8 對應的是 mov eax,x 後面的 01 00 00 00 就是 1 在32位中的little endian了 所以說,在對mov...

機器碼轉彙編指令

在用logisim初步畫完cpu電路後,配合educoder除錯電路。提交 到educoder後,後台會檢測錯誤資訊,根據報錯資訊中的週期數或者pc值,可以找到錯誤的指令機器碼。但是機器碼太抽象,因此使用下面的程式將指令機器碼翻譯成指令名稱,進而繼續除錯電路。32位mips指令翻譯器 輸入一條16進...