Привіт і ласкаво просимо назад.
У цьому уроці ми розглянемо, як викликати функції і передавати параметри через купу, також
відому як глобальні дані, якими тут є ці дані.
Ми використаємо ту саму задачу тут, а потім подивимось на реалізацію.
Отже, у нас є дві функції: головна і дочірня.
Головна функція має лише одну інструкцію - викликати дочірню функцію.
Отже, тут ви бачите виклик за цією адресою, який є початком дочірньої функції.
А в дочірній функції ви розіменовуєте пам'ять, щоб отримати значення, яке там зберігається,
а це п'ять, і це весь сегмент даних в пам'яті.
Отже, перш ніж запускати цей код, ми повинні ініціалізувати ці області в пам'яті значеннями п'ять, десять
і три.
Отже, коли запускається дочірня функція, ви розіменовуєте її, щоб отримати фактичні значення за цими адресами.
Ось чому ми використовуємо цей синтаксис, DWORD і так далі.
Отже, ви розіменовуєте посилання, отримуєте значення, що там зберігається, і переміщуєте його на -.
Зробіть те ж саме для - і -.
І як тільки всі ваші значення опиняться в трьох регістрах, ви виконуєте множення і додавання,
як і раніше.
Потім ви повертаєте виклик на основний номер.
Отже, давайте подивимось на x64dbg і подивимось, як він працює.
Тут я створив файл 701-calling-conventions.
Ви можете зробити те ж саме.
Просто введіть код, який ви бачите тут, весь
цей код.
І є ще одна додаткова річ, яку вам потрібно зробити: перейдіть до карти пам'яті, перейдіть
до сегменту даних, і тут введіть ці три значення: п'ять, А і три.
Це все шістнадцяткові значення.
Тож насправді вам п'ять, десять і три. A - це шістнадцяткове значення для десяти.
Тож ви можете ввести це за цими адресами тут, тут, тут, тут і тут.
Якщо для вашого комп'ютера це інша адреса, просто слідкуйте за адресою вашого комп'ютера і внесіть відповідні
зміни пізніше, коли ми передаватимемо параметр до функції, до дочірньої функції.
Тож давайте подивимося, як це працює.
Ось тут, вам дзвонять.
Отже, ви ставите тут точку зупинки, перемикаєте її і запускаєте.
Він б'є наш брейк-пойнт.
Тепер ми вступаємо в нього.
Тож ми робимо крок у нього.
Перше, що він робить, це роздиференціює
цю адресу: DWORD DS 403050, яка знаходиться тут, що дорівнює п'яти.
Отже, якщо ми переступимо через це, ви побачите,
що п'ять тепер знаходиться в -, тоді ви вилучаєте посилання на цю адресу, яка знаходиться тут. Ви переступаєте, і тепер бачите
десять в -, потім вилучаєте це посилання, переступаєте через нього,
і тепер бачите три в -. Потім ви виконаєте множення і додавання, а потім повернетеся до головної функції
за адресою після виклику.
І ваш результат - 35 у гексах, що дорівнює 53 у десятковій системі числення.
Ось як ви можете використовувати купу для передачі параметрів.
Отже, у цьому випадку купа просто посилається на сегмент даних,
сегмент даних.
Чому?
Тому що ця купа тут є глобальною,
глобальною для всіх функцій, її бачать всі функції у вашій програмі від початку до
кінця програми. Усе, що лежить у купі, видно.
Тому є дві назви для нього.
Ми називаємо це купою, або глобальним сегментом даних.
Вони означають одне й те саме.
Тож пам'ятайте, якщо ваша адреса тут інша, якщо вона для вас інша, ви повинні внести
необхідні зміни і тут.
Тому все, що тут, має відповідати цьому, і все, що тут, має відповідати цьому.
Все, що тут є, має відповідати тут.
Тож просто внесіть відповідні зміни на основі того, що ви бачите у вашій системі.
На цьому відео все.
Дякуємо за перегляд.