Привіт і ласкаво просимо до нової теми: стек.
Так що ж таке стек?
Дозвольте мені показати вам.
Тепер давайте відкриємо ваш шаблон тут.
Шаблон один.
Отже, стек - це ось ця частина.
Насправді, стек - це пам'ять або оперативна пам'ять.
І кожного разу, коли ви запускаєте процес, операційна система виділяє певну частину пам'яті для роботи вашого
процесу.
Це називається стеком для цього процесу.
Таким чином, кожен запущений процес матиме свій власний стек.
Отже, цей процес має власний стек, і він може вільно використовувати його у будь-який спосіб.
Це і є сенс стека.
Стек - це не що інше, як слово, яке позначає пам'ять, виділену для роботи вашого процесу.
Ви можете побачити стек для цього процесу тут.
- це покажчик стеку. Як ви бачите, зараз він вказує на цю адресу: 6457464474.
Отже, ви також можете переглянути стек тут, у цьому вікні.
Але в цьому вікні стек позначається спеціальними символами: - плюс чотири.
- насправді 64474.
Коли ви додаєте чотири, це означає, що він показує вам адресу пам'яті під ним.
Наприклад, тут 64474 - це місце, на яке зараз вказує вказівник стеку.
Так - це регістр, який завжди показує розташування вершини стека.
Отже, зараз він показує цю адресу в пам'яті: 644474.
Гаразд.
А звідси відкривається інший краєвид. - плюс чотири - це ви плюс чотири, і ви отримуєте наступний.
- плюс вісім - це ти плюс вісім звідси, ти плюс вісім потрапляєш сюди.
Отже, це ще один вид для стека.
Отже, для перегляду стека ви можете використовувати це вікно або це вікно.
Отже, це стек всередині x64dbg.
Тож для чого потрібен стек?
Як ми можемо отримати до нього доступ?
Тож давайте розглянемо цей приклад тут.
Насправді, стек дуже довгий, дуже великий, тому що оперативна пам'ять величезна, тому - завжди буде вказувати
на вершину стека, де зараз виконується ваш процес.
Гаразд, тепер давайте спробуємо показати, як працює стек за допомогою цієї діаграми.
- завжди має адресу, де знаходиться стек.
Ви можете штовхнути або сплигнути до стопки.
Отже, дві операції, які використовуються, - це заштовхнути щось до стеку і витягнути щось зі стеку до регістру.
Коли ви штовхаєте щось до стеку, ви робите копію цього значення, а потім поміщаєте
її туди.
Але перш ніж ви зможете це зробити, вам доведеться виділити одне слово для стека.
Це означає, що ви повинні перемістити свій - вгору, а потім зробити копію і помістити її сюди.
Потім, якщо ви збираєтеся натиснути друге значення, наприклад, якщо ви натиснете
- зараз, раніше ми натискали -, тому - йде сюди, а тепер, якщо ви хочете натиснути -, він повинен виділити місце для нового
значення, віднімаючи чотири, підніміться сюди.
Потім ви робите копію і кладете її сюди.
Тепер, якщо ви захочете натиснути "-", ви знову мінусуєте чотири.
Отже, стек зараз підніметься сюди, а потім ви скопіюєте це значення і помістите його сюди.
Ось як це працює.
Тож дозвольте мені детально показати вам на практиці, як саме це працює.
Отже, теоретично, два кроки, пов'язані з виштовхуванням, полягають у тому, що ви віднімаєте чотири від адреси стека, а потім копіюєте
значення, яке ви хочете виштовхнути до стека.
Тож давайте спробуємо зробити це тут.
Тож ми спускаємося сюди і намагаємося надрукувати тут якісь інструкції.
Спочатку ми помістимо ці три значення у ваш реєстр.
Ми напишемо код для перенесення цих значень у ваш реєстр.
Отже, перше значення -. Тож заходьте сюди, натискайте пробіл і вводьте move -, а потім гекс 358626.
Натисни Enter.
Далі ви перемістите це значення на -.
Отже, перемістіть -, гекс 100484.
А наступним кроком ви перемістите це значення на -.
Отже, введіть move
-, значення 00047, 00047.
Натисни Enter.
Отже, тепер у вас є, просто перевірте, чи правильно ви його ввели.
Гаразд.
Після того, як ви підтвердите,
що все правильно, ми спробуємо виконати операцію push.
Отже, ми збираємося набрати push.
Ми збираємося виштовхнути все, що знаходиться в - до стопки.
Потім натисніть Enter.
Далі ми натиснемо - до стека, натиснемо enter.
Тож давайте спробуємо зараз.
Отже, перше, зараз ми біжимо, ставимо точку зупинки тут, а потім біжимо до цього місця і переступаємо,
поки не дійдемо до першого поштовху, поки не дійдемо до першого кроку.
Тепер він перемістить гекс 358626 на -. Тож зробіть крок, і тепер він має це значення в-.
Далі ми перемістимо це на -.
Отже, давайте переступимо, і тепер він має це значення всередині -.
Далі ми перемістимо це значення 47 в -, зробимо крок, і тепер 47 знаходиться в -.
Тепер подивіться на стопку.
Тепер стек вказує на 6448, 6448.
До речі, на вашому комп'ютері це може бути інакше. Для мене це 6458, він відрізняється від вашого.
Не хвилюйся.
Просто подивіться на мій і подивіться, як він працює.
Ваша цінність тут може бути іншою, але це не має значення.
Принцип все той же.
Отже, припустимо, що моя діаграма однакова тут і тут.
Отже, тепер "-" вказує на 6448, і ви також можете побачити тут: 64, 448.
На даний момент він отримав з пам'яті деяке випадкове значення, яке нас не стосується.
А тут - плюс чотири. - плюс чотири - це ось ця, яка має таке випадкове
значення: 41386, 41386.
Як бачимо, - плюс вісім тут має значення одиниці.
Отже, маючи значення один, - плюс вісім тут.
Гаразд.
Отже, тепер ми натиснемо -, що означає, що вона скопіює це значення і помістить його у стек.
Але перш ніж ви зможете це зробити, він повинен виділити для цього пам'ять.
Це означає, що буде мінус чотири, DWORD.
Чому?
Тому що кожна з цих комірок пам'яті є DWORD.
Це означає, що це чотири байти, чотири байти.
Кожен з них складається з чотирьох байт, чотирьох
байт, чотирьох байт.
Тому має бути мінус чотири.
Далі, після того, як у нього буде мінус чотири, він скопіює все, що ви натиснете.
У цьому випадку, якщо ви натиснете -, він скопіює це значення туди, куди вказує
стек.
Гаразд, давайте спочатку подивимось на цю симуляцію.
Отже, перш ніж тужитися - тут, перше, що ви повинні зробити, це відняти чотири.
Отже, ви мінус чотири, - вкаже на 644D4.
Чому?
Через це мінус чотири.
Потім він скопіює це значення і помістить його сюди.
Отже, він скопіює це значення і помістить його сюди.
Гаразд, давайте спробуємо це тут і подивимося, що з цього вийде.
Тож давай переступимо.
Отже, що вона зробила, так це додала мінус чотири до -, тобто - раніше було D8, а тепер D4.
Раніше було вісім, а тепер D4, як бачите.
А потім вона скопіювала все, що було в ній, в це нове місце, D4.
Отже, він скопіював 358626 тут,
як ви можете бачити: 358626, 358626.
Так, саме так.
Гаразд.
Наступний збирається натиснути -, але наразі ви не бачите його тут, тому що - плюс чотири все ще показує
його тут.
Тож тут не видно, але тут можна побачити.
358626 вже тут.
Наступна інструкція пересуне його сюди.
Штовхай.
Отже, він спочатку мінусує чотири, щоб - тепер переміститися і вказати на іншу пам'ять.
Чому?
Тому що для цього потрібно виділити місце.
Потім він скопіює його в це нове місце.
Отже, він скопіює це,
а потім вставить сюди.
Отже, два кроки: відніміть чотири, а потім скопіюйте нове значення у вашій виписці на нову адресу,
яку ви отримаєте.
Ось що ми зробили.
Давайте подивимося, як це відбувається тут.
Отже, тепер значення - тут дорівнює D4.
Отже, коли ви натиснете -, воно відніме чотири від цього місця і стане D0, так само, як тут,
D0.
Тож давайте переступимо і побачимо, що тепер це D0.
Так.
Отже, зараз ваш стек, ваш вказівник
стеку, вказує на це місце, а потім він пересуне значення -, 100484, у це місце.
Як ви можете бачити, 100484, як ви можете бачити тут, 100484 на даний момент часу.
Тепер - плюс чотири показує ваше попереднє значення. - плюс чотири показує попередній, тобто
ваш попередній натиск -.
Його можна побачити тут.
Тепер наступний буде штовхати - сюди.
Отже, перед тим, як штовхнути -, що він повинен зробити?
Має бути мінус чотири.
Це означає, що треба мінус чотири, щоб звільнити місце.
Потім він робить копію цього файлу і пересилає її на нову адресу.
А тепер поглянь сюди.
- тепер вказує на D0, тому має бути мінус чотири.
Тож давайте переступимо через це для push -, а потім мінус чотири.
Отже, коли ви мінусуєте чотири, ви отримуєте CC.
Гаразд.
Переконатися в цьому можна за допомогою калькулятора.
Використовуйте калькулятор програміста.
Гекс FED0 мінус чотири, FED0 мінус чотири дає
FECC,
FECC.
Гаразд.
Ось чому ви отримуєте FECC.
Після цього він скопіює все, що знаходиться в -, а це 47, до нового розташування FECC.
Отже, виходить 47.
Отже, тепер вершина вашого стеку має таке
значення: 47.
А тепер тут він показує попереднє значення -. - плюс четверо тут.
Він покаже вам 484, тобто -, раніше натиснутий -.
Ось як ви можете переосмислити це вікно і це
вікно.
Це вікно корисніше, оскільки ви можете бачити, що відбувається саме так, як воно відбувається.
Це вікно на крок позаду, тому що воно плюс чотири.
Гаразд.
Отже, тепер ваш стек знаходиться тут, 64FECC тут, з номером 00047.
Потім під вершиною стека плюс чотири, ви отримаєте FED0, тобто це значення 100484.
Потім під цим плюс чотири знову, ви отримуєте 64FED4, який має значення 358626, 358626.
Гаразд.
Таким чином, ви можете бачити, що це ваш стек для цього процесу, який зараз виконується.
Отже, на даний момент ви закінчили виштовхувати все до стеку.
Тому зараз я зупинюся на цьому і продовжу в наступному відео, де продемонструю поп-музику.
Тому не видаляйте цю програму поки що.
У наступному відео ми продовжимо з поп-музикою.
Тим часом, ви можете зберегти цей файл: пакетний файл, натисніть пакет, а потім збережіть його як 13-13.
Назвемо це поштовхом
XY 13.
Ми зупинимося тут.
До зустрічі в наступному відео.