Привіт і ласкаво просимо назад.
У цьому уроці ми попрактикуємось у використанні кодових печер для друку повідомлень і надрукуємо два повідомлення.
Перше повідомлення - це повідомлення "Привіт з кодової печери. А потім друге повідомлення, коли ви повернетеся до точки переходу,
виведеться ще одне повідомлення: "Повернулися з кодової печери.
Отже,
спочатку відкриваємо перший шаблон.
Тепер ідентифікуємо нашу кодову печеру.
Отже, натискаємо на це і шукаємо нашу кодову печеру.
Тож це точка переходу.
Тепер прокручуємо вниз, щоб знайти печеру з кодом.
І це нормально.
У нас вже є брейк-поінт там.
Швидший спосіб - перейти безпосередньо до точки
зупинки, якщо ми поставили її раніше, а це - печера коду.
Отже, тепер давайте видалимо цей коментар - натисніть крапку з комою, а потім backspace, щоб видалити коментар.
Отже, всередині ми розмістимо повідомлення:
"Привіт з кодової печери. Для цього нам потрібно скористатися
функцією printf.
І ми будемо використовувати два параметри для функції printf.
Тож ми збираємося це зробити.
А потім новий рядок.
Для цього нам потрібно спочатку натиснути на рядок, а потім викликати printf.
Отже, нам не потрібно використовувати специфікатор формату, тому що тут лише один
рядок, і нам не потрібно вводити додаткові числа або інші зовнішні рядки.
Отже, нам просто потрібно натиснути на цей рядок, а потім викликати функцію printf.
Для цього ми можемо спочатку натиснути на цю нитку.
Перед цим нам потрібно створити рядок.
Отже, перейдіть до карти пам'яті і знайдіть розділ даних для ініціалізованих даних.
Двічі клацніть на ньому і перейдіть до цієї адреси пам'яті - будь-якої порожньої - і виберіть все це.
А потім клацніть правою кнопкою миші, бінарне редагування, клацніть всередині поля і введіть "Привіт з кодової печери. Потім хочеться перейти на новий рядок.
Отже, тут потрібно поставити 0A.
0A - новий рядок.
Ось цей символ, новий рядок, 0A.
0A - шістнадцятковий код нового рядка.
Дозвольте мені просто показати вам це, перейшовши
до таблиці ASCII.
І шукайте 0А ось тут.
Новий рядок.
Отже, 0A - це новий рядок у гексі.
Тому ми додали сюди нову лінію 0A.
Ми не можемо ввести тут зворотний слеш-n, тому що якщо ми введемо тут зворотний слеш-n, програма інтерпретуватиме його як рядок,
а не як новий рядок.
Отже, нам потрібно вставити шістнадцяткову версію для нового рядка, а потім натиснути ОК.
А тепер перевірте тут, і ви побачите, що тут 0A, хоча це крапка, але насправді це новий
рядок.
Отже, тепер у нас є це, і ви можете штовхати до стека.
Отже, ми натискаємо на це.
Спочатку копіюємо адресу, натискаємо правою кнопкою миші і копіюємо адресу, а потім переходимо сюди.
А потім ставимо гекс push
і вставляємо адресу для рядка "Hello from code cave.
Натисни
ОК.
А наступним буде виклик функції printf.
Отже, нам потрібно шукати існуючий printf, тому повертаємося до покажчика інструкцій, прокручуємо вниз до таблиць переходів
і натискаємо на нього.
Тут ви переходите до таблиць переходів, шукаєте функцію printf, і вона у вас є.
Скопіюйте цю адресу і поверніться до своєї кодової печери.
А тут ми зберемо виклик за адресою функції printf.
Отже, ви просто вставляєте вашу адресу для функції printf сюди.
І ви бачите, що це
так.
Далі нам потрібно повернутися до адреси після точки переходу.
Щоб повернутися до точки переходу, натисніть на вказівник інструкції і прокрутіть вниз.
Отже, точка переходу - нам потрібно спочатку зібрати стрибок до печери коду.
Отже, яка адреса нашої кодової печери?
Ходімо подивимось.
Адреса нашої кодової печери: 402701.
Зрозуміло.
Повернутися до вказівника інструкцій.
Зберіть трамплін тут.
0x402701, і це точка переходу.
А адреса після точки переходу - ось ця.
Тож скопіюй це.
Скопіюй цю адресу.
Поверніться до кодової печери.
А тут ми повернемося до адреси після точки переходу.
Тож переходьте
та вставляйте свою адресу.
Таким чином, це повернеться до точки переходу.
Гаразд, давай відстежимо його.
Якщо натиснути на це, ви повернетесь туди.
Бачиш?
Отже, ось тут, коли програма запуститься, вона дійде до цього рядка.
А потім на цьому рядку він перейде до печери коду. Клацніть на ньому, і ви побачите, що коли він дійде до печери
коду, він виштовхне рядок до стеку, а потім викличе printf, щоб надрукувати це повідомлення:
"Привіт з печери
коду. Після цього
він повернеться сюди.
Він дійде до цього рядка і повернеться до адреси після точки переходу.
Тож двічі клацніть на це і ви повернетесь сюди.
Отже, коли він повернеться сюди, ви хочете вивести ще один оператор: "Повернулися з печери коду. Отже, ми хочемо надрукувати
цей вираз.
"Повернулися з печери коду", а потім новий рядок.
Для цього нам потрібно натиснути на рядок і знову викликати функцію printf.
Отже, струна, яку ми збираємося натиснути, - це ця струна.
Отже, спочатку нам потрібно створити цей рядок.
Переходимо до карти пам'яті.
Я думаю, що ми вже отримали це тут.
Тож ми їдемо за іншою адресою, можливо, 403080.
А потім виділяємо все це і натискаємо правою кнопкою миші, потім бінарне редагування і вводимо рядок "Back from code
cave. А потім для
нового рядка вам потрібно перейти сюди і ввести 0A для нового рядка, а потім натиснути OK.
Отже, ви бачите "Back from code cave", а потім це останній
символ, 'e', а після нього - новий рядок.
Цей новий символ рядка, новий
символ рядка.
Тож тепер у нас є ця адреса.
Треба скопіювати цю адресу: "Повернулися з кодової печери. Клацніть правою кнопкою миші,
скопіюйте
адресу.
І тут ми будемо штовхати до штабеля.
Отже, пробіл, клавіша push, шістнадцятковий символ, за яким йде адреса рядка.
Після цього буде виконано виклик printf.
Отже, давайте візьмемо адресу printf звідси.
Ми переходимо сюди, двічі клацаємо, отримуємо цю адресу printf з таблиці переходів.
Потім поверніться до вказівника інструкцій.
Тут ми викличемо простір функцій, викличемо, вставимо
адресу функції printf.
Натисни ОК.
Так.
Тож тепер у нас є це.
Тож давайте побіжимо і подивимося.
Тепер ви бачите точку зупинки.
Давайте переступимо через це і подивимося на результат.
Відійди. Тепер він тут. Він стрибне до печери.
Відійди.
І ми зараз у печері коду.
Він виштовхне цей рядок,
"Привіт з печери коду", до стеку.
Тож слідкуйте за стосом, коли я переступатиму через нього.
І ви бачите, що рядок знаходиться
у стеку в готовності до використання функції printf.
Тепер, якщо я переступлю через цей виклик функції printf, подивіться, що буде виведено на екран.
"Привіт з кодової печери. Отже, зараз
ми знаходимося в печері коду.
Тепер наступний - він повернеться до адреси після точки переходу.
Тож давайте переступимо через це, і ми повернемося до адреси,
після точки переходу.
Тепер він проштовхне цю нитку до стеку.
Тож стежте за стеком, коли я переступаю через нього.
Отже, рядок "Повернулися з кодової печери" вже знаходиться у стеку в готовності до виклику printf для використання.
Отже, давайте переступимо через виклик printf і подивимося на вивід.
І виводить "Back from code cave" з нового рядка.
Він переходить на новий рядок, тому що ззаду є невидимий символ нового рядка, який
змушує курсор переходити на новий рядок.
А далі він сам друкує новий рядок з нового рядка.
Ось як ми можемо реалізувати щось корисне за допомогою кодових печер.
Тож давайте збережемо це зараз. Файл, патч і файл патча, і назвемо
його 23- 23- код -hello.
exe. Натисни "Зберегти".
І я бачу.
На цьому відео все.
Дякуємо за перегляд.