WEBVTT

00:00.000 --> 00:06.160
Привіт і ласкаво просимо назад. У цьому уроці ми дізнаємося, як отримати доступ

00:06.160 --> 00:15.000
до пам'яті, як читати, як писати з пам'яті та в пам'ять. Отже, відкриваємо наш шаблон 2,

00:15.000 --> 00:24.600
який ми використовували раніше. Отже, перейдемо до нашої папки проектів

00:24.600 --> 00:33.840
і відкриємо шаблон 1. Пам'ять знаходиться тут, внизу. Це також відомий як дамп пам'яті, де ви можете

00:33.840 --> 00:40.600
переглянути оперативну або основну пам'ять. І тут є вкладка, яка називається

00:40.600 --> 00:46.840
карта пам'яті. Тут показано всю пам'ять, яка використовується

00:46.840 --> 00:53.960
цією програмою, цим процесом. Коли програма завантажується в пам'ять, вона називається процесом,

00:53.960 --> 01:00.760
а це карта пам'яті процесу, використання пам'яті. Отже, наш основний процес

01:00.760 --> 01:09.160
називається шаблон 1. exe, і в ньому є всі різні сегменти або розділи, і ви можете бачити,

01:09.160 --> 01:15.720
що тут є текст, дані, наші дані і так далі. Традиційно текст - це місце, де знаходяться інструкції,

01:15.720 --> 01:21.880
а дані - це місце, де ви зберігаєте змінні або значення, які ви збираєтеся використовувати

01:21.880 --> 01:26.920
у своїх інструкціях. Наші дані, а також BSS та IData також використовуються

01:26.920 --> 01:32.520
для зберігання різних видів даних. Наприклад, IData використовується

01:32.520 --> 01:38.080
для зберігання імпортованих бібліотек, які використовуються

01:38.080 --> 01:44.680
програмою. Найважливіше, що нас турбує, - це ваші дані.

01:44.680 --> 01:51.360
Тут ви можете зберігати значення, які будуть використовуватися вашою програмою.

01:51.920 --> 01:59.040
Отже, якщо ви клацнете правою кнопкою миші тут і виберете пункт "Дамп", ви зможете побачити частину

01:59.040 --> 02:05.440
місця, де знаходиться сегмент даних. Тож, як бачите, частина з них вже використовується,

02:05.440 --> 02:11.680
а частина - пуста. Таким чином, ця порожня секція може бути використана

02:11.680 --> 02:17.840
програмістом для зберігання значень або даних. У цьому уроці я покажу вам, як використовувати

02:17.920 --> 02:23.680
ці порожні сегменти для зберігання даних.

02:24.640 --> 02:30.320
Отже, ми напишемо просту програму. Отже, після того, як ви відкриєте свій шаблон 1. exe, прокрутіть вниз до місця

02:31.120 --> 02:34.400
користувача, де ви можете почати вводити свій код.

02:35.680 --> 02:42.960
Отже, тут ви можете написати код для переміщення даних у сегмент даних.

02:43.920 --> 02:52.080
Одним з простих прикладів є використання команди move. Скажімо, ми натискаємо пробіл, переміщуємо,

02:52.960 --> 03:00.800
а потім ви можете перемістити щось на -. Можливо, ми перемістимо значення 2 у -, гекс 2.

03:02.880 --> 03:09.600
Отже, тепер ми переносимо 2 на -. Тепер ми хочемо завантажити це. Ми хочемо перенести це - в пам'ять.

03:09.600 --> 03:16.720
Припустимо, ви хочете перемістити дані в це місце, в цей DWORD. Ви можете просто скопіювати адресу, а потім

03:18.080 --> 03:27.120
зайти сюди і натиснути кнопку "перемістити". Ви можете вставити туди свою адресу.

03:28.240 --> 03:36.640
Клацніть правою кнопкою миші та вставте префікс hex, а потім введіть його. Візьміть його в квадратні дужки,

03:36.640 --> 03:45.520
а потім перед ним скажіть програмі, що це слово DWORD.

03:48.080 --> 03:52.480
Ви хочете використати тут чотири байти. Ось чому ви повинні вказати DWORD.

03:53.440 --> 04:01.680
І ви також повинні сказати програмі, що це вказівник, а значить це адреса.

04:02.640 --> 04:08.320
Отже, за цією адресою ви побачите, що є чотири байти, які ви хочете використати.

04:09.920 --> 04:17.360
Далі ви повинні вказати, де в карті пам'яті це знаходиться. Отже, ви повинні ввести двокрапку DS.

04:18.240 --> 04:26.400
Отже, DS означає сегмент даних. Сегмент даних можна використовувати для зберігання даних. Ось такий синтаксис.

04:27.360 --> 04:35.760
Далі, після цього ви повинні поставити кому і джерело -. Отже, в цій інструкції сказано, що

04:35.760 --> 04:49.600
ви хочете перемістити значення в -, яке дорівнює 2, в це місце 403050 і перемістити його туди за цією адресою.

04:51.040 --> 04:55.680
Розмір розташування за цією адресою, яке ви хочете використати, становить чотири байти або DWORD.

04:57.120 --> 05:02.800
Ось у чому сенс цієї інструкції. Дозвольте мені натиснути "ОК".

05:03.760 --> 05:13.680
Тепер ми це зрозуміли. Тож тепер ми можемо зіткнутися з цим. Ми можемо бігти, але тут він ламається.

05:14.800 --> 05:21.760
Тепер ми переступаємо. Тепер ця інструкція змістить 2 на -. Тож подивіться на -. Зараз - 1.

05:22.320 --> 05:29.840
Отже, ми переступаємо через нього, і тепер він перемістив значення 2 на -. Наступна команда перемістить

05:29.840 --> 05:40.160
значення в - у цю комірку пам'яті. Тож ми переступаємо, і тепер ви бачите, ви бачите 2 там.

05:41.440 --> 05:49.200
Отже, ви перемістили це слово в це місце, але зауважте, що коли слово переміщується в

05:49.200 --> 05:58.640
це місце, воно зберігається у зворотному порядку. Замість 00000002 він зберігає його

05:58.640 --> 06:08.080
навпаки: 02000000 навпаки. Ця конвенція для процесорів Intel відома як Little-Endian Convention.

06:08.960 --> 06:16.160
Таким чином, щоразу, коли ви зберігаєте дані в пам'яті, вони зберігаються у зворотному порядку

06:16.160 --> 06:22.480
справа наліво, а не зліва направо. Те ж саме відбувається, коли ви читаєте

06:23.120 --> 06:29.840
дані з пам'яті в регістр. Він також читатиметься зі зворотного боку, справа наліво.

06:30.880 --> 06:40.160
Тепер припустимо, що ми хочемо перемістити це значення в інший регістр -. Тож як ми це робимо?

06:40.880 --> 06:50.400
Так само: натискаємо пробіл, вводимо move, а потім вводимо ціль

06:51.600 --> 07:00.080
-, а джерелом буде ось це. Це означає, що ми вводимо DWORD PTR DS, потім двокрапку, потім

07:01.760 --> 07:09.360
шістнадцятковий префікс і потім вводимо вашу адресу. Отже, ця інструкція каже перейти до цього

07:10.160 --> 07:22.000
місця в пам'яті 403050 в шістнадцятковому сегменті даних, а потім витягнути будь-яке значення, яке там знаходиться,

07:22.000 --> 07:30.000
а це має бути значення DWORD, і перемістити це значення в регістр або скопіювати

07:30.000 --> 07:38.240
його - в регістр. Тож давайте скажемо, що все гаразд. Тож давайте переступимо через це і подивимося, що

07:38.240 --> 07:45.120
станеться, коли ви переступите через це. Ви бачите, що значення в - тепер дорівнює 2. Це означає, що ми

07:45.120 --> 07:56.400
щойно скопіювали будь-яке значення за цією адресою, скопіювали DWORD у зворотному

07:56.400 --> 08:07.200
порядку і вставили його сюди в -. Ось як ми можемо переміщувати значення з регістру в пам'ять

08:07.200 --> 08:12.800
і з пам'яті назад в регістри. Тепер, коли ви знаєте, як перемістити його в пам'ять для реєстрації,

08:12.800 --> 08:19.760
зареєструвати в пам'ять, ви можете робити з ним і інші речі. Наприклад, ви можете зробити приріст на -.

08:19.760 --> 08:32.080
Ви можете INC все, що знаходиться в -, а потім перемістити нове значення в - у вашу пам'ять:

08:32.800 --> 08:39.120
DWORD PTR DS, а потім у вашу пам'ять, а потім

08:43.040 --> 08:56.640
у вашу -, ось так. Тож натисни "ОК". Отже, тепер ми тут, давайте збільшимо -. Отже - має стати

08:57.280 --> 09:05.440
3. Тепер два. Отже, давайте перейдемо до наступного кроку, і ви збільшите

09:05.440 --> 09:17.120
його до 3, а ця команда перемістить це нове значення 3 назад за адресою 403050, використовуючи його як DWORD. Тож він перезапише все,

09:17.120 --> 09:24.480
що тут є. Очевидно, що це 2, і коли ви виконаєте цю інструкцію, вона

09:24.480 --> 09:30.480
замінить ці 2 новим значенням у -, тобто 3. Давайте зробимо крок і подивимося, як це відбувається, і тепер

09:31.600 --> 09:39.360
ви бачите, що 3 було переміщено, скопійовано з - в цю комірку пам'яті. Ми можемо спробувати інші приклади.

09:39.360 --> 09:47.360
Припустимо, давайте спочатку збережемо це: файл, зберегти. Ми латаємо його, щоб врятувати.

09:47.920 --> 09:57.280
Гаразд, можемо назвати це 09-тире. Можна сказати, пам'ять доступу

10:01.760 --> 10:08.640
до пам'яті. exe ось так, натисніть зберегти, натисніть кнопку "ОК".

10:09.200 --> 10:19.360
Отже, тепер ми відкриваємо нашу нову програму 9 доступу до пам'яті, і цього разу ми спробуємо нове значення

10:19.360 --> 10:25.920
в -, замість 2 тут. Ми хочемо змінити це, тому обираємо це. Цього разу я поставив брейк-поінт.

10:26.880 --> 10:32.080
Скажімо так: 1 байт, 2 байт, 3 байт, 4 байт, ось так, гаразд, давайте простіше.

10:32.800 --> 10:42.160
Отже, тепер, коли ви збираєтеся перемістити це DWORD-значення у -, давайте почнемо.

10:42.720 --> 10:49.600
Він потрапляє в наш брейк-пойнт і переступає через нього. Тепер ми перемістимо це в -, і тепер - має значення

10:51.840 --> 10:58.960
11223344, що становить 4 байти або DWORD. Далі ми перемістимо цей DWORD у цю комірку

10:58.960 --> 11:06.160
пам'яті, тож давайте підемо туди і перевіримо, підемо туди і подивимося.

11:08.720 --> 11:12.480
Гаразд, я натиснув на карту пам'яті, натиснув

11:13.840 --> 11:20.560
на сегмент даних, і ось я вже там. Я прокручую вниз і шукаю цю пам'ять

11:20.560 --> 11:33.440
403050, яка знаходиться тут, тут, тут, тут, 4 байти. Отже, ця команда перемістить це значення, велике число,

11:34.240 --> 11:44.160
за цією адресою пам'яті. Тож давайте переступимо, і тепер ви бачите 11223344 у зворотному порядку. Все так, як я пояснював

11:44.160 --> 11:50.640
раніше. Це також те, що я називаю маленькою конвенцією

11:51.600 --> 11:59.280
для процесорів Intel: зворотний порядок. Наступне, що ми зробимо, це перенесемо те ж саме

11:59.280 --> 12:05.200
в інший регістр -. Тож тепер - має таке значення. Давайте переступимо і подивимося, що станеться.

12:06.160 --> 12:17.760
І ось, будь ласка, він перемістив все, що знаходиться за цією адресою, тобто 11223344, у зворотному порядку, але коли він переходить до

12:17.760 --> 12:24.880
- все в правильному порядку: 11223344. Далі ми збільшимо значення

12:24.880 --> 12:32.480
на одиницю. Давайте переступимо через це і помітимо

12:32.480 --> 12:42.560
- тепер збільшилося на одиницю і стало 11223345, а тепер ми перемістимо це нове значення назад на це місце,

12:42.560 --> 12:48.880
перезапишемо все, що тут є. Тож слідкуйте за цим значенням тут, переходьте і дивіться,

12:50.080 --> 13:00.480
що відбувається, і зараз ви бачите, що воно стало 11223345, збільшене на одиницю. Це зроблено для того, щоб продемонструвати цю малоендіанську

13:00.560 --> 13:06.880
конвенцію, де значення зберігаються у зворотному порядку байт.

13:07.760 --> 13:19.040
Спочатку збережемо це: файл, патч, файл, патч, файл, патч, і я можу зберегти це як, назвемо

13:20.960 --> 13:28.880
його 10, ssmem. У вас є два приклади: 09 і 10. Тож давайте збережемо його. На цьому відео все.

13:28.880 --> 13:35.280
Дякуємо за перегляд.
