top of page
  • ISSP

Frida: основні переваги та приклади практичного застосування

Frida - це потужний інструмент з відкритим кодом, який дає можливість користувачам змінювати та вставляти код у запущені програми для аналізу їхньої поведінки. Може використовуватися для тестування безпеки, дослідження додатків, зворотного інжинірингу тощо.


Він дозволяє здійснювати інтерактивну роботу зі скомпільованими програмами на рівні виконання. Тобто дає зрозуміти, як працюють програми і як можна змінити їх поведінку.


За допомогою Frida можна:

• змінити поведінку програми «на льоту»

• отримати доступу до даних, що оброблюються програмою

• перехопити та модифікувати мережевий трафік

• вивчити системні виклики та взаємодії з ОС


Frida: принцип роботи

Давайте ознайомимося із загальною структурою.

Що ми бачимо на цій схемі?

• frida-agent - це навантаження, яке завантажується в досліджуваний додаток.

• frida-gum - це основний модуль, де знаходиться вся реалізація js по роботі з пам’яттю.


Frida має доволі обширний функціонал. Її основні модулі:

1) Interceptor – модуль, який відповідає за перехоплення викликів

2) Stalker - внутрішній “трейсер”

3) Кросс- платформний модуль моніторингу процесів/потоків, сканування пам’яті.

4) Модуль генерації коду (*Writer, наприклад, X86Writer, ArmWriter)

5) Модуль релокації коду (*Relocator, наприклад, X86Relocator, Arm64Relocator)

6) Heap профайлер і контролер


Frida-agent дає певний інтерфейс, до якого зазвичай звертається основний модуль frida-core, але можна використовувати і написані власноруч скрипти, наприклад, за допомогою python-у.


Frida: приклад практичного застосування

Давайте спробуємо використати Frida для простої задачі - перехопимо виклик messagebox в доволі відомому Fant0m crackme #1 (завантажити їх можна наприклад з цього репозиторію https://github.com/unc1e/Fant0m-crackme).


Почнемо з установки інструменту. Найпростіше - це встановити python + pip і далі інсталювати pip install frida.


Наступний крок – визначитися із шаблоном, на основі якого буде зручно експериментувати:

І в перший аргумент при запуску – вставляємо ім’я крекмісу (який повинен бути поруч).


python test.py CRACKME1.EXE


Який подальший алгоритм дій? Завантажуємо код скрипта з текстового файлу script.js, запускаємо процесс (за замовчуванням процесс буде замороженим), завантажуємо скрипт в імплант (який автоматично завантажується в процесс), розморожуємо процес та чекаємо. Далі всі наші дії будуть над script.js.


Для початку спробуємо виконати просту задачу - змінимо текст, що виводить крекмі при появі будь-якого MessageBox.


Зафіксуємо що у нас є:

Для цього ознайомимося із документацією за цим лінком: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox


Ми бачимо 4 аргумента: hWnd, lpText, lpCaption, uType. Дана функція знаходиться в бібліотеці user32.dll та має дві реалізації - MessageBoxA та MessageBoxW ( нас цікавить саме перший варіант).


Отже, давайте спочатку знайдемо функцію:


Module.findExportByName(«user32.dll», «MessageBoxA»)


На виході ми отримаємо адресу функції. Тепер за допомогою модулю Interceptor – поставимо hook на виклик ціїє функції:


Interceptor.attach(Module.findExportByName("user32.dll", "MessageBoxA"), {

onEnter: function(args)

{

//тут буде код який використовується при спрацюванні функції

}

});


Спробуємо залогувати сам факт виклику та вивести текст, що використовується в повідомленні, на консоль:


console.log(“Execute MessageBoxA”)):

console.log(args[1].readUtf8String());

Все відбувається дуже просто. Не треба ніяких розрахунків довжини інструкцій або ж їх переносу в інші блоки пам’яті для установки перехвату. Це все frida робить за нас і це її найбільший плюс – максимально швидкий шлях від початку до результату.


Давайте тоді спробуємо переписати текст:


var message = Memory.allocUtf8String("It`s work");

args[1] = message; //Відлік аргументів починається з нуля, тому args[1]

Все працює! Але є один каверзний момент. Якщо алокувати память для строки саме в середині функції onEnter, то будуть з’являтися постійні помилки/невірний текст. Чому? Збірник сміття js-а буде звільняти пам’ять після виходу з onEnter. Щоб виправити цю помилку, потрібно просто винести алок пам'яті з межі функції onEnter.


Інструмент Frida може застосовувати і в більш складних ситуаціях, наприклад, коли необхідно здійснити модифікацію оригінальних образів бінарників, прибрати ssl pinning чи почитати напряму шифрований трафік. Можна його і використовувати як фреймворк в malware-аналізі.


Додаткові матеріали для практики можна знайти ось тут https://github.com/bilka00/frida_series_of_notes


Хочете дізнатися більше про ефективні інструменти reverse engineering? Ознайомтеся з нашою статтею Reverse Engineering with Ghidra.


Якщо у вас виникли питання, або ж ви хотіли б отримати консультацію експертів ISSP, будь ласка, напишіть нам на info@issp.com

bottom of page