日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

x86指令格式

發(fā)布時(shí)間:2023/12/24 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 x86指令格式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)習(xí)于逆向工程核心原理IA-32指令章節(jié)

格式


x86指令格式

指令前綴

出現(xiàn)特定操作碼時(shí)用作補(bǔ)充說(shuō)明,圖中的冒號(hào)前的64就是指令前綴

操作碼

實(shí)際的指令,如圖中的FF、89、80都是操作碼

ModR/M

輔助說(shuō)明操作碼的操作數(shù)(操作數(shù)的個(gè)數(shù)、種類[寄存器、內(nèi)存地址、常量]),圖中的

SIB

用來(lái)輔助說(shuō)明ModR/M,輔助尋址,圖中的兩個(gè)24都是SIB。操作碼的操作數(shù)為內(nèi)存地址時(shí),需要與ModR/M一起使用

位移

操作碼的操作數(shù)為內(nèi)存地址時(shí),用來(lái)表示位移操作,圖中的D0A44500為位移,圖中小端序排列

立即數(shù)

操作碼的操作數(shù)為常量時(shí),該常量就被稱為立即數(shù),圖中的02000000為立即數(shù)

實(shí)例


課后練習(xí)

 1 00F63689 : E8 C5F9FFFF
 2 00F6368E : 6A 58
 3 00F63690 : 68 A037F600
 4 00F63695 : E8 72040000
 5 00F6369A : 33DB
 6 00F6369C : 895D E4
 7 00F6369F : 895D FC
 8 00F636A2 : 8D45 98
 9 00F636A5 : 50
10 00F636A6 : FF15 FC10F600
11 00F636AC : C745 FC FEFFFFFF
12 00F636B3 : C745 FC 01000000
13 00F636BA : 64:A1 18000000
14 00F636C0 : 8B70 04
15 00F636C3 : BF 5CC2F600
16 00F636C8 : 6A 00
17 00F636CA : 56
18 00F636C0 : 57

操作數(shù)類型的含義看附件處

E8 C5F9FFFF
E8 : near callf64 Jz
Jz操作數(shù),看附件處可知是指相對(duì)偏移量,F(xiàn)FFFF9C5為call目的地址的偏移量(向上),所以偏移為-63B(FFFFF9C5是一個(gè)負(fù)數(shù),以16進(jìn)制的補(bǔ)碼形式顯示,00000000-FFFFF9C5=-63B),再加上指令的5個(gè)字節(jié)為-636,指令所在地址為00F63689,所以匯編代碼為:call 00F63053

6A 58
6A : PUSHd64 Ib
Ib是一個(gè)字節(jié)的立即數(shù),所以匯編代碼為:push 0x58

68 A037F600
68 :PUSHd64 lz
lz是立即數(shù)(4個(gè)字節(jié)),所以匯編代碼為:push 00F637A0

E8 72040000
E8 : near callf64 Jz
和上面一樣,但是這里的偏移量是00000472(向下偏移),加上指令的5個(gè)字節(jié)為00000477,指令所在地址為00F63695,匯編代碼為:call 00F63B0C

33DB
33 : XOR Gv,Ev
Gv表示寄存器,Ev為寄存器(DB在C0~FF之間)
DB為ModR/M
DB的二進(jìn)制形式 = 11011011
拆分ModR/M = 11|011|011(Mod:11,Reg:011,R/M:011)
在ModR/M表里找到寄存器為ebx,ebx
所以匯編代碼為:xor ebx,ebx

895D E4
89 : MOV Ev,Gv
Ev為內(nèi)存地址(5D在00~BF之間),Gv表示寄存器
5D為ModR/M
二進(jìn)制形式 = 01011101
拆分ModR/M = 01|011|101(Mod:01,Reg:011,R/M:101)
命令可得:MOV [EBP]+disp8, EBX
disp8指1個(gè)字節(jié)的偏移,E4可得-1c
所以匯編代碼為:mov dword ptr ss:[ebp-0x1C],ebx
(ebp+或ebp-地址,一般指堆棧里,所以用dword ptr ss:[]這樣的形式)

895D FC
89 :MOV Ev,Gv
同上,所以指令為:mov dword ptr ss:[ebp-0x04],ebx

8D45 98
8D :LEA Gv, M
Gv表示寄存器,M表示內(nèi)存地址
ModR/M:45
二進(jìn)制形式 = 01000101
拆分ModR/M = 01|000|101(Mod:01,Reg:000,R/M:101)
命令可得:LEA EAX, [EBP]+disp8
98的補(bǔ)碼為-68(怎么看出補(bǔ)碼,一個(gè)字節(jié)范圍-128~127,如果是大于7F即127,就是補(bǔ)碼)
所以指令為:lea eax, dword ptr ss:[ebp-0x68]

50
50 :pushd64 rAX/r8
就是push eax

FF15 FC10F600
FF :INC/DEC Grp5^1A
ModR/M:15
二進(jìn)制形式 = 00010101
拆分ModR/M = 00|010|101(Mod:00,Reg:010,R/M:101)
所以Grp5為near callf64 Ev
Ev = [disp32],Ev為內(nèi)存地址(15在00~BF之間)
指令為call 00F610FC(根據(jù)后面的group為主,前面的INC/DEC推測(cè)因?yàn)镽eg不是000或001,所有沒(méi)有用到)

C745 FC FEFFFFFF
C7 :Grp11^1A-MOV Ev, Iz
ModR/M:45
二進(jìn)制形式 = 01000101
拆分ModR/M = 01|000|101(Mod:01,Reg:000,R/M:101)
Grp11為MOV Ev, Iz
Ev是內(nèi)存地址(45在00~BF之間),Iz是立即數(shù)
根據(jù)Mod=01,R/M=101,指令化為:MOV [EBP]+disp8,Iz
最后FC(-0x04),FFFFFFFE(-0x02)
指令為:mov dword ptr ss:[ebp-0x04], -0x02

C745 FC 01000000
同上,指令為:mov dword ptr ss:[ebp-0x04], 00000001

64:A1 18000000
64為前綴,可知SEG=FS
A1 :MOV rAX, Ov
Ov存放fs:[]
所有指令為mov eax, fs:[0x18]

8B70 04
8D :LEA Gv,M
Gv表示寄存器,M表示內(nèi)存地址
ModR/M:70
二進(jìn)制形式 = 01110000
拆分ModR/M = 01|110|000(Mod:01,Reg:110,R/M:000)
LEA ESI,[EAX]+disp8
指令為:lea esi,dword ptr ss:[eax+0x04]

BF 5CC2F600
BF : MOV rDI/r15, Iv
rDI/r15是寄存器edi
Iv是一個(gè)立即數(shù):00F6C25C
指令為:mov edi, 00F6C25C

6A 00
6A : PUSHd64 Ib
Ib是一個(gè)字節(jié)大小的立即數(shù),所以
指令為:push 00

56
56 :push esi

57
57 :push edi

結(jié)果

 1 00F63689 : call 00F63053
 2 00F6368E : push 0x58
 3 00F63690 : push 00F637A0
 4 00F63695 : call 00F63B0C
 5 00F6369A : xor ebx,ebx
 6 00F6369C : mov dword ptr ss:[ebp-0x1C],ebx
 7 00F6369F : mov dword ptr ss:[ebp-0x04],ebx
 8 00F636A2 : lea eax, dword ptr ss:[ebp-0x68]
 9 00F636A5 : push eax
10 00F636A6 : call 00F610FC
11 00F636AC : mov dword ptr ss:[ebp-0x04], -0x02
12 00F636B3 : mov dword ptr ss:[ebp-0x04], 00000001
13 00F636BA : mov eax, fs:[0x18]
14 00F636C0 : lea esi,dword ptr ss:[eax+0x04]
15 00F636C3 : mov edi, 00F6C25C
16 00F636C8 : push 00
17 00F636CA : push esi
18 00F636C0 : push edi

附件


x86匯編格式Opcode:https://github.com/QKSword/Opcode-map

雙字節(jié)操作碼:https://pdos.csail.mit.edu/6.828/2007/readings/i386/appa.htm

操作數(shù)類型的含義

常用尋址方法

E :內(nèi)存地址(00~BF)或寄存器(C0~FF)
A ModR/M byte follows the opcode and specifies the operand. The operand is either a general-purpose register or a menory address
ModR/M字節(jié)在操作碼后面并指定操作數(shù)。操作數(shù)是一個(gè)通用寄存器或一個(gè)內(nèi)存地址

G :寄存器
The reg field of the ModR/M byte selects a general register(for example, AX(000))
ModR/M字節(jié)的寄存器字段選擇通用寄存器(例如:AX(000))

I :立即數(shù)
Immediate data : the operand value is encoded in subsequent bytes of the instruction
立即數(shù):操作數(shù)的值在指令的后續(xù)字節(jié)中編碼

J :相對(duì)偏移
The instruction contains a relative offset to the instruction pointer register(for example, JMP(0E9), LOOP)
這個(gè)指令包括了指令指針寄存器的相對(duì)偏移量(例如:JMP(0E9),LOOP)

M :內(nèi)存地址
The ModR/M byte may refer only to menory(for example, BOUND, LES, LDS, LSS, LFS, LGS, CMPXCHG8B)
ModR/M字節(jié)可能只涉及內(nèi)存(例如:BOUND,LES,LDS,LSS,LFS,LGS,CMPXCHG8B)

X :內(nèi)存地址
Memory addressed by the DS:rSI register pair(for example, MOVS, CMPS, OUTS, or LODS)
由DS:rSI寄存器對(duì)尋址的內(nèi)存地址(例如:MOVS,CMPS,OUTS,LODS)

Y :內(nèi)存地址
Memory addressed by the ES:rDI register pair(for example, MOVS,CMPS,INS,STOS,or SCAS)
由ES:rDI寄存器對(duì)尋址的內(nèi)存地址(例如:MOVS,CMPS,INS,SIOS或SCAS)

操作數(shù)類型
b
Byte,regardless of operand-size attribute
字節(jié),不管操作數(shù)大小屬性如何

d
Doubleword, regardless of operand-size attribute
雙字節(jié),不管操作數(shù)大小屬性如何

v
Word, doubleword or quadword(in 64-bit mode), depengding on operand-size attribute
字,雙字或四字(64位模式),取決于操作數(shù)大小

z
Word for 16-bit operand-size or doubleword for 32 or 64-bit operand-size
16位操作數(shù)大小的字,32位或64位大小的雙字

總結(jié)

以上是生活随笔為你收集整理的x86指令格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。