在進行軟體分析的過程中,經常需要計算轉移指令機器碼或修改指定的**.雖然許許多多的輔助工具同樣可以做到這些事,但是掌握其原理還是必要的.
根據轉移的距離遠近,還可以分為以下幾類:.
短轉移:無條件轉移和條件轉移的機器碼都是兩個位元組.轉移範圍是-128~+127位元組.
長轉移:無條件轉移的機器碼是5哥位元組,條件轉移的機器碼是6哥位元組.這是因為條件轉移要用2個位元組表示其轉移型別(如je jg和jns),其他4哥位元組表示轉移偏移量.無條件轉移要用2個位元組表示其轉移(如je jg和jns),其他4個位元組表示轉移偏移量.轉移僅用乙個位元組就可以表示其轉移型別(jmp),其他4個位元組表示轉移偏移量.
子程式呼叫指令(call):不知道大家有其他語言基礎沒,有的話就好說了,其他語言中有子程式這個玩意.我們呼叫子程式就相當於call.call指令呼叫有兩類,一類是平常經常接觸到的,類似長轉移.另一類其呼叫的引數涉及到暫存器 堆疊等值.比較複雜,如"call dword ptr [eax+2]".條件轉移指令的轉移範圍是16位模式遺留下的,當時為了使**緊湊些,cpu開發人員只給目的分配了乙個位元組,這樣限制了跳轉的長度只能在255個位元組的範圍內.
指令格式
機器碼測試條件
如….則跳轉
call
e8----
無條件轉移指令
jmpeb
-----
無條件轉移
jo70
of=1
有溢位jno
71of=0
無溢位jb/jc/jnae
72cf=1
高於等於/不低於/無進製
jae/jnb/jnc
73cf=0
無進製jz/je
74zf=1
等於零/等於
jnz/jne
75zf=0
不為零/不等於
jbe/jna
76cf=1或zf=1
低於等於/不高於
ja/jnbe
77cf=0且zf=0
高於/不低於等於
js78
sf=1
符號為負號
jns79
sf=0
符號為正號
jp/jpe
7apf=1
奇偶位為偶(或1的個數為偶數個)
jnp/jpo
7bpf=0
奇偶位為奇(或1的個數為奇數個)
jl/jnge
7csf!=of
小於/不大於等於
jge/jnl
7dsf=of
大於等於/不小於
jle/jng
7esf!=of或zf=1
小於等於/不大於
jg/jnle
7fsf=of且zf=0
大於/不小於等於
有兩個因素制約轉移指令機器碼:乙個是上表列出的轉移型別;另乙個是轉移的位移量.
(1)短轉移指令機器碼計算例項
例如,**段中有一條如下所示的無條件轉移指令:
view plain
copy to clipboard
?
.........
;00401000 jmp 00401005
.........
;00401005 xor eax,eax
........
無條件短轉移的機器碼形式為ebxx,其中eb00~eb7f,是向後轉移,eb00~ebff是向前轉移.轉移指令的機器碼形式是:
位移量=目的位址-起始位址-跳轉指令本身的長度.
轉移指令機器碼="轉移類別機器碼"+"位移量"
(2)長轉移指令機器碼計算例項
例如:**段中有一條如下所示的的無條件轉移指令:
view plain
copy to clipboard
?
.......
;00401000 jmp 00402398
.......
;00402398 xor eax,eax
......
無條件轉移指令的長度是5個位元組,機器碼是e9,根據上面公式,此例轉移的位置為:
00402398h-00401000h-5h=00001393h
轉移指令機器碼="轉移類別機器碼'+"位移量"="e9"+'93 13 00 00'=e9 93 13 00 00
上面兩個例項演示轉移指令向後轉移(由低位址到高位址).如果是向前轉移(由高位址到低位址),計算方法一樣.
例如,**段中有一條如下所示的無條件轉移指令向前轉移:
view plain
copy to clipboard
?
;00401000 xor eax,eax
.....
;00402398 jmp 00401000
...
位移量=401000h-402398-5h=ffffec63h(取後32位)
轉移機器碼="e9'+"63 ec ff ff"=e9 63 ec ff ff
第八課 混合
第八課 混合 opengl中的混色 在opengl中實現混色的步驟類似於我們以前提到的opengl過程。接著設定公式,並在繪製透明物件時關閉寫深度快取。因為我們想在半透明的圖形背後繪製 物件。這不是正確的混色方法,但絕大多數時候這種做法在簡單的專案中都工作的很好。rui martins 的補充 正確...
第八課 陣列
1 宣告 int arr string str 2 分配空間 arr new int 5 3 宣告同時分配記憶體 int arr new int 5 4 初始化 int arr new int 5 int arr2 1 宣告 int arr string str 2 分配空間 1 直接為每一維分配空...
第八課 函式
1.id 標識 2.type 型別 3.value 值 關於可變物件的修改,可以參考下面程式理解 a 1,2,3 首先給a賦值列表,1,2,3 print a,id a 列印a,和a的id a 0 6 換掉列表a的第乙個值,改為6 print a,id a 列印a,和a的id,a的id和之前的一樣。...