Intel x86 utasításkészlet + disassembler működése

Hasonló dokumentumok
Intel x86 utasításkészlet

Stack Vezérlés szerkezet Adat 2.

Máté: Assembly programozás

A 32 bites x86-os architektúra regiszterei

Adatelérés és memóriakezelés

Bevezetés a számítástechnikába

Assembly. Iványi Péter

Balaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született.

Assembly utasítások listája

Programok működése dióhéjban

PE/COFF fájl formátum

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

1. Az utasítás beolvasása a processzorba

Digitális rendszerek. Utasításarchitektúra szintje

Paraméter átadás regisztereken keresztül

Assembly Utasítások, programok. Iványi Péter

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz

Processzorok Utasításszintű Kezelése tavasz

A regiszterek az assembly programozás változói. A processzor az egyes mőveleteket kizárólag regiszterek közremőködésével tudja végrehajtani.

Aritmetikai utasítások I.

Assembly. Iványi Péter

A Számítógépek felépítése, mőködési módjai

assume CS:Code, DS:Data, SS:Stack Start mov dl, 100 mov dh, 100 push dx Rajz

Vezérlésfolyam gráf és X86 utasításkészlet

Assembly Címzési módok. Iványi Péter

Aritmetikai utasítások

Assembly programozás levelező tagozat

Számítógép architektúrák

A Magyar Nemzeti Bank elnökének 19/2012. (X. 4.) MNB rendelete

Karunkról Kari digitális könyvtár

assume CS:Code, DS:Data, SS:Stack Start: xor di, di mov si, 1 Torles int 10h mov dl, 40 xor bh, bh mov ah, 02h Kesleltet int 16h

A B C D EF C D EF C C BF A BC DE F D A E E E E D C C E DC C E E DC C C E D D E A D A E A

AES kriptográfiai algoritmus

A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni.

Bevezetés az informatikába

Bevezetés Alapfogalmak Jog

Számítógép Architektúrák

Sapientia Egyetem, Műszaki és Humántudományok Tanszék.

Biztonságos programozás Puffer túlcsordulásos támadások

Máté: Számítógép architektúrák

Mikrokontrollerek. Tihanyi Attila május 8

Máté: Számítógép architektúrák

Gyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Egyszerű RISC CPU tervezése

A kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...

Programozás alapjai. 10. előadás

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

Bevezetés a számítástechnikába

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

Miért van szükség fordítóprogramokra? Fordítóprogramok célja és szerkezete. Miért van szükség fordítóprogramokra?

[cimke:] [feltétel] utasítás paraméterek [; megjegyzés]

a védelmi feladatokban részt vevő elektronikus hírközlési szolgáltatók kijelöléséről és felkészülési feladataik meghatározásáról

Máté: Számítógép architektúrák

ELŐTERJESZTÉS A Képviselő-testület május 16-i ülésére

Máté: Számítógép architektúrák

Máté: Számítógép architektúrák

A MiniRISC processzor

Az assembly nyelv sor-orientált nyelv, tehát minden sorba pontosan egy utasítás kerül. Egy sor mezőkből áll a következőképpen:

A számítógép alapfelépítése

MATLAB gyakorlat. Fájlműveletek folytatás, gyakorlás

GÁBOR DÉNES FŐISKOLA PREZENTÁCIÓ. Vezetőtanár: Ágoston György 2002/ szemeszter. 222 lap

Máté: Számítógép architektúrák

Architektúra, címzési módok

Járműfedélzeti rendszerek I. 3. előadás Dr. Bécsi Tamás

Kitlei Róbert kitlei.web.elte.hu. Karunkról Kari digitális könyvtár

Szoftverek obfuszkációja

Introduction to 8086 Assembly

I/A. Az alkalmazottak adatai

Az integrált áramkörök kimenetének kialakítása

Assembly Programozás Rodek Lajos Diós Gábor

Általános Szerződési Feltételek. a Pick-Up Kft.

INTEL 8085 gépi utasításkészlete

Biztonságos programozás Puffer túlcsordulásos támadások

Virtuális memóriakezelés Védelem. Memória védelem. Intel x68. Izsó Tamás október 18. Izsó Tamás Memória védelem/ 1

2016/08/31 02:45 1/6 Hardver alapok

SZÉP-COMP KERESKEDELMI ÉS SZOLGÁLTATÓ BETÉTI TÁRSASÁG

Virtuális memóriakezelés Védelem. Memória védelem. Intel X86. Izsó Tamás október 1. Izsó Tamás Memória védelem/ 1

1. ábra: Perifériára való írás idődiagramja

6647. Csanytelek, Volentér János tér 2.sz. 63/ ; fax: 63/ ; honlap:

Máté: Számítógép architektúrák

Biztonságos programozás Puffer túlcsordulásos támadások

HARDVERKÖZELI PROGRAMOZÁS1

Előszó avagy Murphy és az optimizmus. Tartalomjegyzék

2017/12/16 21:33 1/7 Hardver alapok

Általános Szerződési Feltételek. Internet elérési szolgáltatás nyújtásához. Utolsó módosítás: Hatályos:

Máté: Számítógép architektúrák

Máté: Számítógép architektúrák

Megszakítások és kivételek

DENINET Üzleti Kommunikációs Kft. Általános Szerződési Feltételek. Internet elérési szolgáltatás nyújtásához

Kiképzési Szabályzat

Máté: Assembly programozás

ZNET-Mikronet Kereskedelmi és Szolgáltató Kft. Általános Szerződési Feltételek

code segment para public 'code' assume cs:code, ds:code, es:nothing, ss:nothing

Bevezetés a méréstechnikába és jelfeldolgozásba. Tihanyi Attila április 24.

5.441 eft bg) térségi fejlesztési tanácstól az államháztartás központi alrendszerén belülről kapott EU-s forrásból származó pénzeszközből,

hatályos:

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

Átírás:

Intel x86 utasításkészlet + disassembler működése Kód visszafejtés. Izsó Tamás 2016. november 10. Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 1

Section 1 Intel X86 utasításkészlet Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 2

ModR/M 7 6 5 4 3 2 1 0 Mod Reg Opcode R/M A ModR/M mező a műveletben résztvevő regisztereket vagy memória címzés típusát azonosítja. A mod és az r/m mező összevonva 5 bites, azaz 32 lehetséges értéket vehet fel. Ebből 8 érték regisztert címez, 4 pedig a címzési módot adja meg. A reg/opcode vagy regiszter cím, vagy 3 bit még hozzáadódik az utasításhoz, ami plusz információt hordoz. Az r/m mező a regiszter típusú operandust adja meg, vagy a mod mezővel 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 + disassembler működése / 3

SIB mező 7 6 5 4 3 2 1 0 Scale Index 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 + disassembler működése / 4

Címszámitás a SIB alapján base index scale displacement EAX EBX EAX ECX EBX EDX ECX 1 nincs ESP + EDX 2 EBP EBP 4 + 8 bit 16 bit ESI ESI 8 32 bit EDI EDI offset = base + (index scale) + displacement Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 5

ModR/M számítása 000 AL AX EAX MM0 XMM0 001 CL CX ECX MM1 XMM1 010 DL DX EDX MM2 XMM2 011 BL BX EBX MM3 XMM3 100 AH SP ESP MM4 XMM4 101 CH BP EBP MM5 XMM5 110 DH SI ESI MM6 XMM6 111 BH DI EDI MM7 XMM7 regiszterek számozása MOD 11 R/M 000 REG 001 ModR/M 11 001 000 = C8H ECX EAX Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 6

ModR/M értelmezése r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal) [EAX] 00 000 00 08 10 18 20 28 30 38 [ECX] 001 01 09 11 19 21 29 31 39 [EDX] 010 02 0A 12 1A 22 2A 32 3A [EBX] 011 03 0B 13 1B 23 2B 33 3B [ ][ ] (SIB jön) 100 04 0C 14 1C 24 2C 34 3C disp32 101 05 0D 15 1D 25 2D 35 3D [ESI] 110 06 0E 16 1E 26 2E 36 3E [EDI] 111 07 0F 17 1F 27 2F 37 3F [EAX]+disp8 01 000 40 48 50 58 60 68 70 78 [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D [ESI]+disp8 110 46 4E 56 5E 66 6E 76 7E [EDI]+displ8 111 47 4F 57 5F 67 6F 77 7F [EAX]+disp32 10 000 80 88 90 98 A0 A8 B0 B8 [ECX]+disp32 001 81 89 91 99 A1 A9 B1 B9 [EDX]+disp32 010 82 8A 92 9A A2 AA B2 BA [EBX]+disp32 011 83 8B 93 9B A3 AB B3 BB [ ][ ]+disp32 100 84 8C 94 9C A4 AC B4 BC [EBP]+disp32 101 85 8D 95 9D A5 AD B5 BD [ESI]+disp32 110 86 8E 96 9E A6 AE B6 BE [EDI]+displ32 111 87 8F 97 9F A7 AF B7 BF EAX /... 11 000 C0 C8 D0 D8 E0 E8 F0 F8 ECX /... 001 C1 C9 D1 D9 E1 E9 F1 F9 EDX /... 010 C2 CA D2 DA E2 EA F2 FA EBX /... 011 C3 CB D3 DB E3 EB F3 FB ESP /... 100 C4 CC D4 DC E4 EC F4 FC EBP /... 101 C5 CD D5 DD E5 ED F5 FD ESI /... 110 C6 CE D6 DE E6 EE F6 FE EDI /... 111 C7 CF D7 DF E7 EF F7 FF Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 7

SIB értelmezése r32 EAX ECX EDX EBX ESP megj(1) ESI EDI (In binary) Base = 000 001 010 011 100 101 110 111 Scaled Index SS Index Value of SIB Byte (in Hexadecimal) [EAX] 00 000 00 01 02 03 04 05 06 07 [ECX] 001 08 09 0A 0B 0C 0D 0E 0F [EDX] 010 10 11 12 13 14 15 16 17 [EBX] 011 18 19 1A 1B 1C 1D 1E 1F none 100 20 21 22 23 24 25 26 27 [EBP] 101 28 29 2A 2B 2C 2D 2E 2F [ESI] 110 30 31 32 33 34 35 36 37 [EDI] 111 38 39 3A 3B 3C 3D 3E 3F [EAX*2] 01 000 40 41 42 43 44 45 46 47 [ECX*2] 001 48 49 4A 4B 4C 4D 4E 4F [EDX*2] 010 50 51 52 53 54 55 56 57 [EBX*2] 011 58 59 5A 5B 5C 5D 5E 5F none 100 60 61 62 63 64 65 66 67 [EBP*2] 101 68 69 6A 6B 6C 6D 6E 6F [ESI*2] 110 70 71 72 73 74 75 76 77 [EDI*2] 111 78 79 7A 7B 7C 7D 7E 7F [EAX*4] 10 000 80 81 82 83 84 85 86 87 [ECX*4] 001 88 89 8A 8B 8C 8D 8E 8F [EDX*4] 010 90 91 92 93 94 95 96 97 [EBX*4] 011 98 99 9A 9B 9C 9D 9E 9F none 100 A0 A1 A2 A3 A4 A5 A6 A7 [EBP*4] 101 A8 A9 AA AB AC AD AE AF [ESI*4] 110 B0 B1 B2 B3 B4 B5 B6 B7 [EDI*4] 111 B8 B9 BA BB BC BD BE BF [EAX*8] 11 000 C0 C1 C2 C3 C4 C5 C6 C7 [ECX*8] 001 C8 C9 CA CB CC CD CE CF [EDX*8] 010 D0 D1 D2 D3 D4 D5 D6 D7 [EBX*8] 011 D8 D9 DA DB DC DD DE DF none 100 E0 E1 E2 E3 E4 E5 E6 E7 [EBP*8] 101 E8 E9 EA EB EC ED EE EF [ESI*8] 110 F0 F1 F2 F3 F4 F5 F6 F7 [EDI*8] 111 F8 F9 FA FB FC FD FE FF Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 8

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 00 B 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 + disassembler működése / 9

Utasítás dekódolásra 1. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 89 19 00 011 001 mov [ecx],ebx r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal) [EAX] 00 000 00 08 10 18 20 28 30 38 [ECX] 001 01 09 11 19 21 29 31 39 [EDX] 010 02 0A 12 1A 22 2A 32 3A [EBX] 011 03 0B 13 1B 23 2B 33 3B [ ][ ] (SIB jön) 100 04 0C 14 1C 24 2C 34 3C disp32 101 05 0D 15 1D 25 2D 35 3D [ESI] 110 06 0E 16 1E 26 2E 36 3E [EDI] 111 07 0F 17 1F 27 2F 37 3F [EAX]+disp8 01 000 40 48 50 58 60 68 70 78 [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 10

Utasítás dekódolásra 2. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 35 F4 8C 12 10 00 110 101 mov esi, [10128CF4] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal) [EAX] 00 000 00 08 10 18 20 28 30 38 [ECX] 001 01 09 11 19 21 29 31 39 [EDX] 010 02 0A 12 1A 22 2A 32 3A [EBX] 011 03 0B 13 1B 23 2B 33 3B [ ][ ] (SIB jön) 100 04 0C 14 1C 24 2C 34 3C disp32 101 05 0D 15 1D 25 2D 35 3D [ESI] 110 06 0E 16 1E 26 2E 36 3E [EDI] 111 07 0F 17 1F 27 2F 37 3F [EAX]+disp8 01 000 40 48 50 58 60 68 70 78 [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 11

Utasítás dekódolásra 3. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 91 A8 00 00 00 10 010 001 mov edx, [ecx+0a8h] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal)....................................... [EAX]+disp8 01 000 40 48 50 58 60 68 70 78 [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D [ESI]+disp8 110 46 4E 56 5E 66 6E 76 7E [EDI]+displ8 111 47 4F 57 5F 67 6F 77 7F [EAX]+disp32 10 000 80 88 90 98 A0 A8 B0 B8 [ECX]+disp32 001 81 89 91 99 A1 A9 B1 B9 [EDX]+disp32 010 82 8A 92 9A A2 AA B2 BA [EBX]+disp32 011 83 8B 93 9B A3 AB B3 BB [ ][ ]+disp32 100 84 8C 94 9C A4 AC B4 BC [EBP]+disp32 101 85 8D 95 9D A5 AD B5 BD [ESI]+disp32 110 86 8E 96 9E A6 AE B6 BE....................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 12

Utasítás dekódolásra 4. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 14 81 00 010 100 mov edx, [ecx+eax*4] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal) [EAX] 00 000 00 08 10 18 20 28 30 38 [ECX] 001 01 09 11 19 21 29 31 39 [EDX] 010 02 0A 12 1A 22 2A 32 3A [EBX] 011 03 0B 13 1B 23 2B 33 3B [ ][ ] (SIB jön) 100 04 0C 14 1C 24 2C 34 3C disp32 101 05 0D 15 1D 25 2D 35 3D [ESI] 110 06 0E 16 1E 26 2E 36 3E [EDI] 111 07 0F 17 1F 27 2F 37 3F [EAX]+disp8 01 000 40 48 50 58 60 68 70 78 [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D....................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 13

Utasítás dekódolásra 4. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 14 81 00 010 100 mov edx, [ecx+eax*4] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod r32 R/M Value of ModR/M EAX ECX Byte (inedx Hexadecimal) EBX ESP megj(1) ESI EDI [EAX] 00 (In binary) 000 Base 00 = 08 10000 18001 20010 28011 3010038 101 110 111 [ECX] Scaled 001 Index01SS 09 Index 11Value19 of SIB21 Byte (in 29Hexadecimal) 31 39 [EDX]...... 010... 02... 0A... 12... 1A... 22... 2A... 32... 3A......... [EBX] [EAX*2] 011 03 01 0B000 13 40 1B41 23 42 2B 43 33 443B 45 46 47 [ ][ ] (SIB jön) [ECX*2] 100 04 0C001 14 48 1C49 24 4A 2C4B 34 4C3C 4D 4E 4F disp32 [EDX*2] 101 05 0D010 15 50 1D51 25 52 2D 53 35 543D 55 56 57 [ESI] [EBX*2] 110 06 0E011 16 58 1E59 26 5A 2E5B 36 5C3E 5D 5E 5F [EDI] none 111 07 0F100 17 60 1F61 27 62 2F 63 37 64 3F 65 66 67 [EAX]+disp8 01 [EBP*2] 000 40 48101 50 68 58 69 60 6A 68 6B 70 6C78 6D 6E 6F [ECX]+disp8 [ESI*2] 001 41 49110 51 70 59 71 61 72 69 73 71 74 79 75 76 77 [EDX]+disp8 [EDI*2] 010 42 4A111 52 78 5A79 62 7A 6A7B 72 7C7A 7D 7E 7F [EBX]+disp8 [EAX*4] 011 43 10 4B000 53 80 5B81 63 82 6B 83 73 847B 85 86 87 [ ][ ]+disp8 [ECX*4] 100 44 4C001 54 88 5C89 64 8A 6C8B 74 8C7C 8D 8E 8F [EBP]+disp8 [EDX*4] 101 45 4D010 55 90 5D91 65 92 6D 93 75 947D 95 96 97..........[EBX*4].......... 011.... 98... 99... 9A... 9B... 9C... 9D 9E 9F none 100 A0 A1 A2 A3 A4 A5 A6 A7....................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 13

Utasítás dekódolásra 5. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 8C 24 80 00 00 00 10 001 100 00 100 100 mov ecx, [esp+80h] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal)....................................... [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D [ESI]+disp8 110 46 4E 56 5E 66 6E 76 7E [EDI]+displ8 111 47 4F 57 5F 67 6F 77 7F [EAX]+disp32 10 000 80 88 90 98 A0 A8 B0 B8 [ECX]+disp32 001 81 89 91 99 A1 A9 B1 B9 [EDX]+disp32 010 82 8A 92 9A A2 AA B2 BA [EBX]+disp32 011 83 8B 93 9B A3 AB B3 BB [ ][ ]+disp32 100 84 8C 94 9C A4 AC B4 BC [EBP]+disp32 101 85 8D 95 9D A5 AD B5 BD [ESI]+disp32 110 86 8E 96 9E A6 AE B6 BE....................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 14

Utasítás dekódolásra 5. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 8C 24 80 00 00 00 10 001 100 00 100 100 mov ecx, [esp+80h] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod r32 R/M Value of ModR/M EAX Byte ECX (inedx Hexadecimal) EBX ESP megj(1) ESI EDI...........(In. binary)... Base... =...... 000... 001... 010... 011... 100... 101 110 111 [ECX]+disp8 Scaled 001 Index41 SS 49Index 51Value59of SIB61 Byte (in 69Hexadecimal) 71 79 [EDX]+disp8...... 010... 42... 4A... 52... 5A... 62... 6A... 72... 7A......... [EBX]+disp8 [EAX] 011 43 00 4B000 53 00 5B 01 63 02 6B 03 73 047B 05 06 07 [ ][ ]+disp8 [ECX] 100 44 4C001 54 08 5C 09 64 0A 6C 0B 74 0C7C 0D 0E 0F [EBP]+disp8 [EDX] 101 45 4D010 55 10 5D 11 65 12 6D 13 75 147D 15 16 17 [ESI]+disp8 [EBX] 110 46 4E011 56 18 5E 19 66 1A 6E 1B 76 1C7E 1D 1E 1F [EDI]+displ8 none111 47 4F100 57 20 5F 21 67 22 6F 23 77 247F 25 26 27 [EAX]+disp32 10 [EBP] 000 80 88101 90 28 98 29 A0 2A A8 2B B0 2CB8 2D 2E 2F [ECX]+disp32 [ESI] 001 81 89110 91 30 99 31 A1 32 A9 33 B1 34B9 35 36 37 [EDX]+disp32 [EDI] 010 82 8A111 92 38 9A 39 A2 3A AA 3B B2 3CBA 3D 3E 3F [EBX]+disp32 [EAX*2] 011 83 01 8B000 93 40 9B 41 A3 42 AB 43 B3 44BB 45 46 47 [ ][ ]+disp32 [ECX*2] 100 84 8C001 94 48 9C 49 A4 4A AC 4B B4 4CBC 4D 4E 4F [EBP]+disp32 [EDX*2] 101 85 8D010 95 50 9D 51 A5 52 AD 53 B5 54BD 55 56 57 [ESI]+disp32 [EBX*2] 110 86 8E011 96 58 9E 59 A6 5A AE 5B B6 5CBE 5D 5E 5F........... none.......... 100... 60... 61... 62... 63... 64... 65 66 67....................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 14

Utasítás dekódolásra 6. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 54 B5 8C 01 010 100 10 110 101 mov edx, [ebp+esi*4-74h] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal)....................................... [ ][ ] (SIB jön) 100 04 0C 14 1C 24 2C 34 3C disp32 101 05 0D 15 1D 25 2D 35 3D [ESI] 110 06 0E 16 1E 26 2E 36 3E [EDI] 111 07 0F 17 1F 27 2F 37 3F [EAX]+disp8 01 000 40 48 50 58 60 68 70 78 [ECX]+disp8 001 41 49 51 59 61 69 71 79 [EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A [EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B [ ][ ]+disp8 100 44 4C 54 5C 64 6C 74 7C [EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D [ESI]+disp8 110 46 4E 56 5E 66 6E 76 7E [EDI]+displ8 111 47 4F 57 5F 67 6F 77 7F [EAX]+disp32 10 000 80 88 90 98 A0 A8 B0 B8 [ECX]+disp32 001 81 89 91 99 A1 A9 B1 B9....................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 15

Utasítás dekódolásra 6. példa opcode Mod opcode vagy r/m skála index bázis utasítás (hex) (bin) Reg (bin) (bin) (bin) (bin) (bin) 8B 54 B5 8C 01 010 100 10 110 101 mov edx, [ebp+esi*4-74h] r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI (In binary) REG = 000 001 010 011 100 101 110 111 Effective addr Mod R/M Value of ModR/M Byte (in Hexadecimal).......... r32............. EAX... ECX... EDX.... EBX... ESP... megj(1) ESI EDI [ ][ ] (SIB jön) (In binary) 100 Base 04 = 0C 14000 1C001 24010 2C011 341003C 101 110 111 disp32 Scaled 101 Index05SS 0D Index 15Value1D of SIB25 Byte (in 2DHexadecimal) 35 3D [ESI]...... 110... 06... 0E... 16... 1E... 26... 2E... 36... 3E......... [EDI] [EAX*4] 111 07 10 0F000 17 80 1F81 27 82 2F 83 37 84 3F 85 86 87 [EAX]+disp8 01 [ECX*4] 000 40 48001 50 88 58 89 60 8A 68 8B 70 8C78 8D 8E 8F [ECX]+disp8 [EDX*4] 001 41 49010 51 90 59 91 61 92 69 93 71 94 79 95 96 97 [EDX]+disp8 [EBX*4] 010 42 4A011 52 98 5A99 62 9A 6A9B 72 9C7A 9D 9E 9F [EBX]+disp8 none 011 43 4B100 53A0 5BA1 63 A2 6BA3 73 A47B A5 A6 A7 [ ][ ]+disp8 [EBP*4] 100 44 4C101 54A8 5CA9 64AA 6CAB 74 AC7C AD AE AF [EBP]+disp8 [ESI*4] 101 45 4D110 55B0 5DB1 65 B2 6DB3 75 B47D B5 B6 B7 [ESI]+disp8 [EDI*4] 110 46 4E111 56B8 5EB9 66BA 6EBB 76 BC7E BD BE BF [EDI]+displ8 [EAX*8] 111 47 11 4F000 57C0 5FC1 67C2 6FC3 77 C47F C5 C6 C7 [EAX]+disp32 10 [ECX*8] 000 80 88001 90C8 98C9 A0CA A8CB B0 CCB8 CD CE CF [ECX]+disp32 [EDX*8] 001 81 89010 91D0 99D1 A1D2 A9D3 B1 D4B9 D5 D6 D7......................................................................... Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 15

Utasítás értelmezése a Mod bitek alapján opcode (hex) opcode extension Mod/R-ből (bin) utasítás op1 op2 83 000 ADD r/m16/32 imm8 83 001 OR r/m16/32 imm8 83 010 ADC r/m16/32 imm8 83 011 SBB r/m16/32 imm8 83 100 AND r/m16/32 imm8 83 101 SUB r/m16/32 imm8 83 110 XOR r/m16/32 imm8 83 111 CMP r/m16/32 imm8 opcode (hex) Mod (bin) opcode vagy Reg (bin) r/m (bin) utasítás 83 C4 04 11 000 100 add esp,4 Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 16

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 + disassembler működése / 17

Speciális bitek az utasításokban mező neve leírás bitek száma reg általános regiszterek 3 w adat szélessége (16 vagy 32 bit) 1 s immediate adat sign vagy unsigned 1 sreg2 szegmens regiszter megadás (ES,DS,CS, SS ) 2 sreg3 szegmens regiszter megadás (ES,DS,CS, SS, FS, GS ) 3 eee speciális regiszterek,control vagy debug reg. 3 tttn feltételes utasításoknál a feltételt és annak negálását írja le 4 d adatok irányának a leírása 1 Példa adatírányra 8B 75 0C mov esi, dword p t r [ ebp+0ch ] 89 75 0C mov dword p t r [ ebp+0ch ], e s i Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 18

Á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 0 0 0 0 0 0 0 0 0 0 X ID Flag (ID) X Virtual Interrupt Pending (VIP) X Virtual Interrupt Flag (VIF) X Alignment Check (AC) X Virtual-8086 Mode (VM) X Resume Flag (RF) X Nested Task (NT) X I/O Privilege Level (IOPL) S Overflow Flag (OF) C Direction Flag (DF) X Interrupt Enable Flag (IF) X Trap Flag (TF) S Sign Flag (SF) S Zero Flag (ZF) S Auxiliary Carry Flag (AF) S Parity Flag (PF) S Carry Flag (CF) I D V V I I P F A C V M R F 0 N T I O P L O D I T S Z F F F F F F 0 A F 0 P C F 1 F 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 + disassembler működése / 19

Vezérlésátadó utasítások Utasítás Feltétel Leírás jmp 1 feltétel nélkül je ZF = 1 = vagy 0 jne ZF = 0 js SF = 1 < 0 jns SF= 0 0 jg ((SF XOR OF) OR ZF) = 0 > jge (SF XOR OF) = 0 jl (SF XOR OF) = 1 < jle ((SF XOR OF) OR ZF) = 1 ja (CF OR ZF) = 0 > jb CF = 1 < Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 20

Vezérlésátadó utasítások Utasítás Kód Feltétel Negálás (bináris) 3-2-1 bitek 0 bit JZ 01110100 010 0 JNZ 01110101 010 1 JB 01110010 001 0 JNB 01110011 001 1 JG 01111111 111 1 JNG 01111110 111 0 Intel X86 utasításkészlet: http://ref.x86asm.net/index.html Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 21

Section 2 Disassembler Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 22

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 + disassembler működése / 23

Lineárisan pásztázó disassembler előnye egyszerű; 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 + disassembler működése / 24

C program i n t func ( i n t a, i n t b ) { i n t c ; c= a + b ; return c 6; } Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 25

Disassembler output (dumpbin) _func : 00000000: 55 push ebp 00000001: 8B EC mov ebp, esp 00000003: 51 push ecx 00000004: 8B 45 08 mov eax, dword p t r [ ebp+8] 00000007: 03 45 0C add eax, dword p t r [ ebp+0ch] 0000000A : 89 45 FC mov dword p t r [ ebp 4], eax 0000000D: 8B 45 FC mov eax, dword p t r [ ebp 4] 00000010: 83 E8 06 sub eax, 6 00000013: 8B E5 mov esp, ebp 00000015: 5D pop ebp 00000016: C3 r e t Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 26

Lineárisan pásztázó disassembler összezavarása (obfuscation) i n t func ( i n t a, i n t b ) { i n t c ; goto L ; _asm { _emit 0 x0f ; } L : c= a + b ; return c 6; } Szemét byte Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 27

Disassembler output (dumpbin) _func : 00000000: 55 push ebp 00000001: 8B EC mov ebp, esp 00000003: 51 push ecx 00000004: EB 01 jmp 00000007 00000006: 0F 8B 45 08 03 45 jnp 45030851 0000000C: 0C 89 or al, 89 h 0000000E : 45 inc ebp 0000000F : FC cld 00000010: 8B 45 FC mov eax, dword ptr [ ebp 4] 00000013: 83 E8 06 sub eax, 6 00000016: 8B E5 mov esp, ebp 00000018: 5D pop ebp 00000019: C3 r e t Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 28

Disassembler output (dumpbin) _func : 00000000: 55 push ebp 00000001: 8B EC mov ebp, esp 00000003: 51 push ecx 00000004: EB 01 jmp 00000007 00000006: 0F 8B 45 08 03 45 jnp 45030851 0000000C: 0C 89 or al, 89 h 0000000E : 45 inc ebp 0000000F : FC cld 00000010: 8B 45 FC mov eax, dword ptr [ ebp 4] 00000013: 83 E8 06 sub eax, 6 00000016: 8B E5 mov esp, ebp 00000018: 5D pop ebp 00000019: C3 r e t hibás utasítás; Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 28

Disassembler output (dumpbin) _func : 00000000: 55 push ebp 00000001: 8B EC mov ebp, esp 00000003: 51 push ecx 00000004: EB 01 jmp 00000007 00000006: 0F 8B 45 08 03 45 jnp 45030851 0000000C: 0C 89 or al, 89 h 0000000E : 45 inc ebp 0000000F : FC cld 00000010: 8B 45 FC mov eax, dword ptr [ ebp 4] 00000013: 83 E8 06 sub eax, 6 00000016: 8B E5 mov esp, ebp 00000018: 5D pop ebp 00000019: C3 r e t hibás utasítás; szinkronizálás jó utasítás határra. Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 28

Rekurzívan pásztázó disassembler utasításfeldolgozás sorrendje nem vezérlésátadó utasítás esetén a következő utasításon folytatódik; feltételes ugrásnál az ugrás címén folytatódik az adatok feldolgozása, és később visszatér az utasítást követő részekhez; függvényhívásnál az eljárás címétől folytatódik a disassemblálás, és azt befejezve a következő utasításra kell rátérni; feltétel nélküli ugrás esetén az ugrás címén lévő 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évő adatokat feldolgoztuk, akkor vissza kell térni a hívó rutinhoz. Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 29

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 + disassembler működése / 30

Rekurzívan pásztázó disassembler előnye 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 + disassembler működése / 31

Ollydebug output 00401000 55 push ebp 00401001 8BEC mov ebp, esp 00401003 51 push ecx 00401004 EB 01 jmp short 00401007 00401006 0F db 0F 00401007 8B45 08 mov eax, dword ptr ss : [ arg.1 ] 0040100A 0345 0C add eax, dword ptr ss : [ arg.2 ] 0040100D 8945 FC mov dword ptr ss : [ l o c a l. 1 ], eax 00401010 8B45 FC mov eax, dword ptr ss : [ l o c a l. 1 ] 00401013 83E8 06 sub eax, 6 00401016 8BE5 mov esp, ebp 00401018 5D pop ebp 00401019 C3 r e t n Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 32

IDA disassembler output 00000000 55 push ebp 00000001 8B EC mov ebp, esp 00000003 51 push ecx 00000004 EB 01 jmp short loc_ 7 00000006 0F db 0Fh 00000007 loc_ 7 : 00000007 8B 45 08 mov eax, [ ebp+arg_0 ] 0000000A 03 45 0C add eax, [ ebp+arg_4 ] 0000000D 89 45 FC mov [ ebp+var_4 ], eax 00000010 8B 45 FC mov eax, [ ebp+var_4 ] 00000013 83 E8 06 sub eax, 6 00000016 8B E5 mov esp, ebp 00000018 5D pop ebp 00000019 C3 r e t n Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 33

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 Junk ; goto L ; Junk : _asm { _emit 0 x0f ; } L : c= a + b ; return c 6; } Átlátszó feltétel Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 34

Ollydebug output 00401000 55 push ebp 00401001 8B EC mov ebp, esp 00401003 83 EC 08 sub esp, 8 00401006 8B 45 08 mov eax, dword ptr ss : [ ebp+8] 00401009 89 45 F8 mov dword ptr ss : [ ebp 8], eax 0040100C 8B 4D F8 mov ecx, dword ptr ss : [ ebp 8] 0040100F 83 F1 FF xor ecx, FFFFFFFF 00401012 89 4D FC mov dword ptr ss : [ ebp 4], ecx 00401015 8B 55 F8 mov edx, dword ptr ss : [ ebp 8] 00401018 F7 D2 not edx 0040101A 3B 55 FC cmp edx, dword ptr ss : [ ebp 4] 0040101D 74 02 je short 00401021 0040101F EB 02 jmp short 00401023 00401021 EB 01 jmp short 00401024 00401023 0F db 0F 00401024 8B 45 08 mov eax, dword ptr ss : [ ebp+8] 00401027 03 45 0C add eax, dword ptr ss : [ ebp+0c] 0040102A 89 45 F8jól elkülönítet- mov dword ptr ss : [ ebp 8], eax 0040102D 8B 45 F8te az mov adatot eax a, dword ptr ss : [ ebp 8] 00401030 83 E8 06kódtól. sub eax, 6 00401033 8B E5 mov esp, ebp 00401035 5D pop ebp 00401036 C3 r e t n Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 35

IDA disassembler output 00000000 55 push ebp 00000001 8B EC mov ebp, esp 00000003 83 EC 08 sub esp, 8 00000006 8B 45 08 mov eax, [ ebp+arg_0 ] 00000009 89 45 F8 mov [ ebp+var_8 ], eax 0000000C 8B 4D F8 mov ecx, [ ebp+var_8 ] 0000000F 83 F1 FF xor ecx, 0FFFFFFFFh 00000012 89 4D FC mov [ ebp+var_4 ], ecx 00000015 8B 55 F8 mov edx, [ ebp+var_8 ] 00000018 F7 D2 not edx 0000001A 3B 55 FC cmp edx, [ ebp+var_4 ] 0000001D 74 02 j z short loc_21 0000001F EB 02 jmp short loc_23 00000021 loc_21 : 00000021 EB 01 jmp short near ptr loc_23+1 00000023 loc_23 : 00000023 0F 8B 45 08+ jnp near ptr 4503086Eh 00000029 0C 89 or al, 89h 0000002B 45 inc ebp 0000002C F8 clc 0000002D 8B 45 F8 mov eax, [ ebp+var_8 ] 00000030 83 E8 06 sub eax, 6 00000033 8B E5 mov hibás visszafejtés esp, ebp 00000035 5D pop ebp 00000036 C3 r e t n Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 36

Átlátszó feltétel Ha feltételes elágazásnál tudjuk, hogy az egyik ág sohasem következhet be, átlátszó feltételről (opaque predicate) beszélünk. i f ( i +1 < i ) goto Label ; Az előző feltételt könnyű felismerni, és a felesleges kódot kiszűrni. A jó átlátszó feltétel értéke fordítási időben ismert, de nehéz észrevenni, hogy a feltétel értéke konstans, annak ellenére, hogy a benne szerepet játszó tagok változnak Ezzel a rekurzív disassemblert megzavarhatjuk, és a visszafejtés idejét megnövelhetjük. Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 37

Átlátszó feltétel gráffal megvalósítva F T f->first T F f f->second g F fordítási időben ismert, hogy a program adott pontján lévő feltétel igaz vagy hamis; fordítási időben ismert, hogy a pointerek hova mutatnak; a gráf menetközben változhat. i f ( f > f i r s t >value ) goto Label ; i f ( f >second == g ) goto Label ; Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 38

Visszatérési cím manipulálása A függvény a stack-en lévő visszatérési címet megváltoztatja, így nem a hívás után folytatódik a program. A visszatérési érték kiszámításához használhatunk hash táblát, ami a stackre letett visszatérési cím alapján megadja, hogy mennyivel odébb kell folytatni a programot. a jump utasításokat is helyettesíthetjük ilyen trükkös függvényhívással. Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 39

Visszatérési cím manipulálására példa #include < s t d i o. h> void s t d c a l l 1 f ( i n t k ) { i n t pk=&k ; / stack en lévő paraméter címe / pk ; / v i s s z a t é r é s i cím / pk +=9; / r e t addr += 9 / } i n t main ( ) { i n t a=1; f ( 4 ) ; a++; 2 / eax < a, eax < eax+1, a < eax ; 9 byte / / ide térünk vissza / p r i n t f ( "%d \ n ", a ) ; return 0; } 1 stack kezelés következő órán 2 optimalizálás nélkül fordítva Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 40

Miért olyan okos az Ollydebug Különböző heurisztikákat alkalmaz. 12 menetben analizálja a kódot; utasítás kezdet tesztelése, nem lehet olyan helyen, ami a program memóriában elfoglalt helyétől függ, nem lehet olyan ugrás, aminek a címe kimutat a címtartományból, stb. kettőnél többször történik ugrás egy területre, az 0.99 valószínűséggel kód, függvényhívásnál a paraméterek elmentése, lokális változók helyfoglalása, stb. árulkodó lehet. 2200 rendszerhívást ismer; 7800 konstans szimbolikus nevét felismeri; for, while, stb vezérlésszerkezetet felismeri; Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 41