Привіт і ласкаво просимо назад. У цьому уроці ми дізнаємося, як отримати доступ
до пам'яті, як читати, як писати з пам'яті та в пам'ять. Отже, відкриваємо наш шаблон 2,
який ми використовували раніше. Отже, перейдемо до нашої папки проектів
і відкриємо шаблон 1. Пам'ять знаходиться тут, внизу. Це також відомий як дамп пам'яті, де ви можете
переглянути оперативну або основну пам'ять. І тут є вкладка, яка називається
карта пам'яті. Тут показано всю пам'ять, яка використовується
цією програмою, цим процесом. Коли програма завантажується в пам'ять, вона називається процесом,
а це карта пам'яті процесу, використання пам'яті. Отже, наш основний процес
називається шаблон 1. exe, і в ньому є всі різні сегменти або розділи, і ви можете бачити,
що тут є текст, дані, наші дані і так далі. Традиційно текст - це місце, де знаходяться інструкції,
а дані - це місце, де ви зберігаєте змінні або значення, які ви збираєтеся використовувати
у своїх інструкціях. Наші дані, а також BSS та IData також використовуються
для зберігання різних видів даних. Наприклад, IData використовується
для зберігання імпортованих бібліотек, які використовуються
програмою. Найважливіше, що нас турбує, - це ваші дані.
Тут ви можете зберігати значення, які будуть використовуватися вашою програмою.
Отже, якщо ви клацнете правою кнопкою миші тут і виберете пункт "Дамп", ви зможете побачити частину
місця, де знаходиться сегмент даних. Тож, як бачите, частина з них вже використовується,
а частина - пуста. Таким чином, ця порожня секція може бути використана
програмістом для зберігання значень або даних. У цьому уроці я покажу вам, як використовувати
ці порожні сегменти для зберігання даних.
Отже, ми напишемо просту програму. Отже, після того, як ви відкриєте свій шаблон 1. exe, прокрутіть вниз до місця
користувача, де ви можете почати вводити свій код.
Отже, тут ви можете написати код для переміщення даних у сегмент даних.
Одним з простих прикладів є використання команди move. Скажімо, ми натискаємо пробіл, переміщуємо,
а потім ви можете перемістити щось на -. Можливо, ми перемістимо значення 2 у -, гекс 2.
Отже, тепер ми переносимо 2 на -. Тепер ми хочемо завантажити це. Ми хочемо перенести це - в пам'ять.
Припустимо, ви хочете перемістити дані в це місце, в цей DWORD. Ви можете просто скопіювати адресу, а потім
зайти сюди і натиснути кнопку "перемістити". Ви можете вставити туди свою адресу.
Клацніть правою кнопкою миші та вставте префікс hex, а потім введіть його. Візьміть його в квадратні дужки,
а потім перед ним скажіть програмі, що це слово DWORD.
Ви хочете використати тут чотири байти. Ось чому ви повинні вказати DWORD.
І ви також повинні сказати програмі, що це вказівник, а значить це адреса.
Отже, за цією адресою ви побачите, що є чотири байти, які ви хочете використати.
Далі ви повинні вказати, де в карті пам'яті це знаходиться. Отже, ви повинні ввести двокрапку DS.
Отже, DS означає сегмент даних. Сегмент даних можна використовувати для зберігання даних. Ось такий синтаксис.
Далі, після цього ви повинні поставити кому і джерело -. Отже, в цій інструкції сказано, що
ви хочете перемістити значення в -, яке дорівнює 2, в це місце 403050 і перемістити його туди за цією адресою.
Розмір розташування за цією адресою, яке ви хочете використати, становить чотири байти або DWORD.
Ось у чому сенс цієї інструкції. Дозвольте мені натиснути "ОК".
Тепер ми це зрозуміли. Тож тепер ми можемо зіткнутися з цим. Ми можемо бігти, але тут він ламається.
Тепер ми переступаємо. Тепер ця інструкція змістить 2 на -. Тож подивіться на -. Зараз - 1.
Отже, ми переступаємо через нього, і тепер він перемістив значення 2 на -. Наступна команда перемістить
значення в - у цю комірку пам'яті. Тож ми переступаємо, і тепер ви бачите, ви бачите 2 там.
Отже, ви перемістили це слово в це місце, але зауважте, що коли слово переміщується в
це місце, воно зберігається у зворотному порядку. Замість 00000002 він зберігає його
навпаки: 02000000 навпаки. Ця конвенція для процесорів Intel відома як Little-Endian Convention.
Таким чином, щоразу, коли ви зберігаєте дані в пам'яті, вони зберігаються у зворотному порядку
справа наліво, а не зліва направо. Те ж саме відбувається, коли ви читаєте
дані з пам'яті в регістр. Він також читатиметься зі зворотного боку, справа наліво.
Тепер припустимо, що ми хочемо перемістити це значення в інший регістр -. Тож як ми це робимо?
Так само: натискаємо пробіл, вводимо move, а потім вводимо ціль
-, а джерелом буде ось це. Це означає, що ми вводимо DWORD PTR DS, потім двокрапку, потім
шістнадцятковий префікс і потім вводимо вашу адресу. Отже, ця інструкція каже перейти до цього
місця в пам'яті 403050 в шістнадцятковому сегменті даних, а потім витягнути будь-яке значення, яке там знаходиться,
а це має бути значення DWORD, і перемістити це значення в регістр або скопіювати
його - в регістр. Тож давайте скажемо, що все гаразд. Тож давайте переступимо через це і подивимося, що
станеться, коли ви переступите через це. Ви бачите, що значення в - тепер дорівнює 2. Це означає, що ми
щойно скопіювали будь-яке значення за цією адресою, скопіювали DWORD у зворотному
порядку і вставили його сюди в -. Ось як ми можемо переміщувати значення з регістру в пам'ять
і з пам'яті назад в регістри. Тепер, коли ви знаєте, як перемістити його в пам'ять для реєстрації,
зареєструвати в пам'ять, ви можете робити з ним і інші речі. Наприклад, ви можете зробити приріст на -.
Ви можете INC все, що знаходиться в -, а потім перемістити нове значення в - у вашу пам'ять:
DWORD PTR DS, а потім у вашу пам'ять, а потім
у вашу -, ось так. Тож натисни "ОК". Отже, тепер ми тут, давайте збільшимо -. Отже - має стати
3. Тепер два. Отже, давайте перейдемо до наступного кроку, і ви збільшите
його до 3, а ця команда перемістить це нове значення 3 назад за адресою 403050, використовуючи його як DWORD. Тож він перезапише все,
що тут є. Очевидно, що це 2, і коли ви виконаєте цю інструкцію, вона
замінить ці 2 новим значенням у -, тобто 3. Давайте зробимо крок і подивимося, як це відбувається, і тепер
ви бачите, що 3 було переміщено, скопійовано з - в цю комірку пам'яті. Ми можемо спробувати інші приклади.
Припустимо, давайте спочатку збережемо це: файл, зберегти. Ми латаємо його, щоб врятувати.
Гаразд, можемо назвати це 09-тире. Можна сказати, пам'ять доступу
до пам'яті. exe ось так, натисніть зберегти, натисніть кнопку "ОК".
Отже, тепер ми відкриваємо нашу нову програму 9 доступу до пам'яті, і цього разу ми спробуємо нове значення
в -, замість 2 тут. Ми хочемо змінити це, тому обираємо це. Цього разу я поставив брейк-поінт.
Скажімо так: 1 байт, 2 байт, 3 байт, 4 байт, ось так, гаразд, давайте простіше.
Отже, тепер, коли ви збираєтеся перемістити це DWORD-значення у -, давайте почнемо.
Він потрапляє в наш брейк-пойнт і переступає через нього. Тепер ми перемістимо це в -, і тепер - має значення
11223344, що становить 4 байти або DWORD. Далі ми перемістимо цей DWORD у цю комірку
пам'яті, тож давайте підемо туди і перевіримо, підемо туди і подивимося.
Гаразд, я натиснув на карту пам'яті, натиснув
на сегмент даних, і ось я вже там. Я прокручую вниз і шукаю цю пам'ять
403050, яка знаходиться тут, тут, тут, тут, 4 байти. Отже, ця команда перемістить це значення, велике число,
за цією адресою пам'яті. Тож давайте переступимо, і тепер ви бачите 11223344 у зворотному порядку. Все так, як я пояснював
раніше. Це також те, що я називаю маленькою конвенцією
для процесорів Intel: зворотний порядок. Наступне, що ми зробимо, це перенесемо те ж саме
в інший регістр -. Тож тепер - має таке значення. Давайте переступимо і подивимося, що станеться.
І ось, будь ласка, він перемістив все, що знаходиться за цією адресою, тобто 11223344, у зворотному порядку, але коли він переходить до
- все в правильному порядку: 11223344. Далі ми збільшимо значення
на одиницю. Давайте переступимо через це і помітимо
- тепер збільшилося на одиницю і стало 11223345, а тепер ми перемістимо це нове значення назад на це місце,
перезапишемо все, що тут є. Тож слідкуйте за цим значенням тут, переходьте і дивіться,
що відбувається, і зараз ви бачите, що воно стало 11223345, збільшене на одиницю. Це зроблено для того, щоб продемонструвати цю малоендіанську
конвенцію, де значення зберігаються у зворотному порядку байт.
Спочатку збережемо це: файл, патч, файл, патч, файл, патч, і я можу зберегти це як, назвемо
його 10, ssmem. У вас є два приклади: 09 і 10. Тож давайте збережемо його. На цьому відео все.
Дякуємо за перегляд.