ceainic Bloguri

Stivă.
a opta zi

Stiva - o zonă de memorie specială dedicată pentru transmiterea sau stocarea de date.

Vedem acum o formă de înregistrare (prax03.com):

Deci, în această reprezentare a stivei crește.

În partea de sus a stivei indică registru indicatorul ESP - este scopul său (stivă Pointer - indicatorul stivă).

A se vedea, prax03 în magazine 12h linie registrele DX de valoare, iar pe linia 07 data viitoare prin bucla restabilește înapoi la această valoare. În acest exemplu, stiva folosit inconfortabil, dar în cazul în care programul are nevoie de o mulțime de timp pentru a menține registre diferite, este mai bine să facă acest lucru prin stivă. Pentru a înregistra pe comanda PUSH stiva acolo.

Și valorile stivei pot fi stabilite foarte mult.

Rețineți că valorile sunt preluate în ordine inversă. Vertex vine în primul rând, și partea de jos a ultimului. În practică, slava lui Dumnezeu, înțelepți cu stiva au un pic, dar dacă nu prinde principiu, programul va fi dificil de a scrie.

Sailor! Vino vino aici. Ce e în coșul tău? Oh, micul dejun! Deci, pe partea de sus a oului, dețin, un sandwich, o sticlă. pernă? De ce faci pad? Ai de gând să dormi pe ceas! Hai, da-l aici coșul. Ouăle sunt o primă, du-te dracului de dragul! Și sandwich-uri unse și ruinat pernă. Ce ai impaunez ei nu sunt fierte? Pleacă, mă știu că ouăle sunt puse sus.

Memorie pentru stiva alocă pentru Windows.

Acum semnificativ înapoi la primul nostru program de sub orificiile de ventilație:

Împinge echipa de pe Sunt puse stiva de mai sus valoarea în ea. Acesta poate fi de două sau patru octeți. În programele pe 32 de biți va fi o valoare de 32 de biți, care este DWORD (4 octeți). Deci, acum o singură valoare pe stivă 4 octeți pentru noi.

Aceasta, desigur, întregul și pentru „comoditatea“ de lectură, octet scăzut are dreptul senior la stânga.

Sailor, vă aduceți aminte că desenele noastre în întregul octeți binare unitate de luptă a construit în vechime de la stânga la dreapta? Fiecare junior - stânga, fiecare senior - dreapta (în fig astfel DESENE :).
Ei sunt acolo, în sediul principal există zaputka - stivă. El desen merge de jos în sus. Integer (cuvânt sau DWORD), în ea se potrivesc exact: de jos în sus.

Într-adevăr, stiva este mai ușor să reprezinte în înălțime decât o singură linie. Asta va fi conținută în stivă înainte de a executa linia 40100Eh în programul nostru.

Fiecare linie de aici - o singură valoare pe stivă. Conceptul de jos explică foarte clar modul în care stiva.

Să eliminați codul sursă al acestei linii:

Și scrie în loc să-l aici aceste comenzi:

Colecta programul din nou. Deschideți în Olly.

Ce ați făcut în cheia depanator CodeView F10, numit inteligent lucru:
pas cu pas de urmărire cod executabil fără a trece prin procedura. Olly În acest „pas“ efectuează F8 cheie.

Când ajungi la linia 401014h (F8 de patru ori), stiva va arata astfel:

Uită-te în debugger, asigurați-vă! Partea din dreapta jos.

Ar trebui să înțeleagă că fiecare valoare nouă este plasată pe partea de sus. Se pare, stiva creste in sus. Deci, înregistrați ESP cu fiecare nouă valoare a scade stiva. Și, de fiecare dată când valoarea stivei este îndepărtată, ESP crește cu 4 (sau 2 în aplicații pe 16 biți).

Și încă mai trebuie să se alinieze stiva, altfel programul nu va funcționa corect. Odată ce datele tale în stivă a lucrat sau pur și simplu nu mai sunt necesare, a reveni la poziția de top, care a ocupat înainte - aceasta este alinierea. Dacă nu face acest lucru, programul va eșua.

Stack, probabil, cel mai dificil de înțeles conceptul în scris asamblor. Sincer, sincer, dacă ai înțeles, atunci puteți afla cu siguranta orice altceva. Desigur, practica este necesar, amintiți-vă, am petrecut trei zile pe înțelegerea stivei. Kalashnikov înșelat, el a spus că a fost ușor. Așa a fost, atunci când am folosit exemple, dar când a început să scrie propriile lor applet-uri, stiva a cauzat cele mai mari dificultăți.

Trei zile - Cred că e un pic cam dificil pentru cei mai concentreze.

Pentru a pune ceva în stivă, scrie:

Din limba engleză. cuvinte împinge - împinge

Dacă doriți să ieșiți din stivă toate RON stabilite Pusha utilizare echipa POPA / POPAD

Exemplul următor (prax06.com).

Scrieți Hiew'e acești octeți:

Acum, uita-te la punctele de vedere asm:

Să analizăm acest exemplu.

Aceasta plasează linia în 20CD AX valoarea registru.

Acest lucru pune o stivă linie de cuvânt (cuvânt) 20CDh registrului EAX. Și în memoria cuvântului, veți vedea cum ar trebui să fie - CD, 20h.

Deci, de ce acest exemplu nu închide computerul în DOS și nu se închide în WinXP? Fugi și veți vedea că programul este executat într-o fracțiune de secundă.

Puteți încerca să dezasambleze CV-ul truc singur, dar va dura ceva timp :).

Sincer, CodeView tip depanator nu este foarte potrivit pentru analiza fleacurilor.

Faptul că un simplu debuggeri DOS-program de a utiliza stiva pentru propriile sale scopuri, care bate în jos valoarea ESP înregistra între trepte. Nu ar fi cel mai bine pentru a rula proba sub SoftIce'om. Și apoi ai putea „doar“ pentru a vedea modul în care programul va înregistra ora 32637 în doi biți stiva CD20h. Ultima dată octeților va fi scris în loc de comanda „03 JMP“.

CD20h - este nativ int 20h codul de comandă (apel programe de întrerupere de finalizare, după cum știți deja).

Se pare că o stivă continuă să crească și în creștere în sus și nimic nu-l poate opri, cu excepția codului final sau incorect.

Și umple tot spațiul disponibil în segment și apoi începe să suprascrie datele (în acest exemplu, ele nu sunt). În plus, codul de program este suprascrisă.

Această situație se numește o eroare stivă de preaplin. File pentru DOS programe de această eroare - una dintre cele mai comune.

Mecanismul Win32-program pentru alocarea stiva este mai dezvoltată (axa în sine abordează această problemă prin utilizarea modului protejat de fonduri). Cu toate acestea, stiva eroare de depășire - încă o adevărată provocare pentru programatori, în special în domeniul securității. Tocmai ai putut vedea cum din cauza acestei erori stiva începe să curgă.

În CodeView, de asemenea, pot fi urmărite la cel mai interesant al acestui exemplu. Schimbarea registru pointer stivă (ESP). De exemplu, setați 200h valoare în ea (Tracy atât de mult timp). După care - F10 de multe ori, iar programul se va termina. Uită-te din nou și din nou. Poate ai dat seama cum acest truc poate fi folosit pentru propriile lor scopuri;).

Vă sugerez un alt exemplu Win32.

Rețineți că literele românești trebuie să fie codificat în ANSI (pentru standardul guri de aerisire).

Scrieți, vă rugăm, faceți secțiunea de cod. Sunt sigur că va fi erori de tastare, și este foarte accelera procesul de învățare.

Pentru a încerca a făcut ceea ce el ar trebui să-l lanseze cu orice tip de cheie:
prax07.exe qwerty

A existat o singură echipă care încă nu știu în acest program. CALL de comandă, dar acest lucru este un subiect întreg. Și, întâmplător, ultimul subiect teoretic în lecțiile noastre.

<<предыдущая глава      следующая глава>>