Що таке Зворотний інжиніринг? Інструменти, процеси та приклади

Реверс-інжиніринг – це процес розбирання програмного або апаратного елемента, щоб зрозуміти, як це працює або які конкретні елементи він має.

Зворотний інжиніринг: інструменти, процеси та приклади | Gridinsoft

Що таке зворотний інжиніринг?

October 06, 2023

Напевно, всі ми ламали іграшки у дитинстві, намагаючись зрозуміти, як вони працюють. Звичайно, коли ми стаємо старшими, це зникає. Але не завжди. Перше, що роблять військові, отримуючи зброю на полі бою – це розбирають її, аби побачити як працює ця штурмова гвинтівка і чи можна зробити її більш зручною. Так само й користувачі, які хочуть знати, як працює програма – щоправда, з іншим підходом.

Зворотний інжиніринг — це відновлення структури об’єкта, будь то програма чи її частина. Це робиться, коли первинний код програми втрачено або він недоступний для публіки. Реверс-інжиніринг програмного забезпечення - відновлення принципів/алгоритмів програми, задля того аби зрозуміти, як програма працює, і, можливо, відтворити цей механізм. У цих дій можуть бути наступні цілі:

  • Аналіз вірусів/троянів/іншого шкідливого ПЗ для створення протидії.
  • Пошук закритих вразливостей у ПЗ для подальшого створення вірусів або експлойтів.
  • Створення опису для форматів даних чи протоколів, використаних у програмі.
  • Аналіз драйверів з закритим первинним кодом для створення власних, з відкритим кодом.
  • Відновлення втраченої інформації.
  • Виявлення побічних ефектів.

Однак злом програмного забезпечення не слід плутати зі реверс-інжинірингом: хакерство можна визначити як такі дії, як повернення функцій відладки або тих модулів, які були вимкнені за замовчуванням через уразливості чи інші проблеми, а також розібрати принцип роботи перевірки ліцензії та вимкнути її. Реверсування, своєю чергою, є повним аналізом програми по цеглинках і аналізом її поведінки.

Як працює зворотний інжиніринг?

Загалом зворотній інжиніринг можна розділити на програмне та апаратне. Однак останнє нас не цікавить, оскільки ця стаття стосується лише реверс-інжинірингу програмного забезпечення. Наприклад, візьмемо програму, написану мовою C++ або Java, яку можуть зрозуміти інші програмісти. Але щоб запустити його на комп’ютері, його потрібно перевести іншою програмою, яка називається компілятор, у двійковий код. Зкомпільований код є незрозумілим для більшості програмістів, але є способи перетворити машинний код у більш зручний для людини формат, використовуючи програмний інструмент декомпілятора. Реверс-інжиніринг складається з кількох етапів:

  • Збір інформації. На цьому кроці збирається вся можлива інформація (тобто початкова проектна документація тощо) про програмне забезпечення.
  • Вивчення інформації. Інформація, зібрана на попередньому кроці, вивчається, щоб користувач ознайомився з системою.
  • Структуризація. Цей крок передбачає ідентифікацію структури програми у формі структурної діаграми, де кожен вузол відповідає певній процедурі.
  • Опис функціоналу. Цей крок обробляє деталі кожного модуля структури. Діаграми написані за допомогою структурованої мови, такої як таблиця рішень тощо.
  • Запис потоків даних. З інформації, отриманої на етапах 3 і 4, виводяться діаграми потоку даних, щоб показати потік даних між процесами.
  • Потік керування записом. Записується провідна структура програмного забезпечення високого рівня.
  • Попередній перегляд витягнутого проекту. Витягнутий проєктний документ перевіряється кілька разів, щоб забезпечити послідовність і правильність.
  • Створення документації. Нарешті, на цьому етапі вся документація, включаючи SRS, проєктну документацію, історію, перевірку тощо, записується для подальшого використання.

Інструменти реверс-інжинірингу

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

  • Дизассемблери (наприклад, IDA Pro). Дизассемблер аналізує програму для створення коду складання. Декомпілятори можуть перетворювати двійковий код у первинний код, хоча вони доступні не для всіх архітектур.
  • Дебагери. Реверсери використовують налагоджувачі для керування виконанням програми, щоб отримати уявлення про те, які дії вона виконує під час запуску. Вони також дозволяють інженеру контролювати певні аспекти програми під час її роботи, наприклад області пам’яті програми. Це дозволяє краще зрозуміти дії програми та їхній вплив на систему чи мережу.
  • Програми перегляду PE (CFF Explorer, PE Explorer). Наприклад, засоби перегляду PE (для формату Windows Portable Executable File) витягують важливу інформацію з виконуваних файлів, щоб забезпечити перегляд залежностей.
  • Аналізатори мережі. Аналізатори мережі показують інженеру, як програма спілкується з іншими машинами, зокрема які з’єднання створює програма та які дані намагається надіслати.

Додатки для зворотного інжинірингу:


  1. 1️⃣ IDA – це інтерактивний дизасемблер, який має вбудовану мову команд (IDC) і підтримує ряд форматів виконуваних файлів для різних процесорів і операційних систем.
  2. 2️⃣ CFF Explorer – це набір інструментів для редагування переносних виконуваних файлів (PE).
  3. 3️⃣ Detect It Easy - призначена для визначення типів файлів за допомогою аналізу їх бінарних підписів. Вона надає відкриту архітектуру для додавання власних алгоритмів визначення типу файлу, що робить її універсальним інструментом для ідентифікації різних форматів файлів."
  4. 4️⃣ ImHex — це шістнадцятковий редактор, який надає багатий набір функцій і засоби розробки для Windows.
  5. 5️⃣ Scylla можна використовувати для створення дампа запущеного процесу програми та відновлення таблиці імпорту PE. З його допомогою можна отримати відновлений PE-файл, який може запускатися операційною системою.
  6. 6️⃣ Relocation Section Editor – це програма, яка використовується для редагування таблиць переміщення в PE-файлах. Основне призначення цього інструменту — змінити таблицю переміщення у разі виправлення переміщуваних фрагментів коду. Але його часто використовують для видалення таблиці переміщення під час відновлення захищеного файлу.
  7. 7️⃣ dnSpy - інструмент зворотного інженерінгу для будь-яких бінарних файлів .NET що стосується аналізу коду (декомпілятор, відновлювач, редактор)

Проблеми реверс-інжинірингу шкідливих програм

У міру того, як зловмисне програмне забезпечення стає складнішим, зростає ймовірність того, що дизасемблер з певних причин не зможе виконати свою роботу, або декомпілятор створить заплутаний код. Таким чином, реверсувальникам потрібно більше часу, щоб зрозуміти дизассемблований або декомпільований код. Протягом цього часу зловмисне програмне забезпечення може завдати шкоди мережі. Через це більше уваги приділяється динамічному аналізу шкідливих програм. Динамічний аналіз зловмисного програмного забезпечення передбачає використання закритої системи (пісочниці) для запуску зловмисного програмного забезпечення в безпечному середовищі та спостереження за тим, що воно робить.

Однак, окрім переваг, використання пісочниці для динамічного аналізу також має проблеми. Наприклад, багато складних шкідливих програм використовують методи обходу та можуть виявити, що вони знаходяться в пісочниці. Після виявлення такого оточення зловмисне програмне забезпечення не показуватиме свою справжню натуру. Розширене зловмисне ПЗ має набір інструментів, які вони можуть використовувати, щоб обдурити пісочниці та уникнути виявлення: вони можуть призупинити свої зловмисні дії, діючи лише тоді, коли користувач активний, таким чином приховуючи шкідливий код там, де його не буде виявлено, разом із безліччю інших способів ухилення.

Це означає, що долучені у зворотному інжинірингу спеціалісти не можуть покладатися лише на динамічні методи. Але натомість, зворотне проєктування кожної нової загрози зловмисного програмного забезпечення є нереальним.

Як оптимізувати процес зворотного інжинірингу?

Використовуючи динамічний аналіз зловмисного програмного забезпечення там, де це можливо. Фахівці з кібербезпеки можуть швидше й ефективніше боротися зі зловмисним програмним забезпеченням, звільняючи свій час для складної роботи, як-от вивчення та розбір нових схем шифрування, протоколів зворотного зв’язку або роботи над атрибуцією. Чим досконаліше автоматизоване рішення, тим більша ймовірність, що реверсеру не доведеться повертатися до початкової (і трудомісткої) фази процесу. Останнє передбачає розпакування, деобфускацію та розуміння основної поведінки зловмисного програмного забезпечення.

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

Висновок

Зворотне проєктування має багато законних застосувань в ІТ. Це може бути юридичний або етичний підхід до вирішення проблем із сумісністю, відтворення застарілих компонентів, оцінка безпеки, покращення наявного продукту або його здешевлення. Задіяні кроки можуть бути складними та відрізнятися залежно від того, що саме переробляється. Наприклад, спеціалісти з контролю якості, які хочуть вирішити проблеми користувачів із програмними продуктами, можуть здійснити реверс-інжиніринг об'єкту постійних скарг, щоб знайти причину. Визначити основні причини проблем користувачів важко, але методи зворотного проєктування усувають деякі припущення.