Привіт і ласкаво просимо назад.
Тепер ми спробуємо це зробити у x64dbg.
І я вже закодував це і назвав 78-create-file. exe.
І перша частина - це виклик функції GetStdHandle, щоб отримати дескриптор файлу на вході
клавіатури.
Отже, ми ставимо мінус десять.
Ми натискаємо від'ємну десятку, щоб отримати стандартний пристрій введення.
А потім ви викликаєте GetStdHandle.
Тоді хендл буде повернуто в - register.
А потім ми зберігаємо його в цю комірку пам'яті.
Ця ділянка пам'яті знаходиться у сегменті BSS, оскільки вона є змінною.
Тож перейдіть до Карти пам'яті та двічі клацніть на BSS.
А 0x405040 - ось тут.
Тому я ставлю тут точку зупинки і біжу.
А потім ми переступаємо.
Потім викликаємо GetStdHandle і отримуємо результат.
Вставляємо ручку клавіатури - реєструємо.
Потім ми збережемо його тут, у цьому BSS-сегменті сервера пам'яті.
А тут у нас B8.
Наступна частина - зчитування вхідних даних від користувача.
Тому ми використовуємо ReadFile API.
І ми проштовхуємо параметри для цього API у зворотному порядку.
Отже, параметри наступні, як ми вже обговорювали раніше.
Тож просто переступайте через них одну за одною.
0x405060 знаходиться тут.
А це - кількість прочитаних байт.
А потім ми натискаємо 0x20, тобто гекс 20.
А в десятковій системі числення це 32.
Це означає, що максимальна довжина вхідного рядка - 32 байти, 32 байти завдовжки.
Виштовхуємо його до стеку, а потім виштовхуємо 0x405070, який є вашим вхідним рядком.
Отже, це буде місце, де буде зберігатися вхідний рядок.
Тому спочатку потрібно все це спланувати.
Коли ви пишете свій код, куди ви збираєтеся, яку адресу пам'яті ви збираєтеся використовувати
для яких параметрів.
Тож зараз я збираюся переступити через це.
А тепер ми натиснемо 0x405040, і 0x405040 - це дескриптор
клавіатурного вводу, який ви зберегли тут раніше, B8.
Тож переступайте, і вона опиниться у стосі.
Тепер Б8.
А тепер ми викличемо ReadFile, ReadFile API.
Як я вже говорив раніше, ви можете отримати всі ці адреси, перейшовши до Символів,
натиснувши на Kernel32, і просто знайти API.
ReadFile.
Отже, ви копіюєте цю адресу і вставляєте її сюди.
Коли ви збираєте, ви просто вставляєте в основному сюди, цю адресу сюди.
І ось як я отримав це.
Тож тепер ви можете назвати це так.
І коли я дзвоню на нього, він потрапляє на термінал.
Відійди.
І зараз він у стані запуску.
Отже, нам потрібно підійти до терміналу і ввести наш рядок.
Тож це наш термінал.
Клацніть всередині нього і введіть рядок введення, щоб ми могли назвати його, скажімо, "Hello World. Отже, "Hello World" має 11 символів, але коли ви натиснете клавішу Enter,
вона вставить повернення каретки і переведення рядка, що і є
клавішею Enter.
Таким чином, всього буде 13 символів.
Тож тепер я натискаю Enter.
Як тільки я натискаю Enter, керування повертається до відладчика.
Як ви можете бачити у відладчику тут, зараз він перебуває у стані паузи, чекаючи, поки ви переступите через нього.
Наступний виклик - це виклик API CreateFile.
Отже, параметри API CreateFile
наступні.
Отже, саме тут ми збережемо вхідний рядок, який ми щойно ввели, у файл.
Отже, давайте виштовхнемо всі параметри до стеку.
А тепер це ім'я рядка, 0x403050, "newfile. Тож цей - у сегменті передачі
даних.
Тож перейдіть на Карту пам'яті.
Натисніть на дані.
Дані є константами, на відміну від BSS.
Пам'ятайте, що BSS - це змінні, неініціалізовані дані, а сегмент даних - це ініціалізовані дані.
Наприклад, у вас є фіксоване число або фіксований рядок.
Ви повинні покласти його сюди.
Тож давайте двічі клацнемо там зараз і перейдемо туди.
І ви можете бачити тут, я вже закодував це.
Як я це робив, звичайно ж, спочатку потрібно було все це вибрати.
Клацніть правою кнопкою миші і виберіть "Двійкове редагування".
Потім ви вводите тут свій рядок - ім'я файлу, який ви хочете використовувати.
Тому я називаю це ньюфайлом. txt.
Отже, повертаючись до нашого коду, цей параметр просто виштовхує адресу, що містить рядок, ім'я нового файлу, який
ви хочете створити.
Це перший параметр, ім'я файлу, який знаходиться ось тут, ім'я файлу, в сегменті даних.
Тож зараз ми збираємося переступити через це.
І тепер адреса імені файлу знаходиться у стеку.
Тепер ми викличемо CreateFileA.
А потім, як завжди, CreateFileA отримується з Symbols.
Тут ви переходите до Kernel32 і просто шукаєте CreateFileA.
І просто скопіюйте цю адресу сюди.
Скопіюй цю адресу.
CreateFileA, а потім поверніться сюди.
Натисніть пробіл, а потім вставте сюди адресу CreateFile.
Ось так у мене з'явилося це.
Тепер ми викличемо CreateFileA.
Ми переступаємо через нього, і тут буде записано дескриптор, дескриптор нового файлу, який ви створюєте.
Тепер ручка тут, як ви можете бачити.
0x100.
Потім ви повинні десь зберегти його, тому що пізніше нам потрібно буде його використати.
І коли ми викликаємо API WriteFile, ми зберігаємо його тут, у сегменті BSS.
BSS, сегмент
BSS.
Якщо повернутися до Карти пам'яті.
BSS.
Отже, він буде збережений у сегменті BSS за цією адресою, 0x405080, яка знаходиться ось тут.
Не використовуйте цю адресу, оскільки ваш "Hello World" може займати максимум 32 байти.
Отже, вам потрібно кілька додаткових місць в пам'яті.
Тому вам не варто ставити тут хештег вашого файлу.
Тому я пропустив два рядки.
І я ходжу сюди, використовую цю локацію.
Тож я збираюся переступити через це зараз.
Він скопіює хендл файлу і збереже його в цьому місці.
Відійди.
І тепер хендл файлу зберігається у цьому місці, 0x100.
Пам'ятайте, що ми знаходимося в процесорах Intel, які використовують малоендіанську систему числення.
Отже, 0x100 зберігається у зворотному порядку, 0x100 ось так.
Тож зараз у нас закінчується місце.
Тож нам потрібно перейти до нашої кодової печери, щоб продовжити роботу з іншими API.
Тож я збираюся перейти до печери коду.
Отже, в печері коду ми викличемо функцію WriteFile.
А перед цим нам потрібно задати параметри для цієї функції.
Отже, давайте розглянемо WriteFile.
Отже, це ті параметри, які ми обговорювали раніше.
Отже, тепер ми збираємося виштовхнути все це до стеку в готовності до WriteFile.
Тож давайте переступимо через це.
Отже, ми натискаємо 0x4050B0, тобто записані байти.
Це означає байти, які насправді будуть записані.
Відійди.
А тепер натискаємо 0x405060.
Це ваші байти, прочитані з ReadFile.
Отже, це кількість байт, яку ви прочитали, а саме "Hello World", довжиною 13 символів, яку було отримано
раніше.
Коли ми викликаємо ReadFile, ми зберігаємо
тут кількість байт.
"Hello World" - це 13 символів.
Тепер нам потрібно прочитати його з цієї адреси.
Саме тому ми відкриваємо доступ до неї тут.
Тож ми штовхаємо його до стопки.
Тепер потрібно натиснути на сам рядок, який зберігається у файлі 0x405070.
Відійди.
Покладіть його в стопку.
І ще раз нагадую, що цей 0x405070 - це адреса, за якою було збережено рядок, коли ми раніше викликали ReadFile.
Ми зберігаємо його тут.
Ми зберігаємо "Hello World" в цьому місці.
Отже, тепер WriteFile має отримати доступ до нього.
Ось чому ми передаємо його як параметр.
Далі ми переступимо через це.
А наступним ми назвемо наш наступний,
ми просто переступимо через це, 0x405080.
А це хендл вихідного файлу.
І цей хендл вихідного файлу прийшов з CreateFile.
Пам'ятайте, що команда CreateFile
зберегла його тут.
CreateFile зберегла
хендл до нового файлу, яким є newfile. txt, newfile. txt.
Тож ручка до нього зберігається тут.
Ось чому нам потрібно зберегти його, тому що зараз ми отримуємо доступ до нього всередині WriteFile ось тут.
Отже, ми виштовхуємо його до стеку, щоб WriteFile міг його використати.
Нарешті, ми викличемо WriteFile.
Тому ми викликаємо WriteFile.
Буде створено новий файл. txt.
Давайте поїдемо на місце розташування цієї програми і перевіримо її.
Це тека, в якій знаходиться newfile. txt створено.
Тепер, коли ви викликаєте WriteFile, він запише "Hello World" у цей файл.
Тож я збираюся переступити через це зараз.
А потім він записав у цей файл "Hello World".
Тепер закриваємо ручку.
Отже, ми передаємо дескриптор як параметр, виштовхуючи його до стеку, щоб CloseHandle міг закрити цей
дескриптор.
Отже, це дескриптор файлу.
Тож ми переступаємо через нього.
Закриваємо ручку.
Далі ми виходимо з процесу.
Отже, ми заносимо в стек нуль, що означає відсутність помилки.
А потім викликаємо ExitProcess, і програма завершить роботу.
Тепер ми переходимо до нашого нового файлу і відкриваємо його.
І ми бачимо там "Hello World".
Таким чином, за допомогою x64dbg ви можете реалізувати Win32 API, CreateFile, WriteFile і так далі.
Це все для цього відео.
Дякуємо за перегляд.