Розшифровка обфускації Python: як хакери приховують шкідливий код

pic

Привіт, хакери,

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

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

Сьогодні я поясню, як здійснюється обфускація коду Python і надам поради, як зробити код важким для розуміння.

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

Що таке обфускація коду?

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

Навіщо обфускувати код Python?

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

Перейдемо до технік.

pic

Поширені техніки обфускації коду Python

1. Перейменування змінних

Хакери перейменовують змінні та функції на беззмістовні, випадкові назви, щоб заплутати будь-кого, хто аналізує код. Наприклад, змінну usercredentials_ можна перейменувати на щось на зразок v1a або xq3.

Цей метод полягає в зміні імен змінних і функцій на беззмістовні або випадкові рядки, наприклад a, b, c, або x1, x2, x3. Це може ускладнити розуміння призначення або ролі кожної змінної чи функції в коді. Однак цей метод не впливає на структуру або логіку вашого коду і може бути легко відновлений за допомогою таких інструментів, як декомпілятори або дебагери.

Один з інструментів, який допоможе вам перейменувати змінні та функції — це Pyminifier, Python-скрипт, який може мінімізувати та обфускувати код Python.

Щоб використовувати Pyminifier, потрібно встановити його за допомогою pip install pyminifier, а потім запустити команду pyminifier -O.

Опція -O активує режим обфускації, який перейменує всі змінні та функції в коді. Ви також можете використовувати інші опції, такі як -R для заміни літералів і виразів, -S для видалення docstring-ів або -M для створення однобічного варіанту коду.

Повний список опцій можна переглянути за допомогою pyminifier — help.

Приклад: у вас є простий Python-скрипт Demo.py

# Demo.py  
def user_name(name):  
 """Виводить привітальне повідомлення для заданого імені."""  
 print(f"Hello, {user_name}!")  

name = input("Enter your name: ")  
user_name(name)

Обфускований код:

# Створено за допомогою pyminifier (https://github.com/liftoff/pyminifier)  
def a(b):  
 print(f"Hello, {b}!")  
c=input("Enter your name: ")  
a(c)

2. Видалення коментарів

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

Приклад: у вас є простий Python-скрипт Demo.py

# Demo.py  
def user_name(name):  
 """Виводить привітальне повідомлення для заданого імені."""  
 print(f"Hello, {user_name}!")  
name = input("Enter your name: ")  
user_name(name)

Обфускований код:

def a(b):  
 print(f"Hello, {b}!")  
c=input("Enter your name: ")  
a(c)

3. Шифрування рядків

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

4. Замінювання літералів та виразів

Цей метод передбачає заміну будь-яких літералів (таких як числа, рядки або булеві значення) або виразів (таких як арифметичні, логічні або побітові операції) на еквівалентні, але більш складні чи непрозорі.

pic

Інструмент PyFuscate

Наприклад, ви можете замінити 1 на True, 0 на False, 2 на 1+1, або a+b на a.add(b). Це може ускладнити розуміння значення або результату кожного літерала чи виразу в вашому коді.

Один з інструментів, який допоможе вам замінити літерали та вирази — це Pyfuscate, Python-скрипт, який може обфускувати код Python. Щоб використовувати Pyfuscate, вам потрібно завантажити його і запустити команду python pyfuscate.py.

Pyfuscate замінить всі літерали та вирази у вашому коді на еквівалентні, але більш складні, а також перейменує всі змінні та функції на випадкові рядки.

Ви також можете використовувати інші опції, такі як -c для стиснення коду, -d для видалення docstring-ів, або -s для перемішування порядку коду. Повний список опцій можна переглянути за допомогою python pyfuscate.py — help.

Приклад: у вас є простий Python-скрипт calc.py

# calc.py  
import math  

def area(radius):  
 """Повертає площу кола з заданим радіусом."""  
 return math.pi * radius ** 2  

radius = float(input("Enter the radius: "))  
print(f"The area is {area(radius):.2f}")

Обфускований код:

# Створено за допомогою pyfuscate (https://github.com/brandon-rhodes/pyfuscate)  
import math  
def a(b):  
 return math.pi.__mul__(b.__pow__(True.__add__(True)))  
c=float(input("Enter the radius: "))  
print(f"The area is {a(c):.2f}")

5. Використання Oxyry Python Obfuscator

Oxyry Python Obfuscator — це простий веб-інструмент, який ви можете використовувати для обфускації коду Python. Просто скопіюйте та вставте ваш код, і він створить обфускований варіант.

Цей інструмент перейменує імена символів, змінних, функцій, класів, аргументів тощо. Уникайте 1:1 мапування зрозумілих імен на обфусковані. Видаляються всі коментарі та документаційні рядки.

Як видно, цей інструмент не обфускує значення рядків, і функції, що звертаються до простору імен під час виконання (exec, dir, locals, globals), можуть зіткнутися з проблемами, оскільки вони намагатимуться звертатися до перейменованих об'єктів. Це не робить увесь код незрозумілим, але значно знижує його читаємість.

pic

Інструмент Oxyry Python Obfuscator

Приклад: звичайний скрипт calc.py

# calc.py  
import math  

def area(radius):  
 """Повертає площу кола з заданим радіусом."""  
 return math.pi * radius ** 2  

radius = float(input("Enter the radius: "))  
print(f"The area is {area(radius):.2f}")

Обфускований код:

import math #line:2  
def area (O0O00OO0O0O0OOO00 ):#line:4  
 ""#line:5  
 return math .pi *O0O00OO0O0O0OOO00 **2 #line:6  
radius =float (input ("Enter the radius: "))#line:8  
print (f"The area is {area(radius):.2f}")

**6.

Використання PYOBFUSCATE**

Pyobfuscate — це Python-скрипт, який може обфускувати Python-код. Він ускладнює читання вихідного коду для людей, при цьому код залишається виконуваним для інтерпретатора Python.

Ви можете використовувати його онлайн-сайт для обфускації.

Щоб використовувати Pyobfuscate, вам потрібно завантажити його, а потім запустити команду python pyobfuscate.py. Pyobfuscate видалить всі коментарі та docstring-и у вашому коді, а також перейменує всі змінні та функції на випадкові рядки.

Ви також можете використовувати інші опції, такі як -i для зміщення коду, -l для обмеження довжини імен, або -s для перемішування порядку коду. Повний список опцій можна переглянути за допомогою python pyobfuscate.py — help.

pic

Інструмент Pyobfuscate

6. Використання PyArmor (Рекомендується)

PyArmor — це повнофункціональний інструмент для обфускації Python, який працює через CLI. Те, що відрізняє його від інших варіантів, — це підтримка обфускації як на рівні файлів, так і на рівні пакетів.

Цей інструмент пропонує два незворотні режими обфускації:

  • Режим RFT — цей режим перейменовує функції, методи, класи, змінні та аргументи.
  • Режим BCC — цей режим перетворює деякі функції Python у функції C і компілює їх у машинні інструкції.

pic

PyArmor — це інструмент, який може зашифрувати байт-код Python, а також додати шар ліцензійного контролю для обмеження використання коду. Він також може створювати виконувані файли або обфусковані пакети з зашифрованого коду.

Щоб використовувати PyArmor, вам потрібно встановити його за допомогою pip install pyarmor, а потім запустити команду pyarmor obfuscate.

Команда obfuscate зашифрує байт-код вашого коду та створить папку dist, яка міститиме обфускований код, а також папку pytransform, яка міститиме ключ дешифрування та функції.

Ви також можете використовувати інші команди, такі як pack для створення виконуваних файлів, build для створення обфускованих пакетів або licenses для керування ліцензіями.

Ви можете переглянути повний список команд та опцій за допомогою pyarmor — help.

Швидкий старт з pyarmor наведений нижче:

pic

Приклад: Python-скрипт до обфускації

# calc.py  
import math  

def area(radius):  
 """Повертає площу кола з вказаним радіусом."""  
 return math.pi * radius ** 2  

radius = float(input("Введіть радіус: "))  
print(f"Площа дорівнює {area(radius):.2f}")

Якщо ви запустите pyarmor obfuscate calc.py, ви отримаєте наступний результат:

INFO PyArmor Version 7.0.2  
INFO Цільові платформи: Native  
INFO Шлях до джерела: "/home/user/calc.py"  
INFO Вхідні скрипти: ['calc.py']  
INFO Використано кешовану капсулу /home/user/.pyarmor/.pyarmor_capsule.zip  
INFO Пошук бібліотеки для платформи: linux.x86_64.11.py39  
INFO Знайдена доступна бібліотека /home/user/.pyarmor/platforms/linux/x86_64/11/py39/pytransform.so  
INFO Копіювання /home/user/.pyarmor/platforms до /home/user/dist   
INFO Патчинг бібліотеки /home/user/dist/pytransform.so   
INFO Патчинг бібліотеки пройшов успішно   
INFO Обфускація скриптів у режимі advanced   
INFO Обфусковано 1 скрипт успішно

Обфускований код:

# -*- coding: utf-8 -*-  
from pytransform import pyarmor_runtime  
pyarmor_runtime()  
__pyarmor__(__name__, __file__, b'\x07\x02\x0c\x0b\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x
Щоб запустити обфускований код, потрібно виконати файл `calc.py` в папці `dist`, що завантажить зашифрований байткод і розшифрує його за допомогою модуля `pytransform`. Функціональність і результат програми залишаються незмінними.

## Підсумок

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

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

Кожен метод і інструмент має свої особливості, переваги та обмеження, тому потрібно обирати той, що найкраще відповідає вашим потребам і вподобанням. Обфускація Python-коду вимагає ретельного планування і тестування, оскільки вона може впливати на функціональність, продуктивність і сумісність вашого коду. Також важливо дотримуватись кращих практик і порад, таких як використання послідовної стратегії обфускації, документування коду, створення резервних копій оригінального коду та перевірка обфускованого коду.

Залишайтесь допитливими, будьте пильними та продовжуйте досліджувати безмежні можливості етичного хакінгу.

До наступних зустрічей,

Щасливого хакінгу! ! 😊



Перекладено з: [Decoding Python Obfuscation: How Hackers Hide Malicious Code](https://medium.com/@nroshan005/decoding-python-obfuscation-how-hackers-hide-malicious-code-76bd69835072)

Leave a Reply

Your email address will not be published. Required fields are marked *