В данном руководстве мы узнаем, как “запутать” программу на Python. Иногда мы можем столкнуться со сценарием, когда по определенным причинам мы должны доставить код напрямую клиенту. Однако мы потеряем контроль над кодом, выполнив такую функцию.
В таких случаях мы можем зашифровать скрипт, чтобы защитить его, сохранить контроль и включить несколько резервных условий для управления зависимостью, как если бы мы доставляли код для использования только на определенное время.
Для решения данной задачи мы будем использовать библиотеку pyarmor python, реализующую возможность обфускации данных любого кода программы Python.
Создание базовой функции
Защита Python приложений
Первый вариант защищает Python приложения, комбинируя Sentinel Envelope с Sentinel Data File Protection (DFP). Таким образом, защищается непосредственно интерпретатор Python, которому на уровне защиты указывается, с какими файлами он должен работать как с защищенными (зашифрованными), следовательно, такие файлы интерпретатор будет предварительно автоматически расшифровывать и только затем выполнять. Незашифрованные файлы будут работать также, как и ранее. Сами *.py модули, требующие защиты шифруются с помощью инструмента Sentinel Data File Protection (DFP).
Шифруем файлы с помощью Python
Второй вариант подразумевает защиту Python приложений, комбинируя Cython (https://cython.org/) с Sentinel Envelope. Сначала необходимо требующие защиты модули Python перевести в C-Code с помощью Cython и затем скомпилировать их в модули *.pyd / *.so, которые в последствие защищаются с помощью Sentinel Envelope.
Второй метод обеспечивает более высокий уровень безопасности, поскольку дополнительный этап компиляции снижает уровень абстракции кода и позволяет Sentinel Envelope защищать приложение как код, а не только как данные, что позволяет применять более сложные механизмы защиты. С другой стороны, второй метод немного сложнее в настройке, так как требует дополнительно “прослойки” в виде Cython и работающий C-компилятор.
- 1 Метод #1: защита через шифрование данных (Sentinel Data File Protection)
- 1.1 Примеры защиты
- 1.1.1 Для Windows
- 1.1.2 Для Linux
- 1.2.1 Сборка приложения и зависимостей в *.py модуль
- 1.2.2 Шифрование *.py модулей
- 1.2.3 Защита интерпретатора Python
- 2.1 Примеры защиты
- 2.1.1 Для Windows
- 2.1.2 Для Linux
- 2.2.1 Трансляция *.py модулей в C-Code с использованием Cython
- 2.2.2 Сборка C-Файлов в нативное Python приложение (исполняемый файл)
- 2.2.3 Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope
Метод #1: защита через шифрование данных (Sentinel Data File Protection)
Защита приложения Python с помощью Sentinel Data File Protection состоит из трех этапов:
● Соберите ваше приложение в модули байт-кода *.pyc.
● Зашифруйте получившиеся файлы *.pyc с помощью утилиты Sentinel dfcrypt.
Как защитить свой код на Python от ВЗЛОМА
● Защитите интерпретатор Python, включив в настройках защиты опцию “Enable data file protection (Data Protection Utility) = Version 2” для работы защищённого интерпретатора с зашифрованными файлами данных. Защищенное приложение может распространяться путем упаковки защищенного с помощью Envelope интерпретатора вместе с зашифрованными *.pyc файлами (например, с использованием pyinstaller).
Примечание: Важно всегда защищать скомпилированный байт-код Python (*.pyc), а не простой исходный код Python (.py). Причина в том, что интерпретатор Python сначала переводит файлы *.py в файлы *.pyc, которые затем записываются на диск, чтобы ускорить последующее выполнение. При предоставлении защищенного файла *.py вместо файла *.pyc интерпретатор Python сгенерирует открытый текстовый файл *.pyc и запишет его на диск, где он будет доступен для анализа в открытом виде.
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту Python приложения для Windows с помощью Sentinel Data File Protection, можно найти в директории:
C:Users\DocumentsGemaltoSentinel LDK versionSamplesEnvelopePython data_file_protection
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
C:Users\DocumentsGemaltoSentinel LDK versionSamplesEnvelopePython sample_app
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3. Директория data_file_protection содержит:
● build_dfp_protected_python2_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python2 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● envelope_python2.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python2 (python27.dll) для приведенного выше сценария.
● build_dfp_protected_python3_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python3 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller
.● envelope_python3.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python3 (python37.dll) для приведенного выше сценария.
Для Linux
Пример, демонстрирующий защиту Python приложения для Linux с использованием Sentinel Data File Protection, можно найти в директории:
/Linux/Samples/Envelope/Python/data_file_protection
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
/Linux/Samples/Envelope/Python/sample_app
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.Директория data_file_protection содержит:
● build_dfp_protected_python2_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python2 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● build_dfp_protected_python3_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python3 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
Процесс защиты
Шаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope:
Сборка приложения и зависимостей в *.py модуль
Запустите pyinstaller с параметрами: «-d noarchive» для требующего защиты*.py модуля, например:
pyinstaller -d noarchive main.py
Этот шаг собирает зависимости вашего приложения и компилирует их в байт-код Python. «-d noarchive» инструктирует pyinstaller хранить скомпилированные модули Python как отдельные файлы, что является обязательным требованием для следующего шага шифрования.Результатом этого шага является автономная папка (dist/), содержащая ваше приложение и все его зависимости.Примечание: Если установленный pyinstaller не поддерживает ключ «-d noarchive», он слишком стар и его необходимо обновить с помощью команды
pip:pip install pyinstaller —upgrade
Шифрование *.py модулей
Используйте dfcrypt для шифрования чувствительных модулей байт-кода вашего приложения, например:
dfcrypt —encrypt —encver:2 «—key:A secret» —vcf:DEMOMA.hvc —fid:0 dist//moduleA.pyc encrypted/moduleA.pyc
dfcrypt —encrypt —encver:2 «—key:a secret» —vcf:DEMOMA.hvc —fid:0 dist//moduleB.pyc encrypted/moduleB.pyc
Хотя это и не является строго обязательным, рекомендуется использовать ключ «—key:» для указания общего ключа шифрования для всех модулей приложения. Это позволяет использовать логику кэширования, которая может существенно улучшить время запуска приложения, использующего большое количество защищенных модулей. Не указывая «—key:», команда dfcrypt выбирает случайный ключ для каждого файла.Когда закончите с шифрованием, замените исходные файлы их зашифрованным аналогом, например:
copy encrypted/moduleA.pyc dist//
copy encrypted/moduleB.pyc dist//
Защита интерпретатора Python
Защитите с помощью Envelope библиотеку интерпретатора Python (*.dll / *.so) с поддержкой возможности чтения зашифрованных файлов данных:
Например в Linux и Python2:
linuxenv —vcf:DEMOMA.hvc —fid:0 —dfp dist//libpython2.7.so.1.0 dist//libpython2.7.so.1.0
Ключ «—dfp» активирует Data File Protection, что позволяет защищенному интерпретатору Python выполнять зашифрованные модули Python.
В Windows используйте Sentinel Envelope и активируйте Data File Protection Version 2.
Скопируйте выходные файлы Envelope в директорию:
Чтобы развернуть защищенное приложение, просто скопируйте папку dist/ на целевой компьютер.Ваше защищенное приложение можно запустить, выполнив команду вида:
Метод #2: экспорт модулей через Cython и защита с помощью Sentinel Envelope
- Переведите ваши модули Python (*.py) в C-Code, используя Cython.
- Скомпилируйте полученные C-файлы в модули расширения Python (*.pyd / *.so), используя C-компилятор для вашей платформы 1 .
- Защитите полученные модули расширения Python (*.pyd / *.so) с помощью Sentinel Envelope.
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту приложения Python для Windows с использованием Cython и Sentinel Envelope, можно найти в директории:
C:Users\DocumentsGemaltoSentinel LDK versionSamplesEnvelopePython cythonize_and_envelope
Скрипты демонстрирующие защиту простого приложения Python, которое можно найти в директории:
C:Users\DocumentsGemaltoSentinel LDK versionSamplesEnvelopePython sample_app
Пример приложения представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
Директория cythonize_and_envelope содержит:
● build_python2.bat Этот сценарий защищает и упаковывает пример приложения для Python2 под Windows, с использованием: кода разработчика DEMOMA, Cython, компилятора Microsoft Visual C ++ для Python 2.7, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py2modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py3modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
Для Linux
Пример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории:
/Linux/Samples/Envelope/Python/cythonize_and_envelope
Прилагаемые скрипты демонстрируют защиту простого приложения Python, которое можно найти в директории:
/Linux/Samples/Envelope/Python/sample_app
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
Директория cythonize_and_envelope содержит:
● build_python2.sh
Этот сценарий защищает и упаковывает приложение для Python2 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
● build_python3.sh
Этот сценарий защищает и упаковывает приложение для Python3 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
Процесс защиты
Шаги для создания защищенного приложения с использованием Cython и Sentinel Envelope:
Трансляция *.py модулей в C-Code с использованием Cython
Для защиты необходимо сначала изменить расширение вашего модуля Python с *.py на *.pyx, потому что это позволяет Cython генерировать код, который может быть лучше защищен с помощью Sentinel Envelope.Cython может быть установлен с использованием команды
pip:pip install cython —upgrade
Запустите cython и укажите, должен ли он обрабатывать код как Python 2 или Python 3:
cython -2 —no-docstrings .moduleA.pyx
cython -3 —no-docstrings .moduleA.pyx
Результатом является представление модуля Python в виде C-кода ( moduleA.c).
Сборка C-Файлов в нативное Python приложение (исполняемый файл)
Для Windows:Установите требуемый компилятор:
● Python2: Microsoft Visual C++ Compiler для Python 2.7
● Python3: Microsoft Build Tools для Visual Studio 2019 https://visualstudio.microsoft.com/ru/downloads/
Запустите консоль (cmd-shell) и выполните команду:
● Python2: C:Users\AppDataLocalProgramsCommonMicrosoftVisual C++ for Python9.0vcvarsall.bat» amd64
● Python3: C:\VCAuxiliaryBuildvcvarsall.bat» amd64
Выполните следующие команды в консоли, чтобы скомпилировать C-код:
● Python2: cl /nologo /c /MD /Ox /W3 /I C:Python27include moduleA.c link /nologo /dll -out:moduleA.pyd C:Python27libspython27.lib moduleA.obj
● Python3: cl /nologo /c /MD /Ox /W3 /IC:Python37include moduleA.c link /nologo /dll -out:moduleA.pyd C:Python37libspython37.lib moduleA.obj
В результате получите модуль расширения Python для Windows (moduleA.pyd).Для Linux:
Установите GCC-Compiler с помощью менеджера пакетов вашего дистрибутива Linux, например следующей командой в консоли:
apt install gcc
Установите пакет разработчика Python, используя менеджер пакетов вашего дистрибутива Linux, например:
apt install python2-dev
apt install python3-dev
Выполните следующие команды, чтобы скомпилировать C-код:
● Python2: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so
● Python3: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I «/usr/include/python3.7» -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so
В результате получите модуль расширения Python для Linux (moduleA.so).
Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope
Пример команды для защиты для Linux:
linuxenv —vcf:DEMOMA.hvc —fid:0 plain/moduleA.so prot/moduleA.so
Для Windows используйте Sentinel Envelope точно так же, как при защитите обычного dll/exe файла.
Источник: www.euromobile.ru
PyArmor: как запутать код, чтобы защитить программное обеспечение
Все еще не шифруете свой скрипт? Тогда самое время изучить обфускацию. Сегодня познакомлю с полезной библиотекой PyArmor, расскажу о двух методах работы модуля и на собственном примере покажу, как запутать код от нежелательного просмотра третьими лицами.
2597 просмотров
В повседневной работе существуют ситуации, когда по очевидным причинам необходимо предоставить скрипты заказчику, но, пересылая собственные разработки, в полном объеме можно потерять контроль над ними, включая авторские права на реализованные коды.
В таких случаях целесообразно защитить собственные коды, зашифровав их (защитить/сохранить/добавить условия для управления зависимостями внутри кода), точно также, как если бы стояла задача предоставления кода для пользования клиенту в течение какого-либо определенного периода времени.
Разработчики скриптов знают, что код на Python поддерживает анализ байт-кода, позволяющий ускорять работу интерпретатора и сам код на Python очень сложно защитить от нежелательного просмотра третьими лицами. Даже новички в разработке скриптов на Python могут заполучить исходный скрипт .py из файла .exe.
Для этого случая на Python существует очень полезная библиотека pyarmor с помощью которой можно воспользоваться всеми вышеизложенными функциями защиты скрипта от нежелательного взлома и метод, который позволяет защитить код называется обфускация.
Библиотека PyArmor имеет несколько вариантов работы – через консоль, а также с использованием localhost GUI – графического пользовательского интерфейса.
Установка и использование библиотеки pyarmor
В консоли необходимо выполнить следующую команду, чтобы установить модуль:
pip install pyarmor
Для того чтобы начать работу с графическим интерфейсом библиотеки необходимо сперва его установить, выполнив следующую команду:
pip install pyarmor—webui
Библиотеки успешно установлены, теперь можно приступить непосредственно к самому шифрованию скрипта.
В первую очередь необходимо создать отдельную папку, в которой будет храниться скрипт с кодом «my_script.py».
В качестве примера скрипта возьму самый простейший скрипт с математическими функциями и с определением функции вывода (функция вывода довольно проста и не нуждается в каких-либо пояснениях):
def math_primer1(x, y): return x + y * x * y def math_primer2(x, y): return x * y ** (x + y) if __name__ == «__main__»: result1 = math_primer2(2, 3) result2 = math_primer1(1, 2) print(result1, result2)
Теперь зашифрую этот код, выполнив в консоли несколько команд.
Для начала необходимо изменить путь до директории в которой лежит файл через:
cd [Полный путь до файла my_script.py]
Затем необходимо выполнить команду обфускации:
Источник: vc.ru