Понадобятся файлы
скрипт настройки окружения cython и автоматической компиляции кода | |
пример исходного кода на Python, в котором проводятся вычисления и вызываются функции Guardant | |
| run_cython.pyx | пример исходного кода с измененными прототипами функций для Cython. По сути тот же код на Python, но с явно указанными типами |
| simple_test.py | пример простого приложения, которое вызывает защищенные функции/функции API |
Защита Python-приложения с использованием Cython в Debian 11
Шаг 1. Установить cython и нужные ему пакеты
sudo apt-get install -y build-essential python3-dev
sudo apt install -y python3-pip
sudo apt install -y cython3
pip3 install setuptools
pip3 install requests
Если при использовании pip возникает ошибка вида "error: externally-managed-environment" дополнительно выполнить команды для создания окружения.
sudo apt install -y python3-venv
python3 -m venv myenv
source myenv/bin/activate
И затем повторить.
pip3 install setuptools
pip3 install requestsШаг 2. Установить Guardant SLK из tar.gz архива
tar -xf ./GuardantSLK-.tar.gzШаг 3. Создать рабочую папку
mkdir mydirnameШаг 4. Поместить в рабочую папку файлы
setup.py
run_cython.pyx
run_python.py
simple_test.py
grdlic_python.py <--- лежит по пути .../Software Licensing Kit/api/wrappers/python
libgrdlic.a <--- лежит по пути .../Software Licensing Kit/api/lib/linux/x86_64
libgrdlic.so <--- лежит по пути .../Software Licensing Kit/api/lib/linux/x86_64
Шаг 5. Активировать DL или подключить аппаратный ключ Sign
Не важно, какие продукты и компоненты записаны в ключ, для логина будет выбран последний имеющийся компонент.
Шаг 6. Сгенерировать код на С и скомпилировать расширение
Для генерации нужно выполнить команду:
python3 setup.py build_ext --inplaceВ одной директории с исходными файлами, будут созданы новые:
run_cython.c
run_cython.cpython-39-x86_64-linux-gnu.so
Можно использовать run_cython.cpython-39-x86_64-linux-gnu.so для выбора функций для защиты, пропустить шаги 7-9, а на шаге 10 не указывать .map файл.
Однако для больших проектов рекомендуется .map файл указывать. Для его получения в нужном формате надо выполнить шаги 7-9.
Шаги 7-9
Шаг 7.
При компиляции таким способом не создается .map файл. Чтобы его получить, необходимо установить английский язык для генерации map-файла (это требуется для корректного парсинга протектором)
export LANG=en_US.UTF-8Шаг 8. Посмотреть версию python3, используемую в системе
python3 --versionВ консоли будет указана версия, которую надо использовать в следующем шаге, например: Python 3.11.2 .
Шаг 9. Скомпилировать код из run_cython.c и создать .map файл
gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing \
-I/usr/include/python3.11 -o run_cython.so run_cython.c -Xlinker -Map=output.map
Компилятор создаст файлы:
run_cython.so
output.map
Шаг 10. Подготовить проект защиты
Открыть Protection Studio, авторизоваться, выбрать файл "run_cython.so" из шага выше для защиты и указать компонент (любой из имеющихся в ключе).
При наличии выбрать .map файл, созданный на шаге 8.
В окне выбора функций для защиты, ввести в строку поиска "factorial" и выбрать "__pyx_pw_10run_cython_1factorial"
Шаг 11. Запустить защиту
Дождаться завершения процесса защиты.
Шаг 12. Скопировать защищенный run_cython.so и libprotectstorage64.so в рабочую папку
Шаг 13. Очистить от лишних файлов директорию с защищенными
Удалить, переименовать или переместить в другую папку файлы (чтобы убедиться в работе защищенного run_cython.so):
run_cython.c
run_cython.pyx
*run_cython.cpython-39-x86_64-linux-gnu.so (если run_cython.so был скомпилирован вручную для получения .map файла)
Шаг 14. Запустить simple_test.py
python3 simple_test.pyЗапустится простой тест, который посчитает факториал от пяти и выполнит вызовы функций API.
Подробнее процесс работы с Cython описан в его документации:
https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html