Add2v4.txt

(23 KB) Pobierz
Witam !
Ten tekst pozwoli wam troszke lepiej zrozumiec kod assemblera, (nie nauczycie sie jak pisac w assemblerze, lecz zrozumiecie co sie dzieje w kodzie)
Jest to zbior instrukcji itp. taka mala sciaga (sklecona z kilku tekstow, a takze dodane od siebie) co i jak, gdy zaczynalem bardzo mi sie przydawala, wiec i tobie nie zaszkodzi jak przeczytasz, a napweno kilka razy tu zagladniesz podczas analizowania kodu.
Wiec jesli podczas sledzenia kodu nie bedziesz wiedzial co robi jakas instrukcja zagladnij tutaj, moze ja znajdziesz !

Jesli czegos nie rozumiesz, nie martw sie, przeczytaj to drugi raz i jescze raz, poszukaj, poprobuj i jak Ci dalej nie wychodzi to...
masz pecha... zartowalem wy macie szczescie, bo macie NAS, a my postaramy sie wam wszystko wytlumaczyc, lub nakierowc co gdzie i jak !

{Tak na marginesie, mysle ze nie ma jako takich dobrych kursow w sieci czy to Asma, C, C++ itd. Bo po co ktos mialby pisac cos takiego, ani za to kasy nie dostanie, ani nic <bardzo powoli zaczyna sie wydawanie ksiazek w internecie> no chyba ze ktos zeskanuje ksiazke i umiesci ja w sieci wtedy jest to dobry material, ale najczesciej sa to ksiazki po angielsku. Wiec jesli chcesz sie czegos nauczyc, a w szczegolnosci jezyka programowania np. C++, czy assemblera to kup sobie ksiazke i sie ucz. Na pewno stracisz mniej czasu niz czytanie 10 tekstow z sucha teoria i kazda o tym samym}

SPIS TRESCI:
1. [REJESTR]
2. [BUDOWA REJESTROW EAX, EBX, ECX, EDX]
3. [FLAGI]
4. [OPERACJE ARYTMETYCZNE]
5. [ADD]
6. [SUB]
7. [MUL]
8. [DIV]
9. [STOS i PUSH/POP]
10. [MOV]
11. [XOR]
12. [AND]
13. [CALL]
14. [CMP]
15. [TEST]
16. [LOOP]
17. [NOP]
18. [NOT]
19. [OR]
20. [ROL]
21. [ROR]
22. [RET]
23. [SHL]
24. [SHR]
25. [XCHG]
26. [BSWAP]
27. [MOV EAX, [ESI+1] itd]
28. [TABELKA SKOKOW]
29. [Komendy SI]
30. [FUNKCJE API]

--------------------------------------------------------------------------------------------

[REJESTR]

AX - G��wnie wykorzystywany do operacji logicznych i arytmetycznych.
BX - Wykorzystywany przy adresowaniu pami�ci.
CX - S�u�y jako licznik
DX - Wykorzystywany do mno�enia i dzielenia lub do wysy�ania i odbierania danych z port�w.
SI - Indeksuje pami�� oraz wskazuje obszar, z kt�rego przysy�ane s� dane.
DI - Indeksuje pami�� oraz wskazuje obszar, do kt�rego wysy��my dane.
SP - Wska�nik stosu.
BP - S�u�y do adresowania pami�ci. 
S� to rejestry 16 bitowe. Pierwsze cztery dziel� sie na dwa 8 bitowe. np. AX - AL i AH.

S� jeszcze cztery rejestry segmentowe : 
CS - Zawiera segment aktualnie wykonywanego rozkazu.
DS - rejestr wskazujacy poczatek segmentu danych 
ES - rejestr dodatkowu wskazujacy dodatkowy segment danych 
SS - rejestr stosu wskazuje poczatek segmentu stosu 

Takze pary rejestrow:

     DS:SI      ; Moze byc uzyta jako zrodlo do operacji na stringach
     ES:DI      ; Uzywana jako cel przy operacjach na stringach ;)

--------------------------------------------------------------------------------------------

[BUDOWA REJESTROW EAX, EBX, ECX, EDX]

        E           AX
  ===========================
  |           |  AH  |  AL  |
  ===========================

tak wiec jesli np: w EAX=00123456 to:

     E    AX
  ============
  |0012|34|56|
  ============
        AH AL
(juz teraz bedziesz wiedzial jak wykona sie XCHG EAX {XCHG-opis w dalszej czesci})
--------------------------------------------------------------------------------------------

[FLAGI]

Jest jeszcze rejestr znacznik�w. Jest to 9 bit�w, kt�re informuj� o stanie procesora. Niekt�re z nich mo�emy ustawi�, a niekt�re tylko odczytywa�. Te znaczniki (flagi) to : 

O - Jest ustawiany, gdy wyst�pi nadmiar w operacjach arytmetycznych.
D - Okre�la czy dane b�d� przesy�ane w kolejno�ci adres�w malej�cych lub rosn�cych.
I - Okre�la czy przewanie sprzetowe ma zosta� wykonane natychmiast, czy dopiero po sko�czeniu wykonywania programu.
T - Znacznik pracy krokowej.
S - Zawiera znak ostatnio wykonanej operacji arytmetycznej.
Z - Zostaje ustawiony je�li wynik ostatniej operacji r�wny byl zero.
A - Znacznik przeniesienia po��wkowego.
P - Znacznik parzysto�ci.
C - Znacznik przeniesienia. 
--------------------------------------------------------------------------------------------

[OPERACJE ARYTMETYCZNE]

Do wykonywania operacji arytmetycznych w assemblerze s�u�� nast�puj�ce instrukcje: 
   ADD rejestr,zmienna     - Dodanie do rejestru zmiennej
   SUB rejestr,zmienna     - Odj�cie od rejestru zmiennej
   MUL rejestr lub zmienna - Mno�enie
   DIV rejestr lub zmienna - Dzielenie
   INC rejestr             - Zwi�kszenie rejestru o 1
   DEC rejestr             - Zmniejszenie rejestru o 1

W przypadku mno�enia drugi czynnik musi znajdowa� si� w rejestrze AL, natomiast wynik mno�enia b�dzie w AX. W przypadku dzielenia, dzielna powinna znajdowa� si� w rejestrze AX, natomiast wynik b�dzie w AH. 
--------------------------------------------------------------------------------------------

[ADD]

dodawanie (do rejestru wartosci zmiennej) np:
EAX=00000000

ADD EAX, 32
po wykonaniu
EAX=00000032 
--------------------------------------------------------------------------------------------

[SUB]

odejmowanie (od rejestru wartosci zmiennej)
EAX=00000009

SUB EAX, 2

EAX=00000007
--------------------------------------------------------------------------------------------

[MUL] 

skladnia MUL'a w przykladzie: MUL ma tylko jeden parametr,
drugi przyjmuje domyslnie jako AL. Wiec np. MUL CL spowoduje 
dzialanie AL*CL, a wynik wyladuje w AX

operacja mnozenia. Przykladzik (mamy taki kawalek kodu):

MOV AL, 5
MOV AH, 20
MUL AH, AL

Po takim ciagu instrukcji w AX znajdzie sie wartosc A0H.
--------------------------------------------------------------------------------------------

[DIV] 

operacja dzielenia. Przykladzik (mamy taki kawalek kodu):

MOV AX, 45
MOV DL, 4
DIV DL

Po takim kawalku kodu w rejestrze AL bedzie 11 a w AH reszta z 
dzielenia czyli 1.
--------------------------------------------------------------------------------------------

[STOS i PUSH/POP] 

Zanim jakakolwiek funkcja zostanie wywolana (call), program musi 'polozyc' kazdy parametr ktorego funkcja oczekuje, na stosie.Pomysl o tym jak o stosie kartek, pierwsza kartka (od dolu ;) bedzie podniesiona jako ostatnia - stos dziala tak samo.Musisz to zapamietac ta zasade 'pierwszy polozony/ostatni zdjety' , znaczy to ze parametry bede "polozone" w odwrotnej kolejnosci ...

Jesli namieszalem Ci moim gadaniem to popatrz na przykald:

Funkcja API - GetWindowText wymaga nastepujacych parametrow:

(1) Uchwyt okna
(2) Identyfikator editboxa
(3) Adres bufora tekstowego
(4) Maksymalna dlugosc tekstu

W programie bedzie to wygladalo tak:

     MOV EDI,[ESP+00000220]     ; Zachowaj uchwyt okna w EDI
     PUSH 00000100              ; PUSH (4) Maksymalna dlugosc tekstu
     PUSH 00406130              ; PUSH (3) Adres bufora tekstowego
     PUSH 00000405              ; PUSH (2) Identyfikator editboxa
     PUSH EDI                   ; PUSH (1) Uchwyt okna
     CALL GetWindowText         ; CALL (wywolaj) funkcje

Proste nie ? To jest najprostszy sposob na zlamanie proga ktory jest zabezpieczony serialem, Jesli znasz adres bufora dla (wpisanego) seriala, w tym przypadku 00406130, poprostu ustaw na nim pulapke, i czekaj az wyladujesz w procedurze generujacej prawdziwy serial :)

POP jest uzywane do 'zdjecia' pierwszej wartosci ze stosu, zazwyczaj jest ich duzo w funkcjach
--------------------------------------------------------------------------------------------

[MOV] 

MOV dest,src  
Kopiuje bajt lub slowo ze src do  dest  
MOV EAX, 10
po wykonaniu EAX=00000010
--------------------------------------------------------------------------------------------

[XOR]

XOR -alternatywa logiczna. Mysle ze dzialanie tej komendy najlepiej przedstawic na przykladzie.
Ale najpierw tabelka z matematyki (logika i te sprawy :))

	====================================
	|   A   |   B   |   C == XOR A B   |
	====================================
	|   1   |   1   |        0         |
	====================================
	|   1   |   0   |        1         |
	====================================
	|   0   |   1   |        1         |
	====================================
	|   0   |   0   |        0         |
	====================================

Powinniscie juz skumac o co biega w xorowaniu. Ale na wszelki wypadek dam jeszcze z jeden przykladzik na xorowanie (tak zupelnie na wszelki wypadek ;)) Wiec zalozmy ze mamy przed soba taki kawalek kodu programu:

MOV AL,0D2 (binarnie jest to: 11010010B)
MOV BL,9B  (binarnie jest to: 10011011B)
------------------------------------------
XOR AL,BL  -------------->    01001001B

wynik XOR'owanie umieszczony zostanie w AL (gdzyby bylo XOR BL,AL to wynik umieszczony zostalby w BL) a jest nim 01001001B. Mysle ze teraz juz wszystko jasne :)

Ta instrukcja czesto uzywana jest do zerowania rejestrow, gdyz jak widzimy (tabelka powyzej) 1 XOR 1 lub 0 XOR 0 daje zawsze zero wiec:
XOR EAX, EAX
Zawsze po wykonaniu EAX=00000000
--------------------------------------------------------------------------------------------

[AND]

iloczyn logiczny ... i tabelka z matmy (logika of kozzz :))

	====================================
	|   A   |   B   |   C == AND A B   |
	====================================
	|   1   |   1   |        1         |
	====================================
	|   1   |   0   |        0         |
	====================================
	|   0   |   1   |        0         |
	====================================
	|   0   |   0   |        0         |
	====================================

Dokladniejszy opis przy xorowaniu ... jak tamto skumacie to to tez 
powinniscie :>
--------------------------------------------------------------------------------------------

[C...
Zgłoś jeśli naruszono regulamin