教程 逆向反彙編第八課

2021-05-23 17:07:45 字數 2567 閱讀 9668

在進行軟體分析的過程中,經常需要計算轉移指令機器碼或修改指定的**.雖然許許多多的輔助工具同樣可以做到這些事,但是掌握其原理還是必要的.

根據轉移的距離遠近,還可以分為以下幾類:.

短轉移:無條件轉移和條件轉移的機器碼都是兩個位元組.轉移範圍是-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

print

?

.........    

;00401000 jmp 00401005    

.........    

;00401005 xor eax,eax    

........  

無條件短轉移的機器碼形式為ebxx,其中eb00~eb7f,是向後轉移,eb00~ebff是向前轉移.轉移指令的機器碼形式是:

位移量=目的位址-起始位址-跳轉指令本身的長度.

轉移指令機器碼="轉移類別機器碼"+"位移量"

(2)長轉移指令機器碼計算例項

例如:**段中有一條如下所示的的無條件轉移指令:

view plain

copy to clipboard

print

?

.......    

;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

print

?

;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和之前的一樣。...