jmp指令對應的機器碼
阿新 • • 發佈:2019-02-07
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表,因為很多程式都會迴圈去看又沒有被改回來,又會被修改回去。
地址 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表,因為很多程式都會迴圈去看又沒有被改回來,又會被修改回去。