Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel x86 utasításkészlet Kód visszafejtés.
Izsó Tamás
2013. október 31.
Izsó Tamás
Intel x86 utasításkészlet/ 1
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Section 1 Intel mikroprocesszor
Izsó Tamás
Intel x86 utasításkészlet/ 2
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel mikroprocesszor család
1978-ban dobták piacra a 8086, 8088, 80186 processzorokat; 16-bites regiszterek; szegmens-offset címzés; ˝ szegmens regiszter állítás nélkül 64Kbyte címezheto; néggyel eltolt szegmensregiszter + a 16 bit offset 20 bites címet alkot; ˝ 8087 lebegopontos koprocesszor.
Izsó Tamás
Intel x86 utasításkészlet/ 3
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel 286 mikroprocesszor
1982-ben vezették be; protected mód; laptábla mérete 24-bit; ˝ 16Mbyte memória címezheto.
Izsó Tamás
Intel x86 utasításkészlet/ 4
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel 386 mikroprocesszor
1985-ben vezették be; 32 bites regiszterek; ˝ 32 bites cím, 4 GByte címezheto; lapozást támogatja; ˝ flat memóriamodell; szegmens kezelés kikerülheto, linux futtatható rajta.
Izsó Tamás
Intel x86 utasításkészlet/ 5
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel 486 mikroprocesszor
1989-ben vezették be; ˝ DX verzióba beintegrálták a lebegopontos koprocesszort; gyorsítótár (cache) alkalmazása; pipeline utasítás feldolgozás;
Izsó Tamás
Intel x86 utasításkészlet/ 6
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel Pentium mikroprocesszor
1993-ben vezették be; gyorsítótár méretét megduplázták, felét a kód felét az adatok számára használták; két pipeline utasításfeldolgozó egység; feltételes ugrásokra elágazásbecslést alkalmaztak két processzoros mód támogatása MMX utasításkészlet
Izsó Tamás
Intel x86 utasításkészlet/ 7
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Intel Pentium mikroprocesszor
1995-1999 között jelent meg a Pentium 6, gyártástechno˝ ˝ lógia fejlodik, gyorsabb az elodöknél; 2000-2006 NetBurst mikroarchitectura, SSE3 utasítások; 2003 Pentium-M kis fogyasztás; 2004 64 bites processzor 40 bites fizikai cím 1 Tbyte cí˝ 8-ról 16-ra növelték az általános célú regiszterek mezheto, számát; 2005-2007 két mag, 64 bit ; stb.
Izsó Tamás
Intel x86 utasításkészlet/ 8
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Section 2 Utasításkészlet
Izsó Tamás
Intel x86 utasításkészlet/ 9
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Utasításkészlet tervezésének szempontjai
technológiából adódó kötöttségek (tranzisztorok száma); chipek költsége; fogyasztás; ˝ ˝ utasításkészlet bovíthet osége; ˝ o˝ sorozat kompatibilitásának a felvállalása; eloz új utasítások és muködési ˝ elvek oktatása.
Izsó Tamás
Intel x86 utasításkészlet/ 10
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
RISC vs CISC CISC Complex Instruction Set Computing utasítások hossza változik; muvelet ˝ végzés regiszterek és memória között; kevés számú regiszter.
RISC (Reduced Instruction Set Computing) utasítások hossza azonos; muveletek ˝ végzés csak regiszterek között; sok regiszter.
Intel 80x86 processzor Utasításkészlete CISC tulajdonságot mutat. Belül a CISC utasításokat egyszeru˝ mikrómuveletekre ˝ bontja (µ Op) és párhuzamosan képes ezeket végrehajtani. (pl. Sandy Bridge Pipeline architektúra). Izsó Tamás
Intel x86 utasításkészlet/ 11
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Gépi utasítás mérete 1 byte, 256 utasítás, kevés 2 byte, 65536 utasítás, sok 1.5 byte az utasítások átlagos hossza Változó hosszúságú utasításkészlet lehetséges (nem Intel x86) megvalósítása: 0
1
X
X
X
X
X
X
1
0
X
X
X
X
X
X
1
1
X
X
X
X
X
X
Egy byte-os utasítások száma 3x64
Izsó Tamás
Intel x86 utasításkészlet/ 12
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Gépi utasítás mérete
0
0
1
X
X
X
X
X
X
X
X
X
X
X
X
X
˝ 3-at lerögzítünk, 2 byte-os utasításoknál 16 bitbol így 213 azaz 8192 db lehetséges. 0
0
0
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
3 byte-os utasítások maximális száma
Izsó Tamás
X
224−3 .
Intel x86 utasításkészlet/ 13
X
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Általános utasítások csoportosítása adatmozgató utasítások (mov) fixpontos aritmetikai utasítások (add, sub) decimális utasítások (daa, (das)) logikai utasítások (and, or, not) hasonlító utasítások (cmp) lépteto˝ utasítások (shl, rol) bit és byte kezelo˝ utasítások (bt, sets) feltételes és feltétel nélküli vezérlésátadó utasítások (jmp, jne, call ret, int) stringkezelo˝ utasítások (movs, scas) input és output utasítások (in, out) flag beállító utasítások (stc, clc) (enter, leave) utasítások szegmesregiszter utasítások (lds, les) egyéb (lea, nop) Izsó Tamás
Intel x86 utasításkészlet/ 14
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
˝ Lebegopontos utasítások
FPU adatmozgató utasítások (fld, fst) ˝ lebegopontos aritmetikai utasítások (fadd, fsub) hasonlító utasítások (fcom) függvények (fsin ) FPU-t vezérlo˝ utasítások ( finit , fnop)
Izsó Tamás
Intel x86 utasításkészlet/ 15
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Utasítások hozzárendelése a muveletkódhoz ˝
utasításcsoport megkülönböztetése 4 bit; csoporton belüli megkülönböztetés 3 bit; operandusok megadása regiszter esetén 2x3 bit; gyakran használt utasítások (mov(EAX,displ) legyenek 8 bitesek ˝ Így már boven túlléptük a 8 bitet!
Izsó Tamás
Intel x86 utasításkészlet/ 16
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Section 3 IA-32 utasítás
Izsó Tamás
Intel x86 utasításkészlet/ 17
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
X86 regiszterek 8 darab 32 bites regiszter; 6 darab szegmens regiszter; statusz regiszter EFLAGS utasításszámláló EIP 32 bites általános célú regiszterek EAX
EBP
EBX
ESP
ECX
ESI
EDX
EDI
szegmens regiszterek EFLAGS
CS
EIP
Izsó Tamás
ES
SS
FS
DS
GS
Intel x86 utasításkészlet/ 18
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Regiszterek speciális szerepe egyes utasításokban
Speciális de nem kizárólagos felhasználása a regisztereknek. EAX akkumulátor regiszter, szorzáshoz osztáshoz; ECX counter regiszter (ciklusszámlálásra); ESP stack pointer; ESI string muveletek ˝ esetén a forrás memóriaterületet indexeli; EDI string muveletek ˝ esetén a cél memóriaterületet indexeli; EBP bázis pointer a stack kezeléshez.
Izsó Tamás
Intel x86 utasításkészlet/ 19
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
x86 utasítás formátum
Instruction prefix
Opcionálisan adható 4 csoportba sorolható prefix
Mod
Opcode
Modr/M
SIB
Displacement
Immediate
Muveleti ˝ kód 1-,2-,3 byte
1 byte, ha szükséges
1 byte, ha szükséges
Displacement (eltolás) 1-,2,4 byte
Immediate (közvetlen) adat 1-,2-,4 byte
Reg/ opcode
R/M
Izsó Tamás
Scale
Index
Intel x86 utasításkészlet/ 20
Base
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Utasítás prefix
1
csoport lock vagy repeat prefix F0H LOCK prefix multiprocesszoros környezetben az osztott memóriához kizárólagos hozzáférést biztosít. F2H REPNE/REPNZ prefix, amely string vagy input/output utasításokhoz lehet használni. F3H REP vagy REPE/REPZ prefix, amely string vagy input/output utasításokhoz lehet használni.
2
operandusok méretének az átdefiniálása csoport 66H operandus méretének megváltoztatása, azaz a 16 és 32 bites operandusok között választhatunk. csoport 67H cím méretének a megváltoztatása.
Izsó Tamás
Intel x86 utasításkészlet/ 21
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Utasítás prefix
3
szegmens módosítás, amely ugró utasításokra nem érvényes 2EH CS 36H SS 3EH DS 26H ES 64H FS 65H GS
4
elágazásbecslés feltételes vezérlésátadó utasításokhoz 2EH valószínuleg ˝ az ugrás nem fog végrehajtódni; 3EH valószínuleg ˝ az ugrás be fog következni.
Izsó Tamás
Intel x86 utasításkészlet/ 22
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
ModR/M 7
5
6
Mod
4
3
Reg Opcode
2
1
0
R/M
A ModR/M mezo˝ a muveletben ˝ résztvevo˝ regisztereket vagy memória címzés típusát azonosítja. A mod és az r/m mezo˝ összevonva 5 bites, azaz 32 lehet˝ 8 érték regisztert címez, 24 séges értéket vehet fel. Ebbol pedig a címzési módot adja meg. A reg/opcode vagy a regisztereket címez, vagy 3 bit még hozzáadódik az utasításhoz, ami plusz információt hordoz. Az r/m mezo˝ a regiszter típusú operandust adja meg, vagy ˝ a mod mezovel kombinálva a címzési módot írja le. Némely ModR/M értékhez még egy byte címzési információt kell elhelyezni, ez a SIB byte. Izsó Tamás
Intel x86 utasításkészlet/ 23
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
SIB mezo˝ 7
5
6
Scale
4
Index
3
2
1
0
Base
skálafaktor index bázis Néhány címzési módnál a ModR/M vagy ha van SIB byte után találjuk az eltolás (displacement) értéket. Ez az érték 1, 2, vagy 4 byte-os lehet.
Izsó Tamás
Intel x86 utasításkészlet/ 24
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Címszámitás a SIB alapján
base EAX EBX ECX EDX ESP EBP ESI EDI
index
+
EAX EBX ECX EDX EBP ESI EDI
scale
displacement
∗
1 2 + 4 8
nincs 8 − bit 16 − bit 32 − bit
offset = base + (index ∗ scale) + displacement
Izsó Tamás
Intel x86 utasításkészlet/ 25
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
ModR/M számítása 000 001 010 011 100 101 110 111
AL AX EAX MM0 CL CX ECX MM1 DL DX EDX MM2 BL BX EBX MM3 AH SP ESP MM4 CH BP EBP MM5 DH SI ESI MM6 BH DI EDI MM7 regiszterek számozása MOD R/M REG
ModR/M
XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
11 000 11
Izsó Tamás
001 001 ECX
000 EAX
= C8H
Intel x86 utasításkészlet/ 26
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
ModR/M értelmezése r32(/r) (In binary) REG = Effective addr Mod [EAX] 00 [ECX] [EDX] [EBX] [–][–] (SIB jön) disp32 [ESI] [EDI] [EAX]+disp8 01 [ECX]+disp8 [EDX]+disp8 [EBX]+disp8 [–][–]+disp8 [EBP]+disp8 [ESI]+disp8 [EDI]+displ8 [EAX]+disp32 10 [ECX]+disp32 [EDX]+disp32 [EBX]+disp32 [–][–]+disp32 [EBP]+disp32 [ESI]+disp32 [EDI]+displ32 EAX / . . . 11 ECX / . . . EDX / . . . EBX / . . . ESP / . . . EBP / . . . ESI / . . . EDI / . . .
EAX 000 R/M 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111
00 01 02 03 04 05 06 07 40 41 42 43 44 45 46 47 80 81 82 83 84 85 86 87 C0 C1 C2 C3 C4 C5 C6 C7
ECX EDX EBX ESP EBP ESI 001 010 011 100 101 110 Value of ModR/M Byte (in Hexadecimal) 08 10 18 20 28 30 09 11 19 21 29 31 0A 12 1A 22 2A 32 0B 13 1B 23 2B 33 0C 14 1C 24 2C 34 0D 15 1D 25 2D 35 0E 16 1E 26 2E 36 0F 17 1F 27 2F 37 48 50 58 60 68 70 49 51 59 61 69 71 4A 52 5A 62 6A 72 4B 53 5B 63 6B 73 4C 54 5C 64 6C 74 4D 55 5D 65 6D 75 4E 56 5E 66 6E 76 4F 57 5F 67 6F 77 88 90 98 A0 A8 B0 89 91 99 A1 A9 B1 8A 92 9A A2 AA B2 8B 93 9B A3 AB B3 8C 94 9C A4 AC B4 8D 95 9D A5 AD B5 8E 96 9E A6 AE B6 8F 97 9F A7 AF B7 C8 D0 D8 E0 E8 F0 C9 D1 D9 E1 E9 F1 CA D2 DA E2 EA F2 CB D3 DB E3 EB F3 CC D4 DC E4 EC F4 CD D5 DD E5 ED F5 CE D6 DE E6 EE F6 CF D7 DF E7 EF F7
Izsó Tamás
EDI 111 38 39 3A 3B 3C 3D 3E 3F 78 79 7A 7B 7C 7D 7E 7F B8 B9 BA BB BC BD BE BF F8 F9 FA FB FC FD FE FF
Intel x86 utasításkészlet/ 27
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
SIB értelmezése r32 (In binary) Base = Scaled Index SS [EAX] 00 [ECX] [EDX] [EBX] none [EBP] [ESI] [EDI] [EAX*2] 01 [ECX*2] [EDX*2] [EBX*2] none [EBP*2] [ESI*2] [EDI*2] [EAX*4] 10 [ECX*4] [EDX*4] [EBX*4] none [EBP*4] [ESI*4] [EDI*4] [EAX*8] 11 [ECX*8] [EDX*8] [EBX*8] none [EBP*8] [ESI*8] [EDI*8]
Index 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111
EAX ECX EDX EBX ESP megj(1) 000 001 010 011 100 101 Value of SIB Byte (in Hexadecimal) 00 01 02 03 04 05 08 09 0A 0B 0C 0D 10 11 12 13 14 15 18 19 1A 1B 1C 1D 20 21 22 23 24 25 28 29 2A 2B 2C 2D 30 31 32 33 34 35 38 39 3A 3B 3C 3D 40 41 42 43 44 45 48 49 4A 4B 4C 4D 50 51 52 53 54 55 58 59 5A 5B 5C 5D 60 61 62 63 64 65 68 69 6A 6B 6C 6D 70 71 72 73 74 75 78 79 7A 7B 7C 7D 80 81 82 83 84 85 88 89 8A 8B 8C 8D 90 91 92 93 94 95 98 99 9A 9B 9C 9D A0 A1 A2 A3 A4 A5 A8 A9 AA AB AC AD B0 B1 B2 B3 B4 B5 B8 B9 BA BB BC BD C0 C1 C2 C3 C4 C5 C8 C9 CA CB CC CD D0 D1 D2 D3 D4 D5 D8 D9 DA DB DC DD E0 E1 E2 E3 E4 E5 E8 E9 EA EB EC ED F0 F1 F2 F3 F4 F5 F8 F9 FA FB FC FD
Izsó Tamás
ESI 110
EDI 111
06 0E 16 1E 26 2E 36 3E 46 4E 56 5E 66 6E 76 7E 86 8E 96 9E A6 AE B6 BE C6 CE D6 DE E6 EE F6 FE
07 0F 17 1F 27 2F 37 3F 47 4F 57 5F 67 6F 77 7F 87 8F 97 9F A7 AF B7 BF C7 CF D7 DF E7 EF F7 FF
Intel x86 utasításkészlet/ 28
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
ModR/M – SIB byte-hoz megjegyzés megjegyzés SIB-hez: [–][–] azt jelenti, hogy SIB jön a ModR/M byte után. Ahol a disp8 szerepel ott a ModR/M és ha van SIB akkor az után 8 bites érték jön. Ahol a disp32 szerepel ott a ModR/M és ha van SIB akkor az után 32 bites érték jön. megjegyzés SIB-hez (megj1): Ha a Mod 00B akkor csak displacement van, bázisregiszter nincs. Máskülönben [EBP] + disp8 vagy [EBP]+disp32-vel kell számolni. Mod bits base 00 disp32 01 EBP+disp8 10 EBP+disp32 Izsó Tamás
Intel x86 utasításkészlet/ 29
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Utasítás dekódolás (ModR/M)
opcode (hex) 89 19 8B 35 F4 8C 12 10 8B 91 A8 00 00 00 8B 14 81 8B 8C 24 80 00 00 00 8B 54 B5 8C
Mod (bin) 00 00 10 00 10 01
opcode vagy Reg (bin) 011 110 010 010 001 010
r/m (bin) 001 101 001 100 100 100
skála (bin)
00 10
index (bin)
100 110
bázis (bin)
100 101
utasítás mov [ecx],ebx mov esi, [10128CF4] mov edx, [ecx+0A8h] mov edx, [ecx+eax*4] mov ecx, [esp+80h] mov edx, [ebp+esi*4 - 74h]
32-bites utasítások ModR/M byte dekódolására példák
Izsó Tamás
Intel x86 utasításkészlet/ 30
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Utasítás értelmezése a Mod bitek alapján
opcode (hex) 83 83 83 83 83 83 83 83
opcode (hex) 83 C4 04
˝ (bin) opcode extension Mod/R-bol 000 001 010 011 100 101 110 111
Mod (bin) 11
utasítás ADD OR ADC SBB AND SUB XOR CMP
opcode vagy Reg (bin) 000
Izsó Tamás
op1 r/m16/32 r/m16/32 r/m16/32 r/m16/32 r/m16/32 r/m16/32 r/m16/32 r/m16/32
r/m (bin) 100
Intel x86 utasításkészlet/ 31
op2 imm8 imm8 imm8 imm8 imm8 imm8 imm8 imm8
utasítás add esp,4
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Regiszter kiosztás 1byte-os utasításkód esetén
INC r16/32 utasítás kódja 40+r, INC EAX → 40, INC EBX → 41
Izsó Tamás
Intel x86 utasításkészlet/ 32
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Speciális bitek az utasításokban
mezo˝ neve reg w s sreg2 sreg3 eee tttn d
leírás általános regiszterek adat szélessége (16 vagy 32 bit) immediate adat sign vagy unsigned szegmens regiszter megadás (ES,DS,CS, SS ) szegmens regiszter megadás (ES,DS,CS, SS, FS, GS ) speciális regiszterek,control vagy debug reg. feltételes utasításoknál a feltételt és annak negálását írja le adatok irányának a leírása
bitek száma 3 1 1 2 3 3 4 1
Példa adatírányra 8B 75 0C 89 75 0C
mov mov
Izsó Tamás
esi , dword p t r [ ebp+0Ch ] dword p t r [ ebp+0Ch ] , e s i
Intel x86 utasításkészlet/ 33
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Állapotregiszter 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 V V I I I A V R 0 N 0 0 0 0 0 0 0 0 0 0 T C M F D P F
X X X X X X X X S C X X S S S S S
I O P L
O D I T S Z P C A F F F F F F 0 F 0 F 1 F
ID Flag (ID) Virtual Interrupt Pending (VIP) Virtual Interrupt Flag (VIF) Alignment Check (AC) Virtual-8086 Mode (VM) Resume Flag (RF) Nested Task (NT) I/O Privilege Level (IOPL) Overflow Flag (OF) Direction Flag (DF) Interrupt Enable Flag (IF) Trap Flag (TF) Sign Flag (SF) Zero Flag (ZF) Auxiliary Carry Flag (AF) Parity Flag (PF) Carry Flag (CF)
S Indicates Status Flag C Indicates a Control Flag X Indicates a System Flag
Foglalt bitek
Forrás: Intel® 64 and IA-32 Architectures Software Developer’s Manual
Izsó Tamás
Intel x86 utasításkészlet/ 34
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Vezérlésátadó utasítások Utasítás jmp je jne js jns jg jge jl jle ja jb
Feltétel 1 ZF = 1 ZF = 0 SF = 1 SF= 0 ((SF XOR OF) OR ZF) = 0 (SF XOR OF) = 0 (SF XOR OF) = 1 ((SF XOR OF) OR ZF) = 1 (CF OR ZF) = 0 CF = 1
Izsó Tamás
Leírás feltétel nélkül = vagy 0 6 = <0 ≥0 > ≥ < ≤ > <
Intel x86 utasításkészlet/ 35
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Vezérlésátadó utasítások
Utasítás JZ JNZ JB JNB JG JNG
Kód (bináris) 01110100 01110101 01110010 01110011 01111111 01111110
Feltétel 3-2-1 bitek 010 010 001 001 111 111
Negálás 0 bit 0 1 0 1 1 0
Intel IA-32 utasításkészlet: http://ref.x86asm.net/index.html
Izsó Tamás
Intel x86 utasításkészlet/ 36
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Section 4 Disassembler
Izsó Tamás
Intel x86 utasításkészlet/ 37
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Lineárisan pásztázó disassembler startAddr, endAddr: pointer of byte; proc DisasmLinear(addr) begin while startAddr ≤ addr and addr ≤ endAddr do I := decode_instruction(addr) addr += length( I ) od end proc main() begin startAddr := address of the first code segment byte endAddr := address of the last code segment byte DisasmLinear( startAddr ) end Izsó Tamás
Intel x86 utasításkészlet/ 38
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Lineárisan pásztázó disassembler
˝ elonye egyszeru; ˝ gyors; bejárja az összes utasításat.
hátránya nem különbözteti meg a kódot az adattól (pl. switch utasítás után címtábla található, vagy a visszafejtés megnehezítésére junk (szemét) byte-ok kerülnek a kódban).
Izsó Tamás
Intel x86 utasításkészlet/ 39
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
C program
i n t func ( i n t a , i n t b ) { int c ; c= a + b ; r e t u r n c −6; }
Izsó Tamás
Intel x86 utasításkészlet/ 40
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Disassembler output (dumpbin)
_func : 00000000: 00000001: 00000003: 00000004: 00000007: 0000000A : 0000000D : 00000010: 00000013: 00000015: 00000016:
55 8B 51 8B 03 89 8B 83 8B 5D C3
EC 45 45 45 45 E8 E5
08 0C FC FC 06
push mov push mov add mov mov sub mov pop ret
Izsó Tamás
ebp ebp , esp ecx eax , dword eax , dword dword p t r eax , dword eax , 6 esp , ebp ebp
p t r [ ebp +8] p t r [ ebp+0Ch ] [ ebp−4] , eax p t r [ ebp−4]
Intel x86 utasításkészlet/ 41
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Lineárisan pásztázó disassembler összezavarása (obfuscation) i n t func ( i n t a , i n t b ) { int c ; goto L ; _asm { _emit 0 x 0 f ; } L: c= a + b ; r e t u r n c −6; }
Izsó Tamás
Szemét byte
Intel x86 utasításkészlet/ 42
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Disassembler output (dumpbin) _func : 00000000: 00000001: 00000003: 00000004: 00000006: 0000000C: 0000000E : 0000000F : 00000010: 00000013: 00000016: 00000018: 00000019:
55 8B 51 EB 0F 0C 45 FC 8B 83 8B 5D C3
EC 01 8B 45 08 03 45 89
45 FC E8 06 E5
Izsó Tamás
push mov push jmp jnp or inc cld mov sub mov pop ret
ebp ebp , esp ecx 00000007 45030851 al , 8 9 h ebp eax , dword p t r [ ebp−4] eax , 6 esp , ebp ebp
Intel x86 utasításkészlet/ 43
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Disassembler output (dumpbin) _func : 00000000: 00000001: 00000003: 00000004: 00000006: 0000000C: 0000000E : 0000000F : 00000010: 00000013: 00000016: 00000018: 00000019:
55 8B 51 EB 0F 0C 45 FC 8B 83 8B 5D C3
EC 01 8B 45 08 03 45 89
45 FC E8 06 E5
push mov push jmp jnp or inc cld mov sub mov pop ret
ebp ebp , esp ecx 00000007 45030851 al , 8 9 h ebp eax , dword p t r [ ebp−4] eax , 6 esp , ebp ebp
hibás utasítás;
Izsó Tamás
Intel x86 utasításkészlet/ 43
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Disassembler output (dumpbin) _func : 00000000: 00000001: 00000003: 00000004: 00000006: 0000000C: 0000000E : 0000000F : 00000010: 00000013: 00000016: 00000018: 00000019:
55 8B 51 EB 0F 0C 45 FC 8B 83 8B 5D C3
EC 01 8B 45 08 03 45 89
45 FC E8 06 E5
push mov push jmp jnp or inc cld mov sub mov pop ret
ebp ebp , esp ecx 00000007 45030851 al , 8 9 h ebp eax , dword p t r [ ebp−4] eax , 6 esp , ebp ebp
hibás utasítás; szinkronizálás jó utasítás határra.
Izsó Tamás
Intel x86 utasításkészlet/ 43
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Rekurzívan pásztázó disassembler utasításfeldolgozás sorrendje nem vezérlésátadó utasítás esetén a következo˝ utasításon folytatódik; feltételes ugrásnál az ugrás címén folytatódik az adatok ˝ visszatér az utasítást követo˝ réfeldolgozása, és késobb szekhez; ˝ folytatódik a disasfüggvényhívásnál az eljárás címétol semblálás, és azt befejezve a következo˝ utasításra kell rátérni; feltétel nélküli ugrás esetén az ugrás címén lévo˝ adatokat kell feldolgozni, és ha az eljárás visszatért, akkor a hívó is befejezi az adott részt; return esetén a utasításfelgolgozás végére értünk; ha azt tapasztaljuk, hogy az adott címen lévo˝ adatokat feldolgoztuk, akkor vissza kell térni a hívó rutinhoz. Izsó Tamás
Intel x86 utasításkészlet/ 44
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Rekurzívan pásztázó disassembler startAddr, endAddr: pointer of byte; proc DisasmRec(addr) begin while startAddr ≤ addr and addr ≤ endAddr do if( Visited(addr) return Visited(addr) := true I := decode_instruction(addr) if( I == jmp || I == conditional jmp || I == call ) newAddr= DecodeOperandAddr( I ) DisasmRec( newAddr ) fi if( I == jmp || I == ret ) return fi addr += length( I ) od end proc main() begin startAddr := address of the first code segment byte endAddr := address of the last code segment byte addr := program entry point DisasmRec( addr ) end Izsó Tamás
Intel x86 utasításkészlet/ 45
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Rekurzívan pásztázó disassembler
˝ elonye Megkülönbözteti a kódot az adattól.
hátránya Számított vezérlésátadás esetén ( jmp EAX ) nem biztos, hogy bejárja az összes kódrészt, mivel a statikus disassembler nem ismeri az EAX értékét.
Izsó Tamás
Intel x86 utasításkészlet/ 46
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Ollydebug output 00401000 00401001 00401003 00401004 00401006 00401007 0040100A 0040100D 00401010 00401013 00401016 00401018 00401019
55 8BEC 51 EB 01 0F 8B45 08 0345 0C 8945 FC 8B45 FC 83E8 06 8BE5 5D C3
push ebp mov ebp , esp push ecx jmp short 00401007 db 0F mov eax , dword p t r ss : [ a r g . 1 ] add eax , dword p t r ss : [ a r g . 2 ] mov dword p t r ss : [ l o c a l . 1 ] , eax mov eax , dword p t r ss : [ l o c a l . 1 ] sub eax , 6 mov esp , ebp pop ebp retn
Izsó Tamás
Intel x86 utasításkészlet/ 47
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
IDA disassembler output 00000000 00000001 00000003 00000004 00000006 00000007 00000007 0000000A 0000000D 00000010 00000013 00000016 00000018 00000019
55 8B EC 51 EB 01 0F
push mov push jmp db 0Fh
ebp ebp , esp ecx short l o c _ 7
mov add mov mov sub mov pop retn
eax , [ ebp+arg_0 ] eax , [ ebp+arg_4 ] [ ebp+var_4 ] , eax eax , [ ebp+var_4 ] eax , 6 esp , ebp ebp
loc_7 : 8B 03 89 8B 83 8B 5D C3
45 45 45 45 E8 E5
08 0C FC FC 06
Izsó Tamás
Intel x86 utasításkészlet/ 48
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Rekurzívan pásztázó disassembler összezavarása (obfuscation) i n t func ( i n t a , i n t b ) { i n t c=a ; i n t d = ~0 ^ c ; i f ( ~ c ! = d ) goto goto L ; Junk : _asm { _emit 0 x 0 f ; } L: c= a + b ; r e t u r n c −6; } Izsó Tamás
Junk ; Átlátszó feltétel
Intel x86 utasításkészlet/ 49
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
Ollydebug output 00401000 00401001 00401003 00401006 00401009 0040100C 0040100F 00401012 00401015 00401018 0040101A 0040101D 0040101F 00401021 00401023 00401024 00401027 0040102A 0040102D 00401030 00401033 00401035 00401036
55 8B 83 8B 89 8B 83 89 8B F7 3B 74 EB EB 0F 8B 03 89 8B 83 8B 5D C3
EC EC 45 45 4D F1 4D 55 D2 55 02 02 01 45 45 45 45 E8 E5
08 08 F8 F8 FF FC F8 FC
08 0C F8 F8 06
push ebp mov ebp , esp sub esp , 8 mov eax , dword p t r ss : [ ebp +8] mov dword p t r ss : [ ebp−8] , eax mov ecx , dword p t r ss : [ ebp−8] xor ecx , FFFFFFFF mov dword p t r ss : [ ebp−4] , ecx mov edx , dword p t r ss : [ ebp−8] not edx cmp edx , dword p t r ss : [ ebp−4] j e short 00401021 jmp short 00401023 jmp short 00401024 db 0F mov eax , dword p t r ss : [ ebp +8] add eax , dword p t r ss : [ ebp+0C ] mov dword p t r ss : [ ebp−8] , eax mov eax , dword p t r ss : [ ebp−8] sub eax , 6 mov esp , ebp pop ebp retn Izsó Tamás
Intel x86 utasításkészlet/ 50
Intel mikroprocesszor Utasításkészlet IA-32 utasítás Disassembler
IDA disassembler output 00000000 00000001 00000003 00000006 00000009 0000000C 0000000F 00000012 00000015 00000018 0000001A 0000001D 0000001F 00000021 00000021 00000023 00000023 00000029 0000002B 0000002C 0000002D 00000030 00000033 00000035 00000036
55 8B 83 8B 89 8B 83 89 8B F7 3B 74 EB
EC EC 45 45 4D F1 4D 55 D2 55 02 02
08 08 F8 F8 FF FC F8 FC
push mov sub mov mov mov xor mov mov not cmp jz jmp
ebp ebp , esp esp , 8 eax , [ ebp+arg_0 ] [ ebp+var_8 ] , eax ecx , [ ebp+var_8 ] ecx , 0FFFFFFFFh [ ebp+var_4 ] , ecx edx , [ ebp+var_8 ] edx edx , [ ebp+var_4 ] short loc_21 short loc_23
jmp
short near p t r loc_23 +1
jnp or inc clc mov sub mov pop retn
near p t r 4503086Eh al , 89h ebp
loc_21 : EB 01 loc_23 : 0F 0C 45 F8 8B 83 8B 5D C3
8B 45 08+ 89
45 F8 E8 06 E5
Izsó Tamás
eax , [ ebp+var_8 ] eax , 6 esp , ebp ebp
Intel x86 utasításkészlet/ 51