Assembler este ușor! Învățați să eliberați programul n 10 (bler)

De ce am început cu berea? Da, de aceea: în prezent există patru vesti bune:

De asemenea, mulțumesc tuturor celor care mi-au trimis propuneri privind ocuparea forței de muncă. Dragii mei! Să vă arătați puțin și o mare de recunoștință.







Dacă nu aveți acces la rețea, scrieți-mi o scrisoare cu o cerere de a trimite această problemă sau toate acestea împreună:

Iată o scrisoare de la Leonid. Există o mulțime de scrisori similare, așa că voi răspunde unui lucru ca oricui:

Bună ziua, Oleg!

Aș vrea să mă întâlnesc, dar nu știu de ce. Spune-mi de unde să încep (de la zero); dacă există ceva în formă electronică, atunci, dacă nu dificil, a ieșit.

Cu stimă, Leonid.

Program din ultima ediție.

Acum despre problema precedentă. Ce am avut pentru program? Da! Se descarcă în memorie. Ie pe partea de sus a ei (în partea de sus a codului său). V-am cerut cu bună știință să îl numiți less009.asm. pentru că dacă programul nu găsește un fișier cu acest nume (* .com), acesta va ieși și va emite un semnal sonor. O fată care este interesată de programarea în Assembler (da, draga mea, sunt femei în rândurile noastre, la care sunt foarte fericit!), Numit lucrarea programului "devilry". De fapt, nu este nimic complicat în ea. Sper că înțelegeți că în Assembler puteți face lucruri incredibile care nu sunt disponibile în limbile de nivel înalt (BASIC, C, Pascal).

; Programul se scrie în locația unde este stocată memoria.

își asumă CS: CSEG, DS: CSEG, ES: CSEG, SS: CSEG

mov dx, offset Numele fișierului; Deschideți fișierul

apelați Open_file; cu ajutorul unei proceduri speciale (vezi mai jos).

jc Error_file; Accesați Error_file la eșec.

mov bx, ax; Salvați fișierul ID și

mov cx, offset Finish-100h; Redactăm lungimea programului (numărul de octeți lizibili),

mov dx, offset Începe; și citiți fișierul în memorie,

apelați Close_file; Închidem dosarul utilizând o procedură specială (vedeți mai jos).

mov ah, 9; Afișăm mesajul de finalizare cu succes.

mov dx, offset Mess_ok

; Dacă fișierul cu numele specificat nu a fost găsit (File_name db 'less009.com', 0), atunci vom alimenta și vom ieși. (notă - OK)

Open_file proc; Procedura de deschidere a unui fișier pentru citire,

cmp mâner, 0FFFFh; în care se stabilește dacă dosarul este deschis,

jne Quit_open; și dacă nu deschis - o deschidem.

STC; Setați steagul de transportare la 1, necesar

ret; pentru a confirma deschiderea fișierului (pentru jc).

Manipulați dw 0FFFFh

Close_file proc; Procedura de închidere a unui fișier,

cmp mâner, 0FFFFh; cu condiția să fie deschisă.

Numele fișierului db 'less009.com', 0

Mess_ok db 'Este OK!', 0Ah, 0Dh, '$'; 0Ah, 0Dh - mergeți la începutul liniei următoare,

; tip writeln sau puts ().

În detaliu, vom analiza modul în care aceste programe funcționează mai târziu.

Cei mai mulți dintre voi ați votat pentru a studia Asembler în acest fel:

rapid DOS și apoi Windows. Cred că va fi mai interesant și mai eficient decât să studiezi DOS sau să mergi imediat la Windows. Astfel, începem să studiem DOS.

În ceea ce privește programul pe care îl vom scrie, în timp ce studiem Asamblatorul în paralel, rezultatele sunt:

1. Norton Commander;

În primul rând, totuși, shell-ul a ieșit, dar nu cu mult înaintea virusului.

Astăzi avem o lansare experimentală. Să încercăm să trecem subiectul mai rapid decât cel stabilit. Dacă nu înțelegeți ceva, scrieți. Vino la forumul de pe site. Scrie-mi. La sfârșitul expedierii, desfășoară în mod special un sondaj.

Ce este un virus? Un virus este un program scris, de regulă, în Assembler (deși există virusuri scrise în Pascal, C și Visual Basic). Acest program se poate reproduce, infectând alte programe fără participarea unui programator, care a scris acest virus. Cum poate fi aceasta? Elementar!

Scrierea unui virus în Assembler este un lucru destul. La un moment dat, am scris viruși rezidenți (permanent în memorie) și nerezidenți. Mai mult, am scris și antivirusuri (împotriva propriilor virusuri, firește).

Înainte de a trece la studiul structurii virusului, aș dori să vă avertizez despre răspunderea penală pentru distribuirea programelor asemănătoare virusilor. Dacă scrieți un virus și eliberați-l "în lumină", ​​puteți trimite la "locuri nu atât de îndepărtate" (în conformitate cu legea rusă); de exemplu, Kolyma.

Cine scrie viruși? Da, toată lumea nu este leneșă! Mai întâi de toate, ei sunt programatori care tocmai au studiat Assembler și nu văd nici o altă posibilitate, de îndată ce scriu un virus și îi defăimă pe prietenul, vecinul etc. arătându-se astfel. De exemplu, un prieten are un Pen-433 mare și aveți o mică "troică". Și tu arzi cu dorința Penului său de a "sparge".

Acum, să ne imaginăm o situație diferită: firma X are un concurent - firma Y. Cum să o faci astfel încât Y să poată face probleme pentru o vreme? Și de ce să nu infecteze computerele lor cu un virus "de producție proprie", care la o astfel de dată sau într-o astfel de dată sau în astfel de circumstanțe ar șterge toate informațiile de pe hard disk? Virusul este scris de un angajat al firmei X, iar apoi (virusul) este introdus în calculator unui concurent. Și asta e tot! De regulă, computerele sunt infectate nu numai de firma Y, ci și de alte persoane (angajatul a rescris fișierul infectat și sa mutat la domiciliu, fișierul familiar a fost rescris de el etc.).







Acum ia în considerare structura virusului și principiul funcționării acestuia. Scopul tuturor acestor lucruri este să vă învețe să recunoașteți virușii și să vă risipiți frica de ei.

Ce ar trebui să facă virusul? Mai întâi de toate - pentru a determina dacă este descărcat dintr-un fișier sau acesta este primul său download (mai departe veți înțelege ce este în joc). Apoi, găsiți primul fișier, verificați dacă acesta este deja infectat sau nu, dacă este cazul, căutați următorul și, dacă nu, îl infectați. Toate acestea se întâmplă foarte repede și pentru utilizator aproape imperceptibil.

Cât durează virusul în memorie? Totul depinde de imaginația programatorului (ce dorește să facă cu computerul / fișierele). Mărimea medie a virusului este de 500-600 octeți. Deși există meșteșugari calificați care au un virus de 100-150 octeți și există și unii care au cel mai simplu virus de 1,5-3 kilobytes sau mai mult.

Ce poate face un virus? Orice! De exemplu, pentru a șterge toate informațiile de pe hard disk în 0,5 - 1 secundă (conform principiului Fdisk), ardeți monitorul, deteriorați fizic hard disk-ul și chiar ucizi utilizatorul (deși acest lucru nu a fost văzut încă)! Totul depinde de imaginația programatorului.

Virusul pe care îl vom studia? Vom lua în considerare un virus care nu infectează fișierele * .com (cea mai simplă). Ce va face el? Nu cred nimic deosebit, cu excepția propagării și creării oricărei interferențe minore către utilizator.

Cum se înregistrează un virus? În mod normal:

presupune cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

Iată corpul virusului.

Ie formatul fișierului de obicei * .com, pe care deja îl cunoașteți. Puteți crea un fișier * .exe, cu toate acestea, dimensiunea acestuia va fi mai mare.

Cred că există suficient virus pentru ziua de azi. În plus, în funcție de rezultatele sondajelor, virusul nu este ceea ce v-ar plăcea să vă concentrați asupra studierii asamblorilor.

Trecem la cea mai dificilă secțiune. Va fi foarte dificil. Cine poate înțelege - va fi un adevărat erou!

Un program rezident (rezident) este un program care este în permanență în memorie. Un exemplu de rezident este șoferul mouse-ului, ghidul Norton, tot felul de antivirusuri care monitorizează ceea ce face un anumit program și raportează acțiunile sale utilizatorului și așa mai departe.

De obicei, un program rezident trebuie să intercepteze o întrerupere, astfel încât programatorul sau alte programe să poată accesa. Să aruncăm o privire mai atentă la întreruperi (puțin am studiat-o în versiunile anterioare).

O întrerupere este un fel de procedură (subrutină) care nu are nume (de exemplu, print_string), ci un număr. Calculatorul are 256 numere diferite de întrerupere. Unele camere sunt rezervate BIOS (ROM) a calculatorului (de exemplu, 16h; amintiți-vă: mov ah, 10h / int 16h) sau un sistem de operare (MS-DOS, PC-DOS, OS / 2) (de exemplu, 21h: mov ah, 9 / mov dx, offset String / int 21h).

Cu toate acestea, nimic nu împiedică programatorul să intercepteze, să zicem, o întrerupere de 21h, controlând astfel cine și ce face cu el.

Ei bine, de exemplu. Să afișăm linia:

mov dx, offset Our_string

Stratul nostru db 'Bună ziua! $'

Imaginați-vă că aceasta este o bucată de mânerul nostru de întrerupere 21h.

; aici transferăm controlul "realului" 21h.

mov dx, offset My_string

Aici verificăm dacă este apelată funcția de afișare a liniei de pe ecran (09) sau a alteia. Dacă este apelată o altă funcție (de exemplu, 3Dh), atunci vom da doar controlul inițial.

Ce este un handler de întrerupere? Această procedură permanent (sau la momentul respectiv) în memorie, care preia controlul primul care a făcut ceea ce vrea, și apoi transferă controlul sistemului de gestionare original (de exemplu, o procedură care este deja în memorie pentru a descărca handler-ul nostru). Aceasta poate efectua și anumite acțiuni, apoi transferă controlul către un alt manipulator etc.

Dacă ceva nu este clar - nu vă disperați! Este foarte dificil! Foarte curând totul va cădea pe loc.

Acum mergeți la handler (citiți cu atenție descrierea după punct și virgulă):

presupune cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

; Mergeți la eticheta de inițializare. Va trebui să interceptăm întreruperea de 21h și să lăsăm programul în memorie

; Mai jos este, de fapt, dispozitivul de tratare a întreruperii 21h (acesta va fi rezident). După ieșirea programului, procedura Int_21h_proc va rămâne în memorie și va monitoriza funcția 09 întrerupere 21h. El va fi gras.

jmp dword ptr cs: [Int_21h_vect]; dacă nu, mergeți la dispozitivul de tratare a întreruperii inițial 21h. Asta e tot. Programul nu va reveni la eticheta Ok_09

Care sunt steagurile pe care le ții minte? Doar în caz, să aruncăm o privire din nou la un exemplu din nou:

Aici, după execuția liniei (1), stegul zero este setat / resetat. În linia (2) verificăm acest steag. Dacă este setată, atunci comanda de comparație este corectă (adică AX = 23). Dacă nu este instalat, atunci AX <> (nu este egal cu) 23.

Acum acordați atenție la începutul procedurii Int_21h_proc. Ce vedem:

Vom întrerupe programul (schimbați steagul zero). Acest lucru poate duce la schimbări destul de grave în cursul programului, ceea ce a cauzat o întrerupere de 21 ore. Pentru a face acest lucru, păstrăm de fapt steagurile pe stivă. Sper că ați înțeles că în managerul de întrerupere (în cazul nostru - Int_21h_proc) este necesar să stocați TOATE registrele utilizate, inclusiv registrul de steaguri.

Luați în considerare următoarea linie:

Această variabilă poate stoca un cuvânt dublu (D efine D ouble word) (patru octeți). Amintiți-vă că un 16-bit ocupă 2 octeți (un cuvânt) (DX, AX, ES, SS etc. dar nu AH, DL, BH sunt registre pe 8 biți care ocupă un octet!).

Dacă vrem să încărcăm un cuvânt în această variabilă (doi octeți), atunci trebuie să specificăm aceasta în felul următor:

mov cuvânt ptr Int_21h_vect, ax

Dacă vrem să încărcăm un octet, atunci scriem:

mov octet ptr Int_21h_vect, ah

Amintiți-vă că cuvântul este un cuvânt, iar octetul este un octet. A fost ceva clarificat?

Apoi, creați un program simplu care va afișa o linie apelând 09 funcția de întrerupere 21h. De exemplu, aceasta:

își asumă CS: CSEG, DS: CSEG, ES: CSEG, SS: CSEG

mov dx, String offset

String db 'Șirul meu $'

Să începem mai întâi programul N 01. După ce se întoarce la DOS (în Norton Commander, DOS Navigator, Far și alte shell-uri), rulați programul N 02. Ce veți vedea?

Acum rulați programul N 02 în depanator. Vino cu îndrăzneală "în interiorul" celei de-a 21-a întreruperi. Ce vezi acum?

Ei bine, draga mea! Este dificil?

1. Am citit totul cu atenție de mai multe ori, dar nu am înțeles nimic.

2. Vă explicați prost. "A venit" în a treia zi.

3. "A venit" cu dificultate. Este de dorit să explicăm în detaliu. Și totul este normal.

4. Hard, dar interesant. Continuă munca bună!

5. Totul este bine! Explicați-vă bine!

6. Elementar! Prefer să merg la Windows.

Pentru astăzi, totul! Coaja va fi luată în considerare săptămâna viitoare (octetul nu este suficient). Programare de succes pentru tine!







Trimiteți-le prietenilor: