Кроме описанных в статье «Библиотеки для обфускации Python» инструментов, я нашел еще один способ обфускации Python с использованием Cython, который оказался очень полезным и сложным в плане реверс-инжиниринга. Давайте рассмотрим использование Cython.
Еще по теме: Обфускация Python используя Pyarmor
Обфускация Python с помощью Cython
Обфускация — это одна из многих функций пакета Cython — это оптимизирующий статический компилятор, который берет файлы .py и переводит их в файлы на языке C. Полученные файлы C, без каких-либо усилий, могут быть скомпилированы в бинарные библиотеки. После компиляции, нет способа преобразовать скомпилированные библиотеки обратно в читаемый исходный код Python.
В качестве примера для демонстрации я написал небольшой код на основе Flask, который принимает числовое уравнение в качестве входных данных, проверяет его и, если оно действительно, разрешает уравнение. Это всего лишь учебный материал. Идея состоит в том, чтобы продемонстрировать обфускацию кода.
Вы можете ознакомиться с кодом проекта по этой ссылке:
Структура репозитория выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 |
. ├── README.md ├── __init__.py ├── main.py ├── routes.py ├── swagger.yml ├── src │ ├── __init__.py │ └── solver.py └── compile.py |
- main.py — служит для запуска приложения Flask.
- routes.py — здесь находятся все маршруты API, предоставляемые приложением.
- swagger.yml — содержит детали API, доступные в виде отформатированной документации через браузер.
- src/solver.py — в этом файле находится бизнес-логика проверки уравнения и его разрешения, если оно действительно.
- compile.py — содержит код для создания файлов .so из файлов .py.
Для запуска приложения Flask выполните следующую команду в терминале:
1 |
python main.py |
Теперь можно получить доступ к документации API Swagger по следующему адресу:
1 |
http://<public-ip>/ui |
Для компиляции кода выполните следующую команду, в зависимости от версии Python:
Для Python:
1 |
python compile.py build_ext --inplace |
Для Python 3:
1 |
python3 compile.py build_ext --inplace |
Команда создаст файлы .so и .c рядом с исходными файлами .py:
1 2 3 4 5 6 7 8 9 10 11 12 |
. ├── README.md ├── __init__.py ├── main.py ├── routes.py ├── swagger.yml ├── src │ ├── __init__.py │ ├── solver.py │ ├── solver.c │ └── solver.cpython-37m-x86_64-linux-gnu.so └── compile.py |
Файлы .c — это промежуточные исходники, используемые для создания файлов .so. Вы можете удалить файлы .pyc, .c и .py после успешной компиляции и оставить только файлы .so.
Обратите внимание, что файлы .so содержат имя целевой платформы в своих именах (например, darwin на MacOS). Очевидно, что скомпилированные библиотеки не кросс-платформенны. Если вы распространяете свою программу пользователям Ubuntu Linux, вы должны компилировать ее на Linux. В противном случае вы не сможете загрузить эти бинарные файлы. Таким образом, вам придется скомпилировать платформо-специфическую версию вашего кода для каждой из целевых платформ.
Триггер этого скрипта можно добавить в файлы настройки или Dockerfile, которые поддерживают создание пакета приложения. Итоговый пакет, который необходимо отправить, будет содержать зашифрованный продукт, который сложно реверснуть.
ПОЛЕЗНЫЕ ССЫЛКИ: