кана Блогове

Stack.
осмия ден

Стек - специално предназначено за тази памет за пренос или съхранение на данни.

Ние сега виждаме форма на запис (prax03.com):

Така че в това представяне на стека расте.

На върха на стека сочи регистър показалеца на ESP - то неговата цел (Stack Pointer - показалеца на стека).

Виж, prax03 в линия 12h магазини DX регистрите на стойност, а на ред 07 следващия път през примката назад възстановява тази стойност. В този пример, стека използва неудобно, но ако програмата се нуждае от много време, за да се поддържат различни регистри, е по-добре да го направя през комина. За да запишете върху PUSH командата стека там.

И стойностите на стека могат да се полагат много.

Имайте предвид, че стойностите са извлечени в обратен ред. Vertex е на първо място, а в долната част на последния. На практика, за слава на Бога, мъдрите с стека има малко, но ако не се хване принцип, програмата ще бъде трудно да се напише.

Sailor! Хайде ела тук. Какво има в кошницата? О, закуска! Така че, на върха на яйцето, задръжте, сандвич, бутилка. възглавница? Защо правиш тампон? Смятате ли да спи на часовника! Хайде, дайте тук кошницата. Яйцата са по-сурови, ебават заради теб е! И сандвичи намазани и разрушени възглавница. Какво Plume те не са варени? Махай се, аз знам, че яйцата са поставени на върха.

Памет за стека разпределя Windows.

Сега по значение обратно към нашата първа програма в рамките на отвори:

Натиснете екип поставя в стека над стойността в него. То може да бъде два или четири байта. В 32-битови програми ще бъде 32-битова стойност, която е DWORD (4 байта). Така че сега една стойност в стека 4 байта за нас.

Това, разбира се, като цяло и за "удобство" на четенето, ниското байт има право старши наляво.

Sailor, вие знаете, че нашите чертежи в цялата бойна единица двоични байта на вградена в старшинство от ляво на дясно? Всеки младши - отляво, всеки старши - надясно (на фиг такива чертежи :).
Те са там, в главния щаб има zaputka - стак. Той е изготвянето отива от дъното до върха. Цяло число (дума или DWORD) в него се вписват точно: от дъното до върха.

Наистина, топчето е по-лесно да представляват по височина от един ред. Това е, което ще се съдържа в стека, преди да изпълни 40100Eh линия в нашата програма.

Всеки ред тук - една стойност в стека. Концепцията на дъното много ясно обяснява как стека.

Да се ​​премахне изходния код на тази линия:

И пиша, вместо да я тук тези команди:

Съберете програма отново. Отворете в Olly.

Всичко което се случва в ключа за дебъгер CodeView F10, наречена умно нещо:
стъпка по стъпка проследяване изпълним код без да минава през процедурата. Olly В тази "стъпка" изпълнява ключова F8.

Когато стигнете до 401014h линия (F8 четири пъти), стека ще изглежда така:

Погледнете в дебъгер, не забравяйте! Долният десен ъгъл.

Трябва да се разбере, че всяка нова стойност се поставя на върха. Оказва се, стека расте нагоре. Така че, ESP се регистрирате с всеки нов стойност намалява стека. И всеки път, когато стойността на стека е отстранена, ESP увеличава с 4 (или по 2 в 16-битови приложения).

И все пак трябва да се приведе в съответствие стека, в противен случай програмата няма да работи коректно. След като данните ви е в стека е работил, или просто вече не са необходими, за да се върне най-горната позиция, която тя заема преди - това е подравняването. Ако не направи това, програмата ще се провалят.

Stack, може би най-трудно да се разбере концепцията писмено Assembler програми. Честно казано, честно, ако го разберат, тогава определено може да се научи всичко останало. Разбира се, на практика е необходимо, не забравяйте, прекарах три дни на разбирането на стека. Калашников измамени, той каза, че е лесно. Така че това е, когато се използва примери, но когато започва да пише свои собствени аплети, комин, причинени най-големите трудности.

Три дни - Мисля, че е малко по-трудно, по-голямата си цел.

За да се сложи нещо в стека, напишете:

От английски език. думи лицеви - тласък

Ако искате да се измъкнем от стека всичко RON положи Pusha употреба екип ПОПА / POPAD

Следващият пример (prax06.com).

Въведете Hiew'e тези байтове:

Сега погледнете мнението на ASM:

Нека да анализираме този пример.

Това поставя на линията в 20CD на AX регистър стойност.

Това поставя куп дума линия (дума) 20CDh на регистъра EAX. И в паметта на думата, ще видите, както трябва да бъде - CD, 20h.

Така че, защо този пример не може да виси на компютъра в DOS и не се обеси в WinXP? Бягай и ще видите, че програмата се изпълнява в една част от секундата.

Можете да опитате да разглобявате трик CV себе си, но това ще отнеме известно време :).

Честно казано, CodeView тип дебъгер не е много подходящ за анализ на дреболии.

Фактът, че един прост DOS-програма дебъгерите използват стека за свои собствени цели, които събори стойността на ESP се регистрирате между стъпки. Няма да има най-доброто, за да изпълните проба под SoftIce'om. И тогава бихте могли да "просто", за да видите как програмата ще запише времето 32637 в два байта стека CD20h. Последния път байта ще бъдат записани вместо команда "03 JMP".

CD20h - е роден вътр 20h команда код (наричаме програми за завършване на прекъсвания, както вече знаете).

Оказва се, че една купчина продължава да расте и расте и нищо не може да го спре, с изключение на крайната или неправилен код.

И това изпълва цялото налично пространство в сегмента, а след това започва да се презапише данните (в този пример, те не са). Освен това, програмата код се презаписва.

Тази ситуация се нарича грешка стека преливане. Файл за програми под ДОС тази грешка - една от най-често срещаните.

Механизмът за Win32-програма за разпределение на комина е по-развита (оста си е решаването на този въпрос с помощта на средства защитен режим). Въпреки това, стека преливане грешка - все още истинско предизвикателство за програмисти, особено в областта на сигурността. Можете просто да се види как заради тази грешка купа започва да се изпълнява.

В CodeView, също може да се проследи до най-интересният момент от този пример. Променете стека показалка регистър (ESP). Например, задаване на стойност 200h в него (толкова дълго Tracy). След това - F10 много пъти, както и програмата ще приключи. Погледнете отново и отново. Може би ще измисли как този трик може да се използва за свои цели).

Аз ви предлагам друг пример Win32.

Моля, имайте предвид, че българските букви, трябва да бъдат записани в ANSI (за вентилационни отвори стандарт).

Напишете, моля, направете секцията код. Сигурен съм, че ще ви бъде печатни грешки, и това е много ускоряване на процеса на обучение.

С цел да се опита е направил това, което той е трябвало да го стартирате с произволен клавиш тип:
prax07.exe QWERTY

Имаше само един отбор, който все още не знам в тази програма. ОБАДЕТЕ команда, но това е цяла тема. И, между другото, последната теоретична тема в нашите уроци.

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