Привіт і ласкаво просимо назад.
У цьому новому уроці ми розглянемо ще один приклад, де ми використовуємо Microsoft Windows API.
Цього разу ми напишемо програму, яка створить файл.
Отже, задача полягає в тому, щоб написати програму для отримання вхідного рядка від користувача, а потім зберегти його
у файл.
Таким чином, файл буде містити вхідний рядок, який введе користувач. Windows API, які будуть використовуватися:
GetStdHandle, ReadFile, WriteFile, CloseHandle та ExitProcess.
Давайте подивимося на код.
Так.
GetStdHandle ми вже бачили раніше.
У цьому випадку нам потрібно використати його для того, щоб отримати стандартний дескриптор пристрою введення.
Тож, як і раніше, ми натискаємо на від'ємну десятку.
Потім ми отримуємо дескриптор до пристрою введення, тобто клавіатури.
А потім ми зберігаємо його в комірці пам'яті.
Далі ми прочитаємо файл.
ReadFile тут для читання з клавіатури.
Тож, як завжди, в минулому ми також використовували це.
Ми задаємо параметри наступним чином.
Це щось нове.
CreateFile.
Документацію можна знайти на цьому веб-сайті.
Тож ви можете піти туди і подивитися на деталі.
Таким чином, параметри будуть просуватися у зворотному порядку знизу вгору.
Тож цей не використовується.
Тож ми ставимо нуль.
Атрибут файлу.
Ми ставимо нуль, тому що не хочемо змінювати його на прихований або зашифрований.
Отже, нуль - це код норми.
А 2 означає CREATE_ALWAYS.
Це означає, що якщо файл не існує, ви створюєте його.
Якщо він вже існує, ви перезаписуєте його.
Ми не використовуємо атрибути безпеки та режим спільного доступу, тому ставимо нуль для обох параметрів.
І для цього нам потрібно поставити GENERIC_WRITE.
Є й інші.
Ви також можете мати GENERIC_READ.
Але в цьому випадку ми хочемо записати у файл.
Тож ми поставили цей код.
Щоб отримати цей код, перейдіть за цим посиланням,
код можна побачити тут.
Ось такі параметри.
Отже, для бажаного доступу пояснення тут, а для GENERIC_READ - тут.
Отже, ось різні типи, які у вас є.
GENERIC_READ, GENERIC_WRITE, але нас цікавить GENERIC_WRITE.
У цьому випадку, якщо ви хочете дізнатися, який насправді код для цього використовується, вам потрібно перейти
за посиланням, де ви можете отримати значення маски доступу.
GENERIC_WRITE - це
значення тут, ось так.
Тож ви можете перейти за цим посиланням, щоб отримати свій код, це значення тут.
А наступним буде ім'я файлу.
Отже, це ім'я файлу, яке ви маєте вказати, щоб викликати цей CreateFile.
І ми повинні жорстко закодувати це всередині цього сегмента даних, що я покажу вам пізніше.
І, нарешті, ви викликаєте CreateFile.
Тепер зверніть увагу, що CreateFile має CreateFileA і CreateFileW.
CreateFileA для тих імен файлів, які не використовують Unicode.
Але для тих імен файлів, які записані в юнікоді, ви повинні поставити CreateFileW.
У нашому випадку ім'я файлу буде не в Юнікоді.
Він буде у форматі ASCII.
Тож ми просто створимо CreateFileA.
Наступна функція - WriteFile, посилання на неї тут.
І знову натискаємо знизу вгору, і ось тут ми записуємо файл на дескриптор, який отримали раніше.
Ручка пішла звідси.
Коли ви викликаєте цю функцію, вона повертає хендл в -, і ми зберігаємо його в цьому місці.
Отже, коли ви записуєте файл, ви також маєте отримати доступ до хендла файлу, який зберігається
тут.
Решта майже не відрізняється від інших ReadFile.
Тут байти, які потрібно записати, ви повинні отримати з байтів, які ви прочитали раніше.
Тут зберігається 0x405060.
Він прийшов звідси.
0x405060, тому ви також передаєте адресу, що містить кількість прочитаних байт.
Отже, у цьому випадку це буде рядок, і саме той рядок, який введе користувач.
Тут зберігається довжина рядка.
А потім вхідним рядком є цей рядок, який також отримано з ReadFile тут, вхідний
рядок.
У цьому місці зберігається вхідний рядок.
Отже, ви отримали доступ до рядка.
А потім ви викликаєте API WriteFile.
І, нарешті, потрібно закрити ручку, коли ви закінчите роботу з напилком.
А це дескриптор, який ви отримали з CreateFile тут.
Коли ви створюєте файл, ви зберігаєте хендл тут.
Отже, коли ви закриваєте файл, вам також потрібно закрити ручку.
Отже, це нові API, які ми зараз розглядаємо: CreateFile, WriteFile
і CloseHandle.
Останній - ExitProcess, який ми вже виконували раніше.
Тому я не буду в це вдаватися.
Отже, це теоретична частина.
А в наступному уроці ми розглянемо практичні приклади того, як це зробити в x64dbg.
Дякуємо за перегляд.