Python защита исходного кода

PyArmor: как запутать код, чтобы защитить программное обеспечение

Все еще не шифруете свой скрипт? Тогда самое время изучить обфускацию. Сегодня познакомлю с полезной библиотекой PyArmor, расскажу о двух методах работы модуля и на собственном примере покажу, как запутать код от нежелательного просмотра третьими лицами.

В повседневной работе существуют ситуации, когда по очевидным причинам необходимо предоставить скрипты заказчику, но, пересылая собственные разработки, в полном объеме можно потерять контроль над ними, включая авторские права на реализованные коды.

В таких случаях целесообразно защитить собственные коды, зашифровав их (защитить/сохранить/добавить условия для управления зависимостями внутри кода), точно также, как если бы стояла задача предоставления кода для пользования клиенту в течение какого-либо определенного периода времени.

Разработчики скриптов знают, что код на Python поддерживает анализ байт-кода, позволяющий ускорять работу интерпретатора и сам код на Python очень сложно защитить от нежелательного просмотра третьими лицами. Даже новички в разработке скриптов на Python могут заполучить исходный скрипт .py из файла .exe.

Для этого случая на Python существует очень полезная библиотека pyarmor с помощью которой можно воспользоваться всеми вышеизложенными функциями защиты скрипта от нежелательного взлома и метод, который позволяет защитить код называется обфускация.

Библиотека PyArmor имеет несколько вариантов работы – через консоль, а также с использованием localhost GUI – графического пользовательского интерфейса.

Читайте также:  Php примеры создания страницы

Установка и использование библиотеки pyarmor

В консоли необходимо выполнить следующую команду, чтобы установить модуль:

Для того чтобы начать работу с графическим интерфейсом библиотеки необходимо сперва его установить, выполнив следующую команду:

Библиотеки успешно установлены, теперь можно приступить непосредственно к самому шифрованию скрипта.

В первую очередь необходимо создать отдельную папку, в которой будет храниться скрипт с кодом «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)

Теперь зашифрую этот код, выполнив в консоли несколько команд.

Для начала необходимо изменить путь до директории в которой лежит файл через:

Затем необходимо выполнить команду обфускации:

Источник

Python, Django и немного защиты кода

Привет, Habr! Компания, в которой я работаю, занимается системами умного дома и видеонаблюдения. Услуга работает по форме SaaS. Но недавно было решено продавать и локальное решение. За основу «коробки» было решено взять облако, немного его переделать и вот готов новый продукт…

С переездом с облачных «рельс» возник ряд вопросов. Один из них в том, что весь проект написан на Python‑ язык интерпретируемый на лету и не защищенный от копирования от слова совсем. Второй момент, что в проекте используется Django. Фреймворк со своими зависимостями, которые еще аукнулись нам в процессе поиска решений. То с чем мы столкнулись и к чему пришли далее в статье.

Глава 1. Поиск решения

Как защитить код от изменения и копирования? Как сказал классик: «С этим вопросом я пошел в Интернет». И вот что удалось найти:

Решение 1 — смирись

Многие на форумах на вопрос как защищаетесь отвечают- никак. Аргументируют это тем, что кому надо и так взломают, а у python другая философия. Будь открыт миру и все такое.

Все так, но нашему проекту много лет и не хотелось бы терять наработки. Один нечестный клиент и весь труд насмарку.

Решение 2 — перепиши

Второй по популярности ответ- переписать на компилируемый язык программирования. Кроме Python у нас используется Go. Как вариант рассматривали переписать только важную часть на него, но проект настолько монструозный, что переписать его будет долго и дорого. Бизнес не оценил находку…

Решение 3 — отдавай только .pyc файлы

Как и большинство интерпретируемых языков программирования, Python перед выполнением кода переводит его формат байт-кода(такие файлы имеют формат .pyc и лежат в директории __pycache__). Уже этот байт код исполняется интерпретатором. Идея подхода- вручную “скомпилировать” весь код в байт-код. Удалить исходники и запускать pyc файлы.

def foo(): """Тестовая функция""" print("Hello, Habr!") if __name__ == "__main__": foo() 
python -m compileall main.py

Тут уже подозрительно что мы видим в неизменном виде комментарии и часть функции.

uncompyle6 -o . pycache/main.cpython-38.pyc

Получаем все в исходном виде вплоть до комментариев.

Внимание. Библиотека работает с кодом максимум 3.8 версии.

Итог данного метода. Если вам нужно быстро и хоть как-то защитить код и при этом рисками можно пренебречь- то этот метод для вас. Но нас этот метод не устроил на тот момент.

Решение 4 — Обфускация кода

Обфуска́ция (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать не очевидным, запутанным, сбивать с толку) или запутывание кода — приведение исходного кода или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. [1]

Суть подхода, что мы делаем код не читаемым, меняя понятные названия переменных на кракозябры.

Один из самых популярных проектов для обфускации pyarmor

Программа интересная. На простых скриптах все хорошо, но большой проект не удастся обфусцировать обычной версией — стоит ограничение в 32768 байт. Нужна платная. Проект иностранный, а ситуация сейчас… Эх, ну в общем сами понимаете.

Решение 5. Найти готовое решение по защите.

Тут все просто, в свете последних событий все производители таких решений, что мы нашли ушли из России. Если есть отечественные варианты буду признателен в комментариях.

Глава 2. Свой импортер и загрузчик

Перебрав предыдущие варианты мы поняли, что нам нужно:

  • Шифровать код, а не обфусцировать/компилировать и т.д его.
  • Метод должен быть простым и минимально затрагивать старый код
  • Должно быть достаточно сложной чтобы дилетанты вовсе не могли сломать, а опытных если не остановить, то хотя бы затруднить взлом.
  • Должен быть прост в поддержке, ибо нанимать/выделять сеньоров для сопровождения сего никто не даст.

После этого я наткнулся на PEP 302 и статью на хабре(какая ирония).

Если вкратце, pep 302 добавил новый набор перехватчиков импорта, которые предлагают лучшую настройку механизма импорта Python. В существующую схему можно внедрить хук нового стиля, что позволяет более точно контролировать, как модули находятся и как они загружаются.

Для его реализации нужно реализовать свой класс-импортер или класс-загрузчик(зависит от задачи), добавить в sys.path_hooks и все. Должно заработать.

Ура! — воскликнул я. Вот и решение.

Собрал небольшой пет-проект и вуаля- все работает.

Глава 3. Не все так просто как казалось…

После этого началось внедрение в основной проект. Таким образом нужно было защитить три подпроекта.

Первый заработал без сучка и без задоринки. Если не считать некоторые проблемы с тестами проект работал.

Настало время второго проекта…

Во втором проекте в одной из зависимостей использовался модуль inspect.

Модуль inspect предоставляет несколько полезных функций, помогающих получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода.(Дословный перевод:https://docs.python.org/3/library/inspect.html)

Этот модуль к моему удивлению активно был связан с ядром самого языка, написанном на C, при этом не подчинялся стандартному механизму импорта. После недельной битвы с модулем, понял, что придется идти в Си. НО! Вспомнив 4 пункт с ограничениями остановился. Сишников в команде нет, а подкладывать такую свинью коллегам не хочется.

Эпилог

Увы и ах! Но после двух недель изысканий мы остановились на первом варианте, а как альтернативу вариант с “компилированием” в pyc-файлы. Юристы пошли дописывать дополнительные пункты в договор, а мы продумывать что в перспективе переписать на GO.

Какой урок я вынес? Простыми способами Python не защитить, теперь я могу сказать это испытав на своей шкуре. Если у читателя есть навыки и желания, можно окунуться в дебри СИшного кода, но это уже другая история…

Источник

Как обезопасить исходники своего python-приложения

Рано или поздно все python-разработчики стают перед выбором: отдать заказчику приложение в исходниках или скрыть их. И вот во втором случае у многих (особенно недавно знакомых с этим прелестным языком) начинаются проблемы: поиск по гуглу, как правило, ничего не дает, идей никаких (или все бредовые).

И что же делать в таком случае?

Первой мыслью было отдавать pyc-файлы. Тогда я ещё не вникал в то, что это такое на самом деле. После нескольких часов проведённых в поисках ответов чем это грозит был сделан единственно возможный вывод: вариант не пройдет. Для python < 2.7 «декомпиляторов» полно бесплатных, а 2.7 и выше за сравнительно небольшие деньги обещают выдать в виде исходных кодов. Да ещё и эта тулза, с которой я за считанные мгновения получил свой код один-в-один.

Вариант сборки в бинарник показался достаточно заманчивым. Вот только, как оказалось, все сборщики (ниже я приведу пример cx_Freeze) фактически только и делают что пакуют .pyc в архив, то есть абсолютно не защищают исходные коды.

Предложим у нас есть проект проект с такой структурой (это всего лиш пример):

  1. В файле main.py у нас должен быть фактически только вызов главного модуля, если же там что-то большее — желательно оформить это в отдельный модуль
  2. Файлы __init__.py желательно чтоб были вообще пустые.
  1. $ sudo apt-get install cython
  2. Создаем в корне проекта файл compile.py:
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [ Extension("TestModule.Config", ["TestModule/Config.py"]), Extension("ui.mainwindow", ["ui/mainwindow.py"]), Extension("ui.loginwindow", ["ui/loginwindow.py"]), ] setup( name = 'Test App', cmdclass = , ext_modules = ext_modules ) 
  1. $ sudo apt-get install cx-freeze
  2. В корне проекта создаем файл pack.py:

from cx_Freeze import setup, Executable setup( name = "Test App", version = "0.1", description = "test", executables = [Executable("main.py")]) 

После проверки можно отдавать пакет заказчику.

P.S. Надеюсь кому-то это простое how-to сэкономит столько же времени, сколько могло бы сэкономить мне.

Источник

Оцените статью