Download - uvod do x86 strojoveho kodu a assembleru
vod do x86 strojovho kdu a assembleru
Nudn ale nevyhnutn
Na o preBoha assembler?
Znalos vs. vyuvanie
Kvalitn znalos vyaduje aspo nejak vyuvanie
Vyuvanie neznamen len programovanie v om
Vyuitie:Reverse engineering
Driver / system level programming
Copy protection
Machine code manipulation (compiler, packer, analyzer...)
????
Profit
X86 milestones
8086 (16-bit)
80286 (chrnen md)
80386 (32-bitov chrnen md + mnostvo novch fir)
X86-64
Rozren intrukn sady: FPU (x87), MMX, SSE, SSE2, SSE3, SSSE3, SSE4, SSE5, VMX, SMX, SVM, AVX, XOP, ...
Chrbtica x86
CPU
NorthbridgeRAMVideo RAMOM
Southbridge
Vetko ostatn
(nie naozaj)
o z toho pre ns vyplva
Procesor pristupuje k vetkm zariadeniam tm istm mechanizmom (ako k RAM), nepotrebuje zvltne intrukcie nie celkom pravda, ale pre n el uiton abstrakcia
Nebudeme sa zaobera systmovmi a mlo pouvanmi intrukciami (segmentcia, strnkovanie, task switching, strnkovanie, 16-bit a real md)
Sta nm zvldnu zkladn opercie a prcu s pamou
Intrukcie
Pokyny pre procesor (CPU) uloen v pamti
CPU ich ta a vykonva
Principilne sa nim nelia od bench dt v pamti
DOS program na rieenie sudoku (62 bytov):
B4 3F 8B D5 CD 21 91 43 88 02 4E 78 F7 B8 31 40 80 3A 2E 75 F5 8B F9 4F 60 78 ED 38 03 75 11 97 D4 13 6B C0 0B 96 43 7B F7 33 C6 A9 C0 E0 7E 02 F6 E4 61 70 E2 C6 02 2E 3C 39 74 F6 EB D1
Zpisy intrukcii
Binrny: 00000001 11011000
Hexadecimlny: 01 D80000-0001 1101-1000
Osmikov: 001 33000-000-001 11-011-000
Desiatkov:fuj
Assembler:add eax, ebxadd %ebx, %eax (fuj)
0000-00001-10010-20011-30100-40101-50110-60111-7
1000-81001-91010-A1011-B1100-C1101-D1110-E1111-F
General purpose registre
Register = premenn procesoru
CPU m mnostvo registrov, 99.9% asu sa ale pracuje s general purpose registrami (GPR)V benej (?) rei preto Register = General Purpose Register
x86 m 8 GPR (a x86-64 rozrilo poet na 16)
8086 mal 16-bitov GPR registre: AX, BX, CX, DX, SP, BP, SI, DI
Monos pristupova k 8-bit astiam prvch 4 registrov:AL (low), AH (high), BL, BH, CL, CH, DL, DH
386 rozril na 32-bitov:EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI
pecializovan vyuitie
general purpose registrov
0 = [E]AX = accumulator1 = [E]CX = counter2 = [E]DX = data3 = [E]BX = base4 = [E]SP = stack pointer5 = [E]BP = base pointer6 = [E]SI = source index7 = [E]DI = destrination index
Formt x86 intrukcie
Prefix voliten byte pred intrukciou, menia jej funknos
Mnemonics udva zkladn operciu ktor sa vykon
Operand udva register alebo pamov premennp, nad ktorou sa vykon opercia. Operandy mu by 0 a 3.Operandy musia by rovnakej vekosti
Cieov (destination) operand prv
Niektor intrukcie maj implicitn operand
Presun / priradenie hodnoty GPR
MOV (move)mov eax, 31337mov ecx, 123mov esi, edxmov bh, almov al, 500(neplatn)mov eax, sp(neplatn)mov ah, ebx(neplatn)
Set / Rozdiel
ADD (addition)add ebx, eaxadd esp, 1
INC (increment, jeden operand)inc eax
SUB (subtract)sub ebp, 20sub eax, ebx
DEC (decrement, jeden operand)dec ecx
Bitov opercie
ANDand al, 11111100b
XORxor al, 101b
ORor al, 100b
NOT (jeden operand)not al
Negatvne sla
sla ktor mu nadobda aj zporn hodnotu sa nazvaj znamienkov
Existuje niekoko monost ako ich reprezentova v binrnej forme
Najikovnej two's complementTie ist opercie pre znamienkov aj neznamienkov sla
Horn bit udva znamienko
Podteenie: najmenia hodnota 1 = najvia hodnota
Preteenie: najvia hodnota +1 = najvia hodnota
Two's complement
00000001 (1)-00000001 (1)00000000 (0)
00000010 (2)-00000001 (1)00000001 (1)
00000111 (7)-00000010 (2)00000101 (5)
00000000 (0)-00000001 (1)11111111 (255)
00000000 (0)-00000010 (1)11111110 (254)
00000011 (3)+11111111 (255)00000010 (2)
Negatvne sla
add eax, ebxsub ecx, 5add al, -1 add al, 255sub al, 1sub cl, -5sub cl, 251add cl, 5
Negcia sla
NEG (negation)neg eaxneg dxneg cl
Bitwise spsobnot eaxinc eax
Napr.:00000001 (1)not11111110 (-2)+111111111 (-1)
Pam (z pohadu CPU)
Pole bytov
Adresovan 32-bitovm slom, toto udva pozciu (index) bytu v poli.
Nieje mon pristupova k dvom miestam v pamti vrmci jednej intrukcie
Zpis operandu pre prstup k pamti v assembleri:[adresa](adresa v hranatch ztvorkch)
Priama adrescia pamte
mov al, [1]mov [2], aladd [0], eaxxor esp, [20]mov [30], [29]- neexistujesub [0], [1]-neexistuje
Endianness
Monos pristupova k pamti v rznych vekostiach8-bit - byte16-bit - word32-bit - dword (double word)64-bit - qword (quad word, X86-64 only)
Poradie bytov vo vch slach od najmenej vznamnho po najviac vznamn (tzv. little endian)byty 00h, 01h = word 100h = word 100000000b = 256
byty 11h, 22h, 33h, 44h = dword 44332211h
Priama adrescia pamte
mov eax, [1234]mov eax, dword [1234]mov [31337], ecxadd [20], ebxinc byte [0]inc word [0]neg dword [1]
Nepriama adrescia pamte
Ako adresa me by pouit aj hodnota v registri:mov eax, dword [ebx]mov al, byte [esi]
K registru v adrese me by pripotan kontantamov edx, dword [ebx+4]mov al, byte [esi-1]
Nepriama adrescia pamte
pln forma 32-bitovej adrescie:[base + scale*index + displacement]base - ubovoln registerscale - kontanta 1, 2, 4, alebo 8index - ubovoln registerdisplacement - seln 32-bit kontanta
Naprklad:[ebx + 4*edi + 401224][eax + eax] = [2*eax][8*eax][3*ebx + 3] = [ebx + 2*ebx + 3]
Nepodmienen skok
JMP (jump, nepodmienen skok)jmp 200jmp dword [200]jmp eaxjmp dword [eax]
V assembleri seln adresy nahrdzame symbolickmi nvestiami:jmp konieckoniec:
Prznaky
CPU m register flags (korektne prznaky, hovorovo flagy)
Kad z jeho bitov m samostatn vznam
Netame ani nezapisujeme ho priamo
Nastavuje sa poda vsledku (nielen) aritmetickch intrukcii
Prznaky
CF (carry flag)Nastav sa ak opercia preteie ako celoseln
Inak vyuvan intrukciami ktor potrebuj nejak flag
OF (overflow flag)Nastav sa ak opercia preteie ako znamienkov
SF (sign flag)Nastav sa ak je vsledkom opercie zporn slo (horn bit vsledku je 1)
ZF (zero flag)Nastav sa ak vsledok opercie je nula.
Preteenie
mov al, 0sub al, 1CF=1, OF=0, SF=1
mov al, 0add al, 11111111bCF=0, OF=1, SF=1
mov al, 0sub al, 11111111bCF=1, OF=1, SF=0
Podmienen skoky
Sku iba ak je splnen podmienkaJC (jump if carry)- CF=1JNC (jump if not carry)- CF=0JO (jump if overflow)- OF=1JNO (jump if not overflow)- OF=0JS (jump if signed)- SF=1JNS (jump if not signed)- SF=0JZ (jump if zero)- ZF=1JNZ (jump if not zero)- ZF=0
Prklad:
Nulovanie 16 bytov
mov ecx, 16 ;nuluj 16 bytovmov edi, 5 ;od adresy 5nuluj:mov byte [edi], 0 ;vynuluj byte na adrese EDIinc edi ;posun EDI na dalsi bytedec ecx ;dalsi byte hotovyjnz nuluj ;ak je ecx>0, opakuj cyklus
CMP
CMP (compare)Porovnva dva operandy
Nastav flagy pre pecilne skoky
V skutonosti SUB ktor neprepe cieov register, iba nastav flagy poda vsledku odpotania.
Prklady:cmp eax, ebxcmp eax, dword [4]cmp byte [eax], dlcmp ecx, 30
CMP pre neznamienkov sla
Podmienen skoky:JB jump if 1st operand below 2ndJBE jump if 1st operand below or equal to 2ndJE jump if 1st operand equal to 2ndJAE jump if 1st operand above or equal to 2ndJA jump if 1st operand above 2nd
Pre kad z nich mono obrti podmienku: JN (jump if not) namiesto J (jump if)
CMP pre znamienkov sla
Podmienen skoky:JL jump if 1st operand lower than 2ndJLE jump if 1st operand lower than or equal to 2ndJE jump if 1st operand equal to 2ndJGE jump if 1st operand greater than or equal to 2ndJG jump if 1st operand greater than 2nd
Pre kad z nich mono obrti podmienku: JN (jump if not) namiesto J (jump if)
Prklad #2
Nulovanie 16 bytov inak
mov ecx, 0
nuluj:mov byte [ecx+5], 0 ;vynuluj ECX-ty byte od;adresy 5inc ecx ;dalsi byte hotovycmp ecx, 16 ;hotovych 16 bytov?jne nuluj ;ak je ecx>0, opakuj cyklus
Prklad #3
Porovnanie reazcov
mov esi, retazec1mov edi, retazec2porovnaj:mov al, byte [esi] ;nacitaj znak prvehocmp byte [edi], al ;porovnaj so znakom;druhehoja druhy_vacsi ;znak druheho vacsi?jb prvy_vacsi ;znak druheho mensi?inc esi ;ak su rovnake, posuninc edi ;na dalsi znakjmp porovnaj ;a repete
o je assembler?
Program, ktor preklad symbolick zpis intrukcii na binrny strojov kd
Syntax zpisu intrukcii sa medzi rznymi assemblermi viac i menej odliuje
Z toho prenesene assembler ako oznaenie niektorej konkrtnej syntaxe
V irokom zmysle sa assembler pouva aj ako oznaenie ubovolnej syntaxe ktor reprezentuje priamo strojov kd
Rozren assemblery
MASM (Microsoft Macro Assembler)MASM32 projekt
gas (GNU Assembler)
NASM (Netwide Assembler)YASM (Yet-another Assembler, ...)
FASM (Flat Assembler)
GoAsm, HLA (High Level Assembly), RosAsm
Zdroje pre tdium
Intel x86 CPU manualshttp://developer.intel.com/products/processor/manuals/index.htm
AMD CPU manualshttp://developer.amd.com/documentation/guides/pages/default.aspx#manuals
Art of assembly programming (Randall Hyde)http://webster.cs.ucr.edu/
Asm komunity:http://www.asmcommunity.net/board/ (General)
http://board.flatassembler.net (FASM)
http://www.masm32.com/board/ (MASM)
Newsgroups: alt.lang.asm, comp.lang.x86.asm
Nabudce (?)
Zsobnk
Procedry
Volacie tandardy (stdcall, ccall, fastcall, vararg)
alie prdavn intrukcie
o ma ete napadne
Socializcia
vid (nie 'Vid')