Привіт і ласкаво просимо назад.
Давайте подивимося, як можна використовувати LEA для доступу до масивів пам'яті, і виконаємо кілька практичних вправ.
Загалом, це те, що ми намагаємося робити.
У масиві пам'яті ми будемо зберігати три цілих числа.
Отже, перше ціле число - одиниця, потім два, а потім три.
І ці три будуть послідовно зберігатися в пам'яті, починаючи з цієї адреси в секції даних.
А потім ми використаємо LEA для доступу до кожної з цих адрес, щоб отримати значення, що зберігається за цими адресами
пам'яті.
І ми будемо використовувати - як реєстр для зберігання цих адрес і, можливо, використовуватимемо - реєстр і, можливо,
- також.
Отже, концепція така сама, як і в попередніх уроках, де ми бачили, що адреса
масиву починається з базової адреси, яка містить перший елемент масиву, а потім
послідовно кожен наступний елемент збільшується на один DWORD.
Отже, ви отримуєте, скажімо, 3040.
Наступний буде на чотири чотири, а потім ви додасте чотири і ще один буде чотири вісім і так
далі.
Таким чином, він щоразу збільшується на чотири байти або на DWORD щоразу.
А ще у нас є індекс, який є довільним способом перегляду структури масиву.
Таким чином, нульовий індекс завжди відноситься до першого елементу, індекс один - до другого і так далі.
А зазвичай - буде використовуватися для зберігання базової адреси, тобто цієї адреси, а адреса пам'яті збільшується в міру того,
як ви спускаєтеся вниз.
Гаразд.
Отже, з цим покінчено, давайте розглянемо перше рішення, як використовувати LEA для доступу до масивів пам'яті.
І це дуже просте рішення.
Він не використовує жодного циклу.
Все, що він робить, це бере - а потім додає чотири, що є зміщенням для наступного елемента і так далі.
Отже, перше, що ми зробимо, це збережемо базову адресу. Припускаючи, що це базова адреса, нам
потрібно зберегти її в -.
Отже - тепер містить базову адресу масиву.
Далі нам потрібно завантажити адресу з нульовим індексом масиву в -.
Отже, тепер ми отримаємо адресу -, додамо до
неї нуль.
Хоча тут це не показано, те, що ми робимо, насправді є плюс-мінус нуль.
Нуль буде індексом, ось
цей індекс.
Тож нуль ми зазвичай не пишемо, бо це зайве.
Далі, як тільки ми додамо нуль, ви потрапите до базової адреси, тоді ми збережемо результат
- плюс нуль в -.
Отже - має таке значення, таку адресу 403040.
Коли ми додаємо до неї нуль, ми все одно отримуємо ту саму адресу і зберігаємо в -.
Тому пам'ятайте, що ця інструкція не розіменовує адресу.
Ви не отримаєте значення, яке тут зберігається.
Ви використовуєте цю дужку для того, щоб вказати програмі, що ви виконуєте обчислення,
а не доступ до пам'яті.
Це дуже важливо знати. Ви не скасовуєте посилання -.
Після того, як ми отримали адресу і зберегли її в -, далі ми розіменовуємо посилання -, щоб отримати значення, яке там
зберігається.
Отже, ось де ви насправді отримуєте доступ до адреси.
Отже, оскільки - містить нульовий масив, тепер ми
можемо розіменовувати цю адресу -, щоб отримати значення, яке там зберігається, і перемістити його або скопіювати до -.
Тому ми використовуємо його як тимчасовий реєстр, щоб зберігати значення, яке ми копіюємо для ваших цілей.
Якщо ви хочете, ви можете замінити його іншими регістрами або додати сюди додаткові інструкції з використання
- у будь-який спосіб, який вам подобається.
Отже, в цьому простому прикладі ми просто копіюємо значення, що зберігається за адресою, в -.
Отже, ми вже отримали нульовий індекс масиву і зберегли його в -.
Тепер ми повинні перейти до наступного елемента масиву.
Отже, ми беремо - плюс чотири, тому що кожен елемент збільшується на
один DWORD або чотири байти.
Ось чому нам потрібно додати чотири до цієї базової адреси, щоб отримати наступний елемент.
Тому ми беремо - плюс чотири.
Отже, як тільки ми - плюс чотири, ми беремо це в дужки тут і користуємося інструкцією.
Отже, ми робимо те, що ми робимо - ми робимо доповнення.
Ми беремо - плюс чотири, а потім отриману адресу зберігаємо в -.
Отже, це - тепер має адресу масиву з індексом один, який є цим один, масив з індексом один, який є цією адресою, що містить
значення два.
Отже, отримавши адресу масиву з індексом один, ми переходимо до наступного, де розіменовуємо
адресу, що містить індекс масиву один, і копіюємо це значення в -.
Отже, ми отримуємо значення два. Далі ми перейдемо до
третього елементу масиву.
Отже, ми повинні додати вісім.
Чому?
Тому що перший елемент до другого ми додаємо чотири.
Отже, якщо ми хочемо перейти до третього елемента, ми повинні додати вісім до слів away, щоб отримати цю адресу,
яка є індексом два.
Тому ми додаємо сюди вісім.
Отже, отримавши адресу третього елемента, ми збережемо її в -, потім використаємо MOV для розіменування -, витягнемо
значення, що там зберігається, і скопіюємо його в -.
Отже, значення, що зберігається в цьому третьому елементі - три таких.
Отже, ось як ми можемо - це проста, проста реалізація без використання жодного циклу, без використання
жодного лічильника.
Просто додайте зміщення.
Нульовий зсув означає базову адресу першого елемента. Нульовий зсув тут, нульовий зсув.
За цією адресою слідує зміщення чотири.
Зсув чотири - це елемент масиву один, який є цією адресою, а наступним буде зсув вісім, який є третім елементом,
що посилається на елемент масиву два.
Отже, це простий приклад використання LEA.
Отже, давайте спробуємо зробити це у нашому x64dbg. Отже, ми завантажимо наш шаблон один, а
потім перейдемо до карти пам'яті, відкриємо секцію даних і заповнимо пам'ять нашого масиву цими значеннями.
Перший - 403040.
Отже, ми беремо ось це, а потім просто двічі клацаємо тут і ставимо один.
Пам'ятайте, що це адресується як одне СЛОВО.
Це означає, що це в малому ендіанському порядку, у зворотному порядку.
Отже, коли ви отримаєте доступ до цього значення, це буде 00000001.
Далі, на це зміщення 3044, яке знаходиться тут, ви можете
навести мишку, ви можете побачити 3044 там. Двічі клацніть і введіть дві клавіші. Далі йде 048, наведіть на нього мишку,
і ви побачите 403048. Двічі клацніть тут, і ви зможете ввести три.
Тепер ми створили наш масив: елемент масиву один, елемент масиву два і елемент масиву три.
Отже, тепер, коли ми отримали це, ми готові написати наш перший розв'язок для ітерації по масиву.
Тож перейдіть за цим посиланням і введіть ці інструкції.
Отже, першою командою буде MOV -, а потім тут ви повинні вказати вашу базову адресу.
Отже, спочатку скопіюємо базову адресу.
Клацніть правою кнопкою миші, скопіюйте цю базову адресу, поверніться сюди.
І MOV -, 0x, і вставити адресу цієї базової адреси масиву.
Натисни
"ОК".
Далі потрібно завантажити ефективну адресу.
LEA -, а в квадратних дужках - плюс нуль, що насправді є зайвим, але я просто ставлю його для
наочності.
Гаразд.
Наступним кроком буде переміщення значення, що зберігається в -. Це означає, що ви вилучаєте посилання на -.
Отже, MOV -, dereference -.
Далі,
ця LEA,-,-,--- плюс
чотири.
Клац,
добре.
А потім РУШ-,-. Далі буде
завантаження LEA, -, -
плюс вісім.
А потім MOV -,
-.
Гаразд.
Тепер просто зробіть паузу і перевірте, чи правильно ви його ввели.
Після того, як ви підтвердите, що ввели його правильно, ми можемо поставити тут точку зупинки.
Зверніть увагу, що я вже зберіг свій
як 54 простих тире LEA точка XE. Можливо, ви захочете зробити те саме.
А тут ми поставимо
брейк-поінт.
І біжи.
І тут, зверніть
увагу, що наш сегмент даних, наш сегмент даних за цією адресою, має три елементи, три цілих числа: 01, 02 і 03.
І ось ми біжимо - ми вже біжимо, і він досяг
нашого брейк-пойнту.
Ми переступаємо через нього,
і тепер він перемістить базову адресу, яка тут є базовою, 403040 на-. Тож давайте переступимо через це і подивимось. Це базова адреса.
Це початок нашого масиву тут.
Тепер ми використаємо LEA для обчислення першої адреси першого елемента масиву.
Тому ми використовуємо LEA і ставимо квадратну дужку - плюс нуль.
Але нуля ви тут не побачите.
І цей DPTR DS автоматично вставляється x64dbg, коли ми щойно ввійшли.
Отже, давайте подивимось - щоб побачити адресу першого
елемента масиву.
Тож давайте переступимо через це зараз і подивимося.
Отже, вона обчислила адресу першого елемента і зберегла її в -, і зверніть увагу, що прапорці залишилися недоторканими.
Прапори не змінюються взагалі.
Отже, це перша адреса.
А тепер ми витягнемо значення, що зберігається за цією адресою.
У цьому випадку нулем буде одиниця.
Отже, ми будемо використовувати оператор MOV, а тут - інструкцію
MOV, і розіменування - для отримання значення, що зберігається там, тобто нуль одиниць, і збереження в -.
Тож дивись...
Ми підходимо і бачимо - магазини один, ось цей.
Далі ми обчислимо зміщення.
Ми обчислимо адресу для другого елемента, який дорівнює нуль два.
Отже, ми беремо базову адресу плюс чотири.
Як видно з діаграми, нам потрібно плюсувати чотири, щоб перейти до наступної комірки
пам'яті, де зберігається наступний елемент масиву.
Тому ми додаємо чотири і дивимося -.
Отже - зараз зберігається наступна адреса, а саме 403044, яка знаходиться тут.
Якщо ви наведете мишку, то побачите там адресу, 403044, яка і є цією.
Отже, далі ми розіменовуємо посилання
на -, щоб отримати значення, яке там зберігається, і тоді це буде два.
Тож давайте зробимо це.
Отже, тепер розіменовуємо - і витягуємо значення, щоб скопіювати його до -, а - тепер має значення two.
Далі буде обчислено адресу третього елемента масиву.
Отже, знадобиться -, яка є базовою адресою, плюс вісім. Плюс вісім - ми доставимо тебе сюди.
Третій елемент.
Отже, плюс вісім.
Отже, давайте подивимося, що-коли він буде зберігати адресу в -. Тож ходімо подивимось.
- тепер має 403048, який вказує на цю адресу, ось цю.
Отже, якщо ви наведете
мишку, то побачите там адресу.
Далі буде розіменовано цю адресу, а потім отримано значення, яке там зберігається, а це три, і скопійовано
в -. Тож дивіться -, переступайте, і тепер воно має значення три.
Ось так ми позбавляємося від посилань.
Ось як ми можемо використовувати LEA для простого доступу до масивів пам'яті.
На цьому відео все.
У наступній статті ми розглянемо другий приклад.
Це простий приклад.
Наступну ми зробимо за допомогою лічильника.
Тож до наступної зустрічі.
Не забудьте зберегти 54 простих LEA точки XE.
Це все для цього відео.
Дякуємо за перегляд.