Привіт і ласкаво просимо назад.
У цьому новому уроці ми дізнаємося про печери коду.
Тож ми дізнаємося про те, що це таке і як ними користуватися.
Що таке кодова печера?
Кодова печера - це порожня область пам'яті в текстовому сегменті.
Текстовий сегмент є виконуваною областю пам'яті.
Тому будь-який код, введений тут, виконається.
Але навіщо нам щось впорскувати в текстовий сегмент?
Щоб відповісти на це питання, давайте розглянемо приклад виконуваної програми.
x64dbg, а потім відкрийте шаблонний.
Отже, зараз ми знаходимося в текстовому сегменті, тому що все це - інструкції.
Отже, все, що ви напишете тут, буде виконуваним.
Ви можете переконатися в цьому, подивившись на карту пам'яті.
Це так званий текстовий сегмент.
Отже, все, що знаходиться всередині, є виконуваним кодом.
Як ви можете бачити, під цією колонкою написано ER, що означає виконуваний і читабельний.
Отже, це область пам'яті від 00401000 до 00403000.
Отже, починаючи з 401000 і далі до цієї адреси, весь виконуваний код.
І ця область пам'яті - 401530.
Тож це потрапляє в цю область пам'яті, ось тут, між цим і цим.
Іноді, коли ви пишете код, ви можете використати весь доступний простір, і тоді вам не вистачить пам'яті для
написання нового коду.
Що ж тоді робити?
Рішення - шукати інший чистий, порожній простір.
Тож цей пустий, порожній простір називається кодовою печерою.
Щоб знайти ці порожні пробіли, прокрутіть сторінку до самого низу текстової області пам'яті.
І незабаром ви побачите порожні місця, куди можна вставити додатковий код.
Продовжуйте прокручувати.
І з цього моменту ви побачите всі ці нулі.
Це все нульові байти.
Отже, все це доступно для введення коду.
Це називається печера коду.
Просто ігноруйте цю колонку.
Це відладчик намагається розібратися з нульовими байтами.
При цьому він помилково інтерпретує нульові байти як інструкцію.
Але це все непотрібні інструкції, які насправді є нульовими байтами.
Дуже важливо: якщо ви бачите щось подібне, нулі, у вас є нульові байти - один байт, два байти, три байти, чотири
байти, п'ять байт, шість байт і так далі.
Отже, все це доступно для введення вашого коду.
Якщо вам не вистачає пам'яті,
ви можете зайти в печеру коду тут і додати додатковий код.
Це ще один слайд, який показує, де ви можете знайти свою кодову печеру.
Отже, все, що вам потрібно зробити, це прокрутити вниз, і коли ви побачите всі ці нульові байти, ця область і далі є кодовими печерами.
Так навіщо використовувати кодову печеру?
Ми використовуємо кодову печеру, коли нам не вистачає місця для написання коду.
Ось як ви використовуєте кодову печеру.
Це область пам'яті, в якій у вас закінчилося місце.
Тому, щоб продовжити вставку коду, вам потрібно перейти.
Тут ви вставляєте інструкцію переходу, щоб перейти до печери коду.
А потім у печері коду ви можете продовжувати писати будь-які інструкції, які вам заманеться.
А потім, коли ви закінчите, вам потрібно вставити іншу інструкцію для зворотного переходу - переходу назад після точки
переходу.
Тож це і є той стрибок, з якого ви прийшли. Коли ви переходите назад,
вам потрібно перейти на інструкцію, за адресою після точки переходу, щоб програма могла продовжити виконання
інструкцій
тут.
Це концепція кодової печери.
Отже, якщо ви повернетесь до нашої програми, то це печера коду.
Звідси починається печера.
Ставимо тут крапку.
Брейк-поінт.
Поставте брейк-поінт тут.
Повернімося до -.
Отже, припустимо, ми напишемо наші інструкції тут.
Ми вставляємо сюди весь наш оригінальний код, а потім, нарешті, виявляємо, що місця більше немає.
Але ми все ще хочемо писати код.
То що ж нам робити?
Ми можемо поставити стрибок тут.
Перейдіть за адресою кодової печери.
Отже, адреса кодової печери - ви можете зайти в Breakpoint і подивитися її тут.
Натисни на це.
Адреса печери:
402701.
Потім ви можете вставити свій код сюди,
додатковий код.
Продовжуйте робити все, що хочете.
А коли ви закінчите, ви можете додати іншу інструкцію, щоб стрибнути назад.
Поверніться до точки стрибка.
Отже, це ваша точка переходу.
Це має бути десь тут,
тому після точки переходу поверніться до адреси і продовжуйте виконувати інструкції.
Ось як працюють кодові печери.
Однак є одна річ, яку слід зазначити.
Порожні нульові байти, які ви бачите тут - ви можете прокручувати і прокручувати, і вам здасться, що їх дуже багато,
але це може ввести в оману.
Давайте повернемося до цього.
Звідси видно, що шлях до дна довгий.
Це багато.
Так, але не все це можна використовувати.
Фактична кількість доступних для використання нульових байтів не така вже й довга.
Хоча тут ви можете продовжувати прокручувати до самого низу, і ви побачите,
що їх дуже багато - тут є величезна печера коду,
яку ви можете використовувати, але не обов'язково. Чому це так?
Тому що коли файл завантажується в пам'ять, операційна система виділяє додаткову пам'ять для того, щоб вирівняти
сегменти, щоб він вкладався в певний розмір байт.
Тож це розширює його.
Отже, розширення, розширена область пам'яті, ви побачите, що вона буде набагато більшою, ніж початковий необроблений
розмір файлу у файлі.
Отже, ця додаткова пам'ять, яку ви бачите тут, називається віртуальною пам'яттю.
Таким чином, віртуальна пам'ять завжди більша за сиру пам'ять або файлову пам'ять.
Фактичний розмір необробленого файлу менший за розмір віртуальної пам'яті.
Тож як ми дізнаємося, скільки з цього можна використати?
Для цього
потрібно мати дві програми.
Дозвольте мені показати вам.
Ви можете використовувати PE Bear.
Тож ви можете встановити його з файлу, який я надаю вам у розділі ресурсів.
Просто завантажте та встановіть його.
Отже, Ведмедик PE, натисніть на Завантажити PE і відкрийте свій шаблон.
А ось тут шукайте "Заголовки розділів", а текст ви можете побачити тут.
А далі йде сегмент даних.
А зміщення сегмента даних дорівнює 1С00.
Тож давайте подивимося, наскільки він великий?
Ми можемо скористатися іншою програмою, яка називається HxD.
Отже, HxD тут.
Її також можна встановити - ви можете завантажити з розділу ресурсів.
Я надав вам файл.
Тому використовуйте 32-бітну версію, оскільки ми будемо перевіряти 32-бітну програму.
Отже, у HxD відкрийте файл вашого проекту.
Відкрийте свій шаблон.
А потім прокрутіть вниз до цього зміщення 1С00.
Тож прокрутіть вниз до 1С00.
Це все взаємозаліки.
Зміщення від початку файлу.
Початок файлу - нуль нуль.
Коли ви спускаєтеся вниз, ви продовжуєте додавати зміщення за зміщенням від початку файлу.
Тому зараз ми шукаємо 1С, 1С00.
Я просто прокручу вниз.
1С00 слухає.
Це 1С00.
Отже, ваша печера з кодом має лише такий розмір.
Перший байт 1B00.
Останній байт - цей.
Цей - 1BFF.
Скільки це байт?
Ви можете взяти 1BFF мінус 1B00. Чому 1B00? Тому що вище 1B00 знаходяться всі додаткові, всі існуючі
інструкції.
Все це - існуючі інструкції.
Ти не можеш ними користуватися.
FF, FF, FF, FF, FF, FF,
FF, FF - це всі програми, що існують у текстовій секції.
Отже, єдина печера коду, яку ви можете використовувати - це від 1B00 до 1BFF.
Тож наскільки вона велика?
Це найкращі друзі.
Ми повинні взяти 1BFF мінус 1B00.
Тоді ви точно знаєте, скільки байт доступно для вставки вашого коду.
Гаразд.
Тож увімкніть свій калькулятор програміста.
Натисніть на Hex і ви візьмете 1BFF, який знаходиться прямо тут, 1BFF.
1B FF,
а потім ви мінусуєте цей байт тут, 1B00, 1B00, дорівнює, і ви маєте FF байт.
Отже, байт FF дорівнює 256 - як ви можете бачити тут, 255.
Отже, у вас є близько 255 байт, які ви можете використати для вставки коду.
Отже, якщо співвіднести це з x64dbg, це означає, що ця область має розмір 1B, 1B00.
Тепер тут ви не бачите 1B00, тому що 1B00 було додано до точки входу.
Початковий внесок - 401000 з чимось.
Отже, коли ви додасте 1B00, то отримаєте 402701.
Але ви можете переглянути інструкцію тут.
FF, FF, FF, FF, FF,
FF, FF, FF, праворуч, що відповідає тут.
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF.
Ось такі інструкції.
Так?
Шаблон - дивіться всі ці шаблони
тут, ви можете бачити тут, це означає, що ваша вільна область пам'яті,
ваша печера коду, знаходиться тут, починаючи з цього місця, і ви відраховуєте 255 байт.
Тож якщо ви порахуєте їх, то побачите, що вони не доходять до самого
низу.
Він займає лише невелику ділянку пам'яті.
Ось чому ви повинні бути обережними.
Хоча ви бачите, що кількість байт тут набагато більша, ніж 255.
Один, два, три, чотири, п'ять, шість, сім, вісім, дев'ять,
десять і так далі - набагато більше.
Якщо прокрутити донизу, він набагато більший.
Ви можете взяти 402FFF.
Спробуймо зараз.
402 FFF
мінус.
А потім ви прокручуєте назад до початку печери коду.
Просто прокрутіть назад.
Гаразд.
Мінус 402701.
Отже, ви віднімаєте 402701 і отримуєте 8FE. 8FE має розмір 2302 байти.
Тож це оманливе твердження.
Насправді, доступно лише 255 байт.
Так що будьте обережні.
Отже, це віртуальна пам'ять.
Це сира пам'ять, файлова
пам'ять.
Гаразд.
Коли ви вставляєте інструкції в програму, вам потрібно їх виправляти.
Отже, коли ви їх виправляєте, він повинен записати їх у файл.
Отже, коли ви записуєте у файл, віртуальна пам'ять, яка тут така велика, 2302 байти, згортається
до 255 байт, тобто до початкового розміру файлу, і зберігає його там, у файлі.
Отже, якщо ви напишете тут інструкції, які використовують більше 255 байт, то частина, що перевищує
255, буде видалена, оскільки у файлі не буде місця для її розміщення.
У самому файлі це лише 255 байт, тому будьте обережні.
Отже, вам потрібно використовувати
це: PE Bear і hex-редактор, щоб обчислити фактичний розмір сирого файлу, який ви можете вставити в кодову печеру.
Ви не можете покладатися на віртуальну пам'ять, яка є величезною.
Сподіваюся, це допоможе.
Отже, в наступному відео я покажу вам практичну роботу, щоб показати деякі інструкції,
які ми введемо в печеру коду.
Тож дякуємо за перегляд.
Побачимося.