Привіт і ласкаво просимо назад.
У цьому уроці ми розглянемо інструкцію LODS, яка розшифровується як Load String (завантажити рядок) і має три варіанти: Load String
Byte (завантажити рядок байтом),
Load String Word (завантажити рядок словом) і
Load String Doubleword (завантажити рядок
подвійним словом).
LODS
B, LODS
W та LODS D. Отже, LODS B завантажує байт з регістра - до -, і ви можете побачити представлення
рядка завантаження.
Він завантажує значення, що зберігається за адресою -, - і копіює його в -.
Після цього адреса - збільшується на один байт.
LODS W зберігає слово з - регістру в - регістр.
Отже, у вигляді діаграми це виглядає так.
Він отримує значення, що зберігається за адресою, на яку вказує регістр -, і копіює його в регістр -.
Тоді адреса - зсувається на два байти, збільшується на два байти.
Далі йде LODS D.
Тут зберігається подвійне слово з регістру - до регістру -.
І тут, у схематичній формі, він отримає значення, що зберігається за адресою, на яку вказує регістр
-, і скопіює його в регістр -.
Після цього адреса - буде інкрементуватися, збільшуючись на чотири байти після кожної операції.
Регістр - автоматично інкрементується або декрементується залежно від прапора напрямку DF у регістрі
прапорів.
Отже, це доповнення до інструкцій STOS, які ми вивчали раніше.
Це говорить про те, що зараз все навпаки.
Замість того, щоб переміщувати значення з регістра - до -, ми робимо навпаки.
Тож давайте розглянемо кілька практичних прикладів.
Отже, це великий практичний
приклад один: MOV -, гекс-адреса 403050.
Отже, тут зберігається - з адресою, що містить вихідні дані.
Потім ви телефонуєте в LODS B.
Таким чином, вона завантажує байт з цієї адреси і зберігає його у регістрі -.
Наступний варіант - ми робимо те саме.
Ми переносимо адресу в - і ця адреса буде містити ваші дані.
Тоді ми
називаємо LODS W. Таким чином, ми завантажимо слово з цієї пам'яті і збережемо його у регістрі -, який складається з двох байт.
Потім ми розглянемо третю ситуацію, третю варіацію, яка називається
LODS D. Вибачте, це має бути LODS D.
Отже, сюди ми переносимо адресу, що містить ваші дані.
Дані, що зберігаються тут, будуть словом the-d, чотири байти, у -.
Отже, ми зберігаємо адресу в -.
Потім викликаємо інструкцію LODS D, яка завантажить слово d з комірки пам'яті,
цієї комірки, в регістр -.
Тож це буде слово.
Отже, відкриваємо наш x64dbg.
Отже, я вже реалізував це і зберіг як 60_lods. exe, що ви можете зробити так само.
І ці адреси можуть бути різними для вас, тому
ви обираєте ту, яка доступна вам у сегменті даних.
Тому, щоб визначити, яка адреса підходить, ми просто клацаємо на карті пам'яті, переходимо до сегмента
даних, а потім виконуємо дамп.
Тож я виявив, що у мене є вільна локація.
Якщо ви бачите інший варіант для свого випадку, просто адаптуйте його відповідно.
Отже, на першому етапі ми збираємося зберігати - давайте повернемося до нашої схеми, яку я підготував, ось
ця схема.
Отже, перша адреса буде для зберігання байта, і я зберігаю там 56.
І тоді друга адреса буде для зберігання слова, яке дорівнює 1234.
Пам'ятайте, що це малий ендіан, тому він буде йти у зворотному порядку.
І третіми даними, які я зберегла, буде слово за цією
адресою, ось тут, і це слово - 12345678.
Зверніть увагу, що після того, як ви вибрали сегмент даних для введення цих значень, просто клацніть правою кнопкою миші, виберіть двійкове редагування і просто
введіть ваше шістнадцяткове значення тут. У цьому випадку
- 56.
Якщо ви хочете ввести слово, виберіть тут адресу, клацніть правою кнопкою миші двійкове редагування, а
потім введіть дані у зворотному
ендіані, 1234.
Те ж саме тут.
Якщо ви збираєтеся ввести d-слово, виберіть - виберіть
d-слово тут, яке складається з чотирьох байт.
Клацніть
правою кнопкою миші двійкове редагування та введіть свої дані.
Зверніть увагу, що коли ви наведете мишку на це місце, ви побачите адресу.
У цьому випадку 00403050, який посилається на цей.
Якщо ви наведете мишку на це місце,
то побачите адресу 00403054.
І якщо ви наведете мишку сюди, то
побачите цю адресу: 00403058.
Отже, тепер давайте поставимо тут точку зупинки.
Клацніть правою кнопкою миші, точка зупинки, перемикач, перейдіть до нашої точки зупинки і переступите.
Тепер він перемістить цю адресу в -. Я просто переступаю через це, і тепер
завантажується адреса - 00403050, яка вказує на це місце.
І ми будемо викликати-викликати байт завантаження, байт завантаження рядка.
Отже, він візьме значення за цією адресою, а це 56, і завантажить його
в -.
Тож давайте зробимо крок і подивимося, що з цього вийде.
А після завантаження -, - має збільшитися на один байт.
Тож давайте переступимо, і ви побачите - збільшується на один байт.
І це значення 56 вже завантажено в регістр -, в регістр -, в перший
байт регістра -.
Далі ми перенесемо цю адресу, 00403054, в розділ - register.
Отже, переходимо,
і тепер ми бачимо, що ця адреса знаходиться в розділі "Реєстрація".
Далі ми будемо називати завантажувальне слово, завантажувальний рядок.
Отже, він завантажить два байти з цієї адреси в регістр -.
- молодші два байти регістра -, а потім збільшить його на слово. Це означає, що він стане
00403056.
Тож давайте подивимося, як це відбувається зараз.
Ми переступимо через це.
І тепер ми бачимо, що значення 1234 було завантажено з цієї
адреси в регістр -, в регістр -, і - було збільшено - збільшено до 00403056.
Далі ми завантажимо-збережемо цю адресу, 00403058, у -. Переступив, і ось - отримав ту адресу, яка
вказує на це місце.
Тепер ми викличемо load dword.
Отже, load dword отримає
це - це значення
тут, 12345678, і збереже його у - регістрі, який є dword, і в той же
час збільшить - на dword, що дорівнює чотирьом байтам.
Тож ми переступаємо, і тепер бачимо, що до нього додалося чотири, і воно стало 5С. Тож спочатку це було тут, 00403058.
Я наведу мишку, і ви побачите решту.
Тепер він перемістився сюди, 0040305C, тобто ось сюди.
Тоді в той же час він також скопіював це значення, 12345678, в - register.
Отже, ось як працюють інструкції завантаження на мові асемблера.
І зверніть увагу, що весь цей час прапорець напрямку знаходиться у своєму значенні за замовчуванням,
яке дорівнює нулю, що означає, що він очищений. За замовчуванням це призводить до збільшення адреси - після
кожного виклику інструкції load.
І навпаки, якщо ви зміните прапорець, встановивши його на одиницю, це призведе до зворотного результату.
Це означає, що після кожного виклику цієї інструкції завантаження, вона буде зменшуватися,
вона буде зменшувати адресу -, так що вона працює точно так само, як і інструкції STOS, де DF буде керувати напрямком збільшення
або зменшення.
На цьому відео все.
Дякуємо за перегляд.