Привіт і ласкаво просимо назад.
У цьому новому розділі ми навчимося створювати власні функції. Тепер, по суті, для створення функцій
все, що
вам потрібно зробити, це відкрити порожню ділянку в пам'яті, яка є печерою коду, і написати свій код.
А в кінці коду просто вставте символ повернення - -.
А щоб викликати функцію, просто викличте її за допомогою ключового слова call.
Отже, у цій лекції я познайомлю вас з викликом і - для функцій, створених користувачем.
Отже, це приклад коду, в якому є виклик і повернення.
Функція знаходиться тут.
Це ваша власна функція.
Щоб викликати цю функцію, ви викликаєте адресу функції за допомогою ключового слова call - виклик, за
яким слідує адреса вашої функції, власне, і є викликом вашої функції.
А всередині функції ви можете виконати будь-яку інструкцію, яка вам до вподоби, і саме таку, яка вам
до вподоби.
Наприклад, у цьому випадку все, що ми робимо, це обнуляємо регістр - і додаємо одиницю до регістру -, а потім використовуємо
ключове слово -.
Ключове слово - повернеться до адреси після виклику.
Отже, якщо ви - в даному випадку тут, то - повернеться на цю адресу тут, і він виконає цю інструкцію після
дзвінка.
Отже, давайте подивимося, як створювати наші функції зараз, відкривши наш x64dbg.
Тому в цьому випадку я написав "відкрити шаблон один. x".
Тож тепер просто прокрутіть вниз до кодової печери - прокрутіть до кінця.
Ми вже робили це раніше.
Просто перегляньте цей розділ, якщо ви забули, як це робиться.
Тож прокрутіть все вниз, шукайте
кодову печеру.
Як ви пам'ятаєте, печера коду - це порожній простір, де немає ніяких інструкцій - нульові
байти, наприклад, тут - і просто ігноруйте це.
"Додати байт" - це просто помилка.
Насправді, тут немає ніякої інструкції.
Там має бути нуль байт.
Але коли x64dbg спробував розібратися з цим, він помилково інтерпретував ці нульові байти як інструкцію додавання.
Отже, це все сміття, тому ви можете використовувати будь-які нульові байти, будь-яке місце в пам'яті,
де є нульові байти. Ви можете використовувати їх для написання власної інструкції.
Тому ми будемо використовувати цю адресу тут, 402705, але на вашому комп'ютері вона може бути іншою.
Тож просто слідкуйте за тим, що бачите на своєму комп'ютері.
Для мене - ось ця.
Тому я беру це як приклад.
Тому зараз я збираюся створити цю функцію тут.
Отже, я збираюся створити свій перший рядок функції, а саме - -.
Отже, я збираюся створити
інструкцію: xor -, - - натиснути клавішу Enter.
А потім наступна інструкція - додати - один.
Тому я наберу: add -, one - enter. А далі за ним піде - інструкція.
Тому я напишу -, натисну клавішу Enter, а потім закрию це.
Отже, ми визначили нашу функцію - просто функцію з трьох рядків, щоб спростити її для початку - а потім
ключове слово - повернеться туди, звідки був зроблений виклик, до інструкції, яка йде після виклику.
Отже, у цьому випадку ми будемо викликати нашу функцію з цієї адреси, 401533.
Тож давайте прокрутимо все до кінця.
Перед цим
не забудьте поставити крапку зупинки, щоб вам було легше знайти цю адресу.
Тож просто поставте там точку зупинки, як я зробив тут.
Клацніть правою кнопкою миші, точка зупинки, перемикач.
І ось у вас є брейк-поінт.
Тепер давайте прокрутимо весь шлях до цієї
адреси, 401533, яка буде вашим "push -".
Ну, сюди.
Гаразд, тепер тут ми викличемо нашу користувацьку функцію, яка знаходиться за цією адресою.
Тож давайте
наберемо
його: зателефонуйте за номером 00402705.
Натисни Enter.
Наступна команда mov -, -- - - натиснути
клавішу Enter.
І тоді ви можете закрити цю тему.
Тепер ми можемо поставити тут брейк-поінт, як я і зробив, і побіжимо далі.
Б'є наш брейк-пойнт.
А потім давайте переступимо через це.
Перейдіть через це, і тепер він викличе нашу функцію.
Отже, коли ми викликаємо нашу функцію, вона перестрибне за цією адресою, 402705, і виконає нашу функцію.
Ми повинні ввійти, в даному випадку - не переступити, а саме ввійти, тому що ми входимо у функцію.
Тож ми входимо, і так ми йдемо до своєї функції.
Бачиш?
Отже, перший рядок нашої інструкції - обнулити -.
Тож ми переступаємо через це.
Тож переступаємо, і тепер - нуль. А тепер додаємо одиницю до -.
Тож переступите через це, і - тепер ви стали одним цілим.
Тепер, наступне, що вона зробить, це викличе -.
Отже, "-" означає повернутися.
Повернутися куди?
Поверніться на адресу після дзвінка, якою тут є ця адреса.
Тож ми переступимо через це зараз, а після дзвінка повернемося до адреси.
Ось як ви можете легко створити власну функцію, визначену користувачем.
Все, що вам потрібно пам'ятати, це використовувати ключове слово call і ключове слово -.
Ключове слово - використовується, коли ви повертаєтеся з функції.
Ось цей.
Ось так.
Ось і все - дуже просто.
Тож зараз ми збираємося ближче, глибше зануритися в те, що відбувається.
Як це - знати, куди повертатися?
Гаразд.
Тож не забудьте зберегти свою роботу.
Тож натисніть на файл,
патч, патч,
патч.
І давайте дамо
йому ім'я: 66-дзвінок-.
x.
Припини.
Натисни "ОК".
А тепер відкриваємо збережений файл.
Гаразд, тепер ми тут.
Давай поставимо брейк-поінт.
І ми збираємося вивчити поглиблено:
як це - знати, куди повертатися?
Тож давайте проаналізуємо, що відбувається.
Тож ми біжимо і даємо йому пробити наш брейк-пойнт.
Відійди.
А зараз ми зробимо крок назустріч.
Отже, щоразу, коли виконується виклик, він виштовхує до стеку наступну за ним адресу.
Ця адреса, 401538 - все
вірно.
Тепер, стек
- ви можете бачити - ось це місце, насправді 64FF6568.
Отже, коли ви ввійдете у виклик, він виштовхне цю адресу слідом за собою до стеку.
Бачиш, що відбувається?
Ми входимо у виклик і помічаємо, що 401538 знаходиться у стеку.
Отже, 401538 у стеку.
Отже, коли ви робите виклик,
перше, що робить виклик, це зберігає адресу після нього у стек.
Тож він виштовхне його до стеку.
Отже, - тепер покаже сюди, а це збережено там, тому
що - збирається використати це, щоб - знав, що він повинен повернутися сюди.
Ось і весь секрет - знає,
куди повернутися, адже саме виклик виштовхує цю адресу до стеку.
Гаразд, давайте подивимося, як це відбувається зараз.
Тож тепер ми вже всередині функції.
Тож ми переступаємо через
це і все виконуємо.
А тепер - збирається повернутися.
Так що ж робить?
- додасть цю адресу до - register.
Тепер, - насправді не вказує кудись сюди, вниз.
-, як ви пам'ятаєте, є вказівником інструкцій.
Він вказує на те, де ви зараз перебуваєте.
Тож наразі ми перебуваємо за цією адресою.
Отже - вказує сюди: 402708. Ви можете переконатися, подивившись тут: 402708 - так.
Отже, що відбувається, коли
ви викликаєте -, - витягне цю адресу зі стеку в регістр -.
Таким чином, - повернеться до цієї адреси зверху.
Саме так - робить.
Гаразд.
Давайте подивимося, як це відбувається тут.
Тож зараз ми переступимо через "-".
Коли ми переходимо за -, ця адреса вискакує з реєстру.
Тепер його ніде немає - він перейшов у вказівник - інструкції.
Отже, тепер - містить адресу, яка раніше була на вершині стека.
І зараз - вказує на це.
Саме тому зараз інструкція повернулася на адресу після дзвінка.
Бачиш? Саме так - працює.
Таким чином, виклик виштовхує до стеку адресу, що слідує за ним.
- витягує адресу зі стеку назад у -, так що - тепер може повернутися на вершину.
Отже, це механізм виклику і -.
Гаразд.
Сподіваюся, це було зрозуміло.
Це все для цього відео.
Дякуємо за перегляд.