Привіт і ласкаво просимо назад.
На цьому уроці ми вивчимо основи арифметики.
Приклади базової арифметики.
Синтаксис команди: ADD адресат,
джерело.
Ви берете джерело, вихідне
значення, додаєте його до місця
призначення, яким є регістр, а потім зберігаєте результат назад до місця призначення.
Як ви бачите, ви берете джерело, додаєте місце
призначення і зберігаєте його назад до місця призначення.
Візьмемо, наприклад,
інструкцію ADD ECX, EAX.
Тут ми беремо значення в ECX, додаємо його до будь-якого значення в EAX, а потім зберігаємо результат
назад в EAX.
Візьмемо інший приклад: ДОДАТИ 0x2A до EDI.
У цій інструкції ми беремо шістнадцяткове значення
2A і додаємо його до будь-якого значення в EDI, а потім зберігаємо результат додавання назад у
регістр EDI.
Візьмемо інший
приклад: SI, CX.
Отже, це приклад часткового реєстру.
Частковим регістром у цьому випадку буде слово.
Тож повернімося до нашого попереднього уроку.
СІ відноситься до слова, яке є 16-бітним.
Слово, як ви пам'ятаєте, складається з двох байтів.
DWORD - це чотири байти.
Слово - це два байти.
Отже, в цьому прикладі ми беремо слово в SI і додаємо його до слова в CX.
Отже, CX - це також слово, яке складається з двох байт або 16 біт, і результат буде збережено назад у
CX.
Отже, це приклади синтаксису інструкції ADD.
Тепер давайте розглянемо додавання регістрів DWORD.
Отже, у цьому випадку все це буде DWORD, оскільки ви використовуєте чотири байти. ESI, EAX, EBX - це чотири байти.
Ми збираємося перемістити 1 в ESI і перемістити 2 в EAX, перемістити 3 в EBX.
Таким чином, ми встановимо початкові значення у цих трьох регістрах.
Потім виконуємо додавання.
Отже, давайте спробуємо зробити це за допомогою нашого x64dbg.
Отже, я покладу це праворуч, і ми запустимо наш x64dbg.
І ми скористаємося нашим шаблоном.
Наш шаблон, який ми створили раніше.
Шаблон, Шаблон 1.
Отже, спочатку зробіть копію Шаблону 1, щоб мати резервну копію, а потім відкрийте
цей Шаблон 1 з x64dbg за допомогою x32dbg.
Відкриваємо Шаблон 1.
І тепер ми можемо почати писати наш код тут.
Отже, перша інструкція -
давайте подивимось
- це налаштування реєстрів.
Отже, ми переносимо 1 на ESI.
Отже, зайшовши
сюди, ви натискаєте пробіл, а потім починаєте:
MOV ESI,
0x1, тобто
1, в шістнадцятці натискаєте Enter.
Друга команда - перемістити 2 на EAX.
Отже, MOV EAX,
2.
Гаразд.
Третя команда - перемістити 3 до EBX, тому маємо MOV EBX, 3. Натисни "Гаразд".
Отже, на цьому етапі ми вже встановили три значення в ESI, EAX і EBX.
Тепер наступна інструкція - додати EBX до EAX.
Тож давайте зробимо це зараз.
ДОДАТИ EAX, EBX. Натисни "Гаразд".
Наступний крок - додати EAX до EAX.
Отже, вводимо
ADD EAX, EAX.
Гаразд. Потім ми переміщуємо
ці FF FF вісім F разом в ESI, тому введіть MOV ESI, 0x
FF FF FF FF FF FF
FF FF FF FF FF вісім
F разом.
Натисни
"Гаразд".
Далі ми додаємо ESI до EBX.
Отже, давайте наберемо ADD EBX, ESI. Натисніть Гаразд, а потім ДОДАТИ EAX, ESI.
ДОДАТИ ESI, EAX. Натисни "Гаразд".
Тепер закрийте це вікно і просто для перевірки, переконайтеся, що все правильно.
Після того, як ви підтвердите, що ввели дані правильно, ми можемо поставити тут крапку зупинки.
Клацніть правою кнопкою миші і виберіть Перемикач точок зупинки.
Я вже це зробив.
Тепер ми можемо бігти.
Так ми переступаємо, поки не дійдемо до цього першого рядка.
Він переміститься на 1 до ESI. Тож давайте подивимось на ESI.
Наразі це значення становить 23.
Давайте переступимо через нього, і тепер воно стане 1, тому що ми щойно виконали цей рядок.
Наступним буде переїзд 2 на EAX.
Таким чином, EAX наразі дорівнює 1.
Тож давайте подивимося, що буде після цього рядка.
Перейдіть, і тепер він перемістився на 2 до EAX.
Далі ми збираємося перенести 3 на EBX.
Зараз це значення займає
EBX. Він переходить на третю позицію.
Переступимо через це значення, і тепер EBX має значення 3.
Далі ми додамо EBX до EAX, так що EBX має значення 3, і ми додамо його до EAX, що дорівнює 2, а потім збережемо
результат назад в EAX.
Таким чином, EAX має стати 5.
Отже, 3 плюс 2 дорівнює 5 і зберігається в EAX, тому EAX має дорівнювати 5.
Тож давайте переступимо через це.
І правильно.
EAX став 5.
Далі він додасть EAX до себе, а потім збереже результат назад в EAX.
Отже, знадобиться
5, додайте 5 до себе. Буде 10.
Отже, він збереже значення 10 в EAX.
Отже, у шістнадцятковій системі числення 10 - це A.
Так.
Дозвольте мені показати вам.
Відкрийте свій калькулятор.
Переконайтеся, що ви перейшли в режим програміста.
Тримай, Програмісте.
Тепер візьміть п'ять.
Переконайтеся, що ви натиснули на Hex тут.
Ви берете 5 плюс 5 дорівнює 10.
Отже, "А" дорівнює 10.
Отже, після виконання цього рядка ми отримаємо A.
Тож давайте спробуємо.
І ти отримав п'ятірку. Далі ми перемістимо це значення на вісім F в ESI.
Отже, ESI наразі такий, тож давайте переступимо через нього, і тепер у вас є вісім F в ESI.
Наступним кроком буде додавання ESI до EBX.
Отже, ESI наразі утримує значення FFFF FFFF.
Це додасться до EBX.
EBX дорівнює 3.
Отже, ми візьмемо це, додамо до 3 і збережемо результат назад в EBX.
Як ви думаєте, яким буде результат?
Тож давайте спробуємо.
Тут ми візьмемо ESI, який є усім цим FFFFF Отже, давайте очистимо
вхід.
Один, два, три, чотири, п'ять, шість, сім, вісім плюс, а потім EBX-EBX - це 3 плюс
3 дорівнює, і ви отримуєте 1, а потім 0000 0002.
Гаразд, але коли ви зробите це тут, ви не побачите 1, тому що наш регістр складається лише з чотирьох байт.
Тут більше чотирьох байт.
Чотири байти - це тільки до цього місця,
так?
Тож ця 1 буде відкинута,
усічена.
Таким чином, ви побачите
лише 2 замість 1, за якою йдуть нулі та 2. Ти бачиш тільки два.
Тож давайте зробимо крок і подивимось, як це відбувається.
І дійсно, ми отримуємо 2.
Отже, 1 випадає, тому що тут не вистачає місця для зберігання 1.
Це і є сенс обертання навколо.
Обертання відбувається, коли результат додавання дає результат, який занадто великий для зберігання
у виділеному місці.
Отже, все, що буде надлишковим, буде обрізано.
Отже, наступним, останнім буде ADD ESI, EAX.
Отже, EAX має значення 10.
ESI отримав значення FFFF... тож до FFFF треба додати 10... і збережемо результат назад в ESI.
То що ви думаєте? Його знову скоротять?
Так.
Тож давайте спробуємо зробити це на калькуляторі.
Спочатку ми очистимо вхідні дані.
Візьмемо EAX має значення A - тож вводимо A. Переконайся, що це Гекс. Тип А, плюс, а потім ми
додамо до всього, що є ESI. ESI - це все F, тому введіть F-1, 2, 3, 4, 5, 6, 7, 8.
Отже, ми беремо А плюс вісім F, і у вас має вийти 1, а потім 7 нулів і 9.
Так?
А 1 усікається, тому що наш регістр має розмір лише чотири байти
- чотири байти.
ESI - це лише чотири байти,
тому 1 буде обрізано.
Отже, тут ви повинні отримати лише 9.
Тож давайте подивимося, як це відбувається тут.
Тепер переступайте, і це правда, у вас є 9.
Число 1 усікається.
Гаразд.
Тому вам слід пам'ятати про ці побічні ефекти, коли ви додаєте числа, в результаті чого отримуєте
значення, яке є занадто великим для регістра. Все, що занадто велике, буде обрізане та викинуте.
Ви побачите лише перші чотири байти.
Ось що ми маємо на увазі під додаванням у вашій збірці за допомогою регістру.
Отже, тепер ви знаєте основне додавання.
У наступному уроці ми продовжимо працювати з частковими регістрами.
Тож до наступної зустрічі.
Дякуємо за перегляд.