Защита Python приложенийСкачать статью в форме pdf: Защита Python приложений
Существует два возможных варианта защиты Python приложений:
● Защита через шифрование данных (Sentinel Envelope с использованием Sentinel Data File Protection (DFP)) ● Экспорт модулей через Cython с последующей защитой через Sentinel Envelope
Первый вариант защищает Python приложения, комбинируя Sentinel Envelope с Sentinel Data File Protection (DFP). Таким образом, защищается непосредственно интерпретатор Python, которому на уровне защиты указывается с какими файлами он должен работать как с защищенными (зашифрованными), следовательно, такие файлы интерпретатор будет предварительно автоматически расшифровывать и только затем выполнять. Незашифрованные файлы будут работать также, как и ранее. Сами *.py модули, требующие защиты шифруются с помощью инструмента Sentinel Data File Protection (DFP). Второй вариант подразумевает защиту Python приложений, комбинируя Cython (https://cython.org/) с Sentinel Envelope. Сначала необходимо требующие защиты модули Python перевести в C-Code с помощью Cython и затем скомпилировать их в модули *.pyd / *.so, которые в последствие защищаются с помощью Sentinel Envelope. Второй метод обеспечивает более высокий уровень безопасности, поскольку дополнительный этап компиляции снижает уровень абстракции кода и позволяет Sentinel Envelope защищать приложение как код, а не только как данные, что позволяет применять более сложные механизмы защиты. С другой стороны, второй метод немного сложнее в настройке, так как требует дополнительно “прослойки” в виде Cython и работающий C-компилятор. Примечание. Оба метода не могут защитить стартовый скрипт приложения, а только его модули Python. Поэтому рекомендуется поместить фактическую точку входа вашего приложения в модуль Python и использовать только стартовый скрипт для вызова модуля. Метод #1: защита через шифрование данных (Sentinel Data File Protection)Защита приложения Python с помощью Sentinel Data File Protection состоит из трех этапов: ● Соберите ваше приложение в модули байт-кода *.pyc. ● Зашифруйте получившиеся файлы *.pyc с помощью утилиты Sentinel dfcrypt. ● Защитите интерпретатор 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\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \data_file_protection Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории: C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\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.bat
● envelope_python2.prjx
● build_dfp_protected_python3_app.bat
● envelope_python3.prjx
Для LinuxПример, демонстрирующий защиту Python приложения для Linux с использованием Sentinel Data File Protection, можно найти в директории: <DVD_Root>/Linux/Samples/Envelope/Python/data_file_protection Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории: <DVD_Root>/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
● build_dfp_protected_python3_app.sh
Процесс защитыШаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope: Сборка приложения и зависимостей в *.py модульЗапустите pyinstaller с параметрами: "-d noarchive" для требующего защиты*.py модуля, например: pyinstaller -d noarchive main.py Этот шаг собирает зависимости вашего приложения и компилирует их в байт-код Python. «-d noarchive» инструктирует pyinstaller хранить скомпилированные модули Python как отдельные файлы, что является обязательным требованием для следующего шага шифрования. Результатом этого шага является автономная папка (dist/<application_name>), содержащая ваше приложение и все его зависимости. Примечание: Если установленный pyinstaller не поддерживает ключ "-d noarchive", он слишком стар и его необходимо обновить с помощью команды pip: pip install pyinstaller --upgrade Шифрование *.py модулейИспользуйте dfcrypt для шифрования чувствительных модулей байт-кода вашего приложения, например: dfcrypt --encrypt --encver:2 "--key:A secret" --vcf:DEMOMA.hvc --fid:0 dist/<application_name>/moduleA.pyc encrypted/moduleA.pyc dfcrypt --encrypt --encver:2 "--key:a secret" --vcf:DEMOMA.hvc --fid:0 dist/<application_name>/moduleB.pyc encrypted/moduleB.pyc Хотя это и не является строго обязательным, рекомендуется использовать ключ «--key:» для указания общего ключа шифрования для всех модулей приложения. Это позволяет использовать логику кэширования, которая может существенно улучшить время запуска приложения, использующего большое количество защищенных модулей. Не указывая "--key:", команда dfcrypt выбирает случайный ключ для каждого файла. Когда закончите с шифрованием, замените исходные файлы их зашифрованным аналогом, например: copy encrypted/moduleA.pyc dist/<application_name>/ copy encrypted/moduleB.pyc dist/<application_name>/
Защита интерпретатора PythonЗащитите с помощью Envelope библиотеку интерпретатора Python (*.dll / *.so) с поддержкой возможности чтения зашифрованных файлов данных: Например в Linux и Python2: linuxenv --vcf:DEMOMA.hvc --fid:0 --dfp dist/<app_name>/libpython2.7.so.1.0 dist/<app_name>/libpython2.7.so.1.0 Ключ «--dfp» активирует Data File Protection, что позволяет защищенному интерпретатору Python выполнять зашифрованные модули Python. В Windows используйте Sentinel Envelope и активируйте Data File Protection Version 2.
Скопируйте выходные файлы Envelope в дтректорию: dist/<application_name>. Чтобы развернуть защищенное приложение, просто скопируйте папку dist/<application_name> на целевой компьютер. Ваше защищенное приложение можно запустить, выполнив команду вида: dist/<application_name>/<application_name>.
Метод #2: экспорт модулей через Cython и защита с помощью Sentinel EnvelopeЗащита приложения Python с помощью Cython и Sentinel Envelope состоит из трех этапов:
Защищенное приложение можно распространять, предоставляя защищенные модули расширения Python вместе со стартовым скриптом вашего приложения (например: pyinstaller). Примеры защитыДля WindowsПосле установки Sentinel LDK пример, демонстрирующий защиту приложения Python для Windows с использованием Cython и Sentinel Envelope, можно найти в директории: C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \cythonize_and_envelope Скрипты демонстрирующие защиту простого приложения Python, которое можно найти в директории: C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \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
● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller. ● envelope_cythonized_py3modules.prjx
Для LinuxПример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории: <DVD_Root>/Linux/Samples/Envelope/Python/cythonize_and_envelope Прилагаемые скрипты демонстрируют защиту простого приложения Python, которое можно найти в директории: <DVD_Root>/Linux/Samples/Envelope/Python/sample_app Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3. Директория cythonize_and_envelope содержит: ● build_python2.sh
● build_python3.sh
Процесс защитыШаги для создания защищенного приложения с использованием 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 https://www.microsoft.com/download/details.aspx?id=44266 ● Python3: Microsoft Build Tools для Visual Studio 2019 https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019 Запустите консоль (cmd-shell) и выполните команду: ● Python2: C:\Users\<username>\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat" amd64 ● Python3: C:\<vs_build_tools_install_dir>\VC\Auxiliary\Build\vcvarsall.bat" amd64
Выполните следующие команды в консоли, чтобы скомпилировать C-код: ● Python2: cl /nologo /c /MD /Ox /W3 /I C:\Python27\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python27\libs\python27.lib moduleA.obj ● Python3: cl /nologo /c /MD /Ox /W3 /IC:\Python37\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python37\libs\python37.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 файла.
|
|