Как сделать код python закрытым
Я разрабатываю часть программного обеспечения на Python, которое будет распространено среди моих клиентов-работодателей. Мой работодатель хочет ограничить использование программного обеспечения ограниченным временем файлом лицензии.
Если мы распространем файлы .py или даже .pyc, будет легко (декомпилировать и) удалить код, который проверяет файл лицензии.
Еще один аспект заключается в том, что мой работодатель не хочет, чтобы код читался нашими клиентами, опасаясь, что код может быть украден или, по крайней мере, "новые идеи".
Программное обеспечение будет работать в системах Linux (поэтому я не думаю, что py2exe сделает трюк).
py2exe просто сохраняет файлы байт-кода .pyc в архиве .zip, так что это определенно не решение. Тем не менее, это может быть полезно в сочетании с подходящим скриптом запуска для запуска под Linux
Python, являющийся интерпретированным языком с байтовым кодом, очень затрудняет блокировку. Даже если вы используете exe-packager, например py2exe, макет исполняемого файла хорошо известен, а байт-коды Python хорошо понимать.
Обычно в таких случаях вам нужно сделать компромисс. Насколько важно защищать код? Существуют ли там настоящие секреты (например, ключ для симметричного шифрования банковских переводов), или вы просто параноик? Выберите язык, который позволит вам быстрее разработать лучший продукт и быть реалистом в отношении того, насколько ценны ваши новые идеи.
Если вы решите, что вам действительно нужно принудительно обеспечить проверку лицензии, напишите его как небольшое расширение C, чтобы код проверки лицензии мог быть сверхжестким (но не невозможным!) для обратной инженерии и оставить основную часть вашего кода в Python.
Даже если код проверки лицензии было трудно реконструировать, потому что он написан на C, разве не было бы относительно легко удалить вызовы кода проверки лицензии?
Да, в зависимости от того, где выполняется проверка лицензии. Если к внутреннему номеру поступает много вызовов, его может быть трудно искоренить. Или же вы можете переместить какую-то другую важную часть приложения в проверку лицензии, чтобы удаление вызова к расширению нанесло ущерб приложению.
Действительно, вся эта работа не о предотвращении модификации, а об увеличении ее сложности, чтобы она больше не стоила того. Все, что угодно, может быть перепроектировано и модифицировано, если есть достаточно преимуществ.
@Blair Conrad: Нет, если код проверки лицензии тоже скрывает функциональность. Например, mylicensedfunction(licenseblob liblob, int foo, int bar, std::string bash)
Я думаю, что самый умный способ - реализовать критические части в C и реализовать все вещи для проверки лицензии. (Я использую аппаратный ключ, который может реализовать некоторые вычисления внутри него. Поэтому практически невозможно повернуть его обратно.)
Я на самом деле видел коммерческий код Python, поставляемый как встроенный Python внутри библиотеки C. Вместо того, чтобы преобразовывать некоторые части кода в C, они скрывают весь код Python внутри защитного слоя C. Затем, если им нужен модуль, импортируемый Python, они пишут тонкое расширение Python поверх C. Открытый исходный код - намного более простой образ жизни.
Я знаю, что это старо, но я должен отметить, что хранение криптографических ключей или чего-либо чувствительного внутри исполняемого файла - это плохая идея ™. Тот факт, что исполняемый файл скомпилирован в двоичный файл, не имеет значения. Вы можете просто выполнить команду strings перед вами будет ключ.
Поскольку ни один технический метод не может запретить вашим читателям читать ваш код, вы должны применять обычные коммерческие методы.
Лицензии. Контракты. Условия и положения. Это все еще работает, даже когда люди могут читать код. Обратите внимание, что некоторые из ваших компонентов на базе Python могут потребовать, чтобы вы платили комиссионные, прежде чем продавать программное обеспечение с использованием этих компонентов. Кроме того, некоторые лицензии с открытым исходным кодом запрещают вам скрывать источник или источник этого компонента.
Предлагаем значительную ценность. Если ваши вещи настолько хороши - по цене, которую трудно отказать, нет стимула тратить время и деньги на обратное проектирование. Обратное проектирование дорого. Сделайте свой продукт немного дешевле.
Предлагайте обновления и улучшения, которые делают любую обратную разработку плохими идеями. Когда следующий релиз нарушает их обратную инженерию, нет смысла. Это может быть доведено до абсурдных крайностей, но вы должны предложить новые функции, которые делают следующий выпуск более ценным, чем обратная инженерия.
Предлагайте персонализацию по таким привлекательным ценам, что они предпочитают оплачивать вам сборку и поддержку улучшений.
Используйте срок действия лицензионного ключа. Это жестоко, и вы получите плохую репутацию, но это, безусловно, заставляет ваше программное обеспечение перестать работать.
Предлагайте его как веб-сервис. SaaS не требует загрузки для клиентов.
Пункт 2 еще важнее. Если покупать дешевле, чем реверс-инжиниринг, плюс ежегодные обновления, никто не будет пытаться, и даже если это произойдет, никто не заплатит хакеру вместо поставщика программного обеспечения.
Это правда. Обратный инжиниринг выполним, но в большинстве ситуаций дорог. @ S.Lott, я считаю, что пункт 6 имеет большее значение в зависимости от вопроса. Если исходный код действительно нуждается в защите, он должен быть удален от конечного пользователя.
Вы должны использовать правильный инструмент для правильной работы, и Python не был предназначен для обфускации. Это наоборот; все открыто или легко обнаружить или изменить в Python, потому что это философия языка.
Если вы хотите что-то, чего не видите, найдите другой инструмент. Это не так уж плохо, важно, чтобы для разных видов использования существовало несколько различных инструментов.
Даже скомпилированные программы могут быть обратно спроектированы, поэтому не думайте, что вы можете полностью защитить любой код. Вы можете анализировать запутанный PHP, разбить ключ шифрования флэш-памяти и т.д. Новые версии Windows трещины каждый раз.
Вы не можете помешать кому-либо злоупотреблять вашим кодом, но вы можете легко обнаружить, если кто-то это сделает. Поэтому это просто случайная юридическая проблема.
В настоящее время бизнес-модели, как правило, идут на продажу услуг, а не на продукты. Вы не можете копировать службу, пират или не красть ее. Может быть, пришло время подумать о том, чтобы пойти с потоком.
Хороший ответ, но "случайный юридический вопрос"? В самом деле? Где вы живете, что у вас есть какие-либо юридические проблемы, которые являются случайными?
Я думаю, если у нас есть частота - как часто взламывается дорогой запутанный код - мы могли бы сказать о целесообразности использования Python и запутанного кода.
Если у вашего кода есть интересные функции, тот, кто смог его неправильно использовать, будет распространять его @Macke
Компиляция python и распространение двоичных файлов!
Разумная идея:
Используйте Cython, Nuitka, Shed Skin или что-то похожее на компиляцию python на C-код, а затем распределите приложение как бинарные библиотеки python (pyd).
Cython становится все более и более совместимым с CPython, поэтому я думаю, что он должен работать. (Я действительно рассматриваю это для нашего продукта.. Мы уже создаем некоторые сторонние библиотеки как pyd/dll, поэтому отправка нашего собственного кода на Python в качестве двоичных файлов для нас не является слишком большим шагом).
См. Эту статью в блоге (не я) для учебника о том, как это сделать. (спасибо @hithwen)
Сумасшедшая идея:
Вероятно, вы могли бы заставить Cython хранить C файлы отдельно для каждого модуля, а затем просто конкатенировать их все и построить их с сильной вставкой. Таким образом, ваш Python-модуль довольно монолитный и сложный для чипа с помощью обычных инструментов.
Помимо сумасшедших:
Возможно, вы сможете создать единый исполняемый файл, если вы можете связать (и оптимизировать с) время выполнения python и все библиотеки (dll) статически. Таким образом, было бы трудно перехватить вызовы на/из python и любых используемых вами библиотек. Этого нельзя сделать, если вы используете код LGPL.
Будет ли компилирование с помощью Cython работать с приложением Python 3.4 Django, или оно может работать без огромных усилий?
@mlvljr FWIW, IMHO, компиляция в двоичные файлы - это хороший компромисс между продажей всех ваших секретов и попыткой защиты от обратного инжиниринга класса NSA. Esp, если у вас есть большая база кода Python и причины быть параноиком. ;)
Я понимаю, что вы хотите, чтобы ваши клиенты использовали мощь python, но не хотите выставлять исходный код.
Вот мои предложения:
(a) Напишите критические фрагменты кода как библиотеки C или С++, а затем используйте SIP или swig, чтобы показать API-интерфейсы C/С++ в пространстве имен Python.
(b) Используйте cython вместо Python
(c) В обоих (a) и (b) должно быть возможно распределить библиотеки как лицензированные двоичные файлы с интерфейсом Python.
Я только что посмотрел на Shed Skin, как предложено TyPyPy, и это, кажется, действительно хороший материал!
Знает ли ваш работодатель, что он может "украсть" любые идеи, которые другие люди получают от вашего кода? Я имею в виду, если они смогут читать твою работу, так ты можешь их. Возможно, глядя на то, как вы можете извлечь выгоду из этой ситуации, вы получите лучшую отдачу от своих инвестиций, чем боитесь, сколько вы можете потерять.
[EDIT] Отвечать на комментарий Nick:
Ничего не получилось и ничего не потеряно. У клиента есть то, что он хочет (и заплатил за него, так как сам сделал это изменение). Поскольку он не выпускает изменения, он, как будто это не произошло для всех остальных.
Теперь, если клиент продает программное обеспечение, он должен изменить уведомление об авторских правах (что является незаконным, поэтому вы можете подать в суд и выиграть → простой случай).
Если они не изменят уведомление об авторских правах, клиенты второго уровня заметят, что программное обеспечение исходит от вас оригинальным и задается вопросом, что происходит. Скорее всего, они свяжутся с вами, и вы узнаете о перепродаже своей работы.
Снова у нас есть два случая: оригинальный клиент продал всего несколько экземпляров. Это значит, что они не зарабатывали много денег, так зачем беспокоиться. Или они продаются по объему. Это означает, что вам лучше узнать, что они делают и что-то с этим поделать.
Но в конце концов, большинство компаний пытаются подчиниться закону (как только их репутация разрушена, гораздо труднее заниматься бизнесом). Поэтому они не украдут вашу работу, а будут работать с вами, чтобы улучшить ее. Поэтому, если вы включите источник (с лицензией, которая защищает вас от простой перепродажи), скорее всего, они просто отбросят изменения, которые они сделали, поскольку они будут следить за тем, чтобы изменения находились в следующей версии, и им не нужно ее поддерживать, Это беспроигрышное: вы получаете изменения, и они могут внести изменения сами, если они действительно, отчаянно нуждаются в нем, даже если вы не хотите включать его в официальный релиз.
Что если они выпускают программное обеспечение для клиентов, а клиент изменяет его внутри, не переиздавая его?
+1 за кражу идей назад. Зачем ограничивать ваши возможности обслуживания клиентов вашими собственными решениями, когда вы видите, как другие улучшают ваше решение и, соответственно, улучшают ваш собственный продукт? «Если у вас есть яблоко, а у меня яблоко, и мы обмениваем эти яблоки, то у вас и у меня все еще будет по одному яблоку. Но если у вас есть идея, и у меня есть идея, и мы обмениваемся этими идеями, то у каждого из нас будет две идеи. "
Что, если один из ваших клиентов повторно анонсирует ваш код или идеи бесплатно и анонимно? Вы не можете сказать, кто это сделал, и подать в суд на них, и потому что они не получили от этого выгоды, вы тоже не будете. Это разрушит вашу работу, в то время как один из ваших клиентов заплатил только базовую цену за нее. (очевидно, работает только если у вас есть более одного клиента для вашего решения)
Не полагайтесь на обфускацию. Как вы правильно сделали вывод, он предлагает очень ограниченную защиту. UPDATE: ссылка на бумагу, которая сбрасывает инженерный запущенный код python в Dropbox. Переопределение кода - это хороший барьер, но он явно может быть побежден.
Вместо этого, как упоминалось много плакатов, сделайте это:
- Не стоит обратного времени разработки (ваше программное обеспечение так хорошо, имеет смысл платить)
- Заставьте их подписывать контракт и выполнять аудит лицензии, если это возможно.
В качестве альтернативы, как это делает Pingon IDE WingIDE: Отдать код. Правильно, отдайте код и верните людей для обновления и поддержки.
Вы видели pyminifier? Он выполняет Minify, obfuscate и сжимает код Python. Пример кода выглядит довольно неприятным для случайной обратной инженерии.
Хорошая идея в этом заключается в том, чтобы деморализовать любого, кто пытается расшифровать функциональность. Объедините это с Cython и некоторыми дополнительными модулями шифрования или интернет-звонками, и вы, вероятно, получите приз.
У файлов .pyc для доставки есть свои проблемы: они не совместимы ни с одной другой версией python, кроме версии python, с которой они были созданы, что означает, что вы должны знать, какая версия python работает в системах, на которых будет работать продукт. Это очень ограничивающий фактор.
В некоторых случаях может быть возможно перемещать (все или, по крайней мере, ключевую часть) программного обеспечения в веб-службу, которую размещает ваша организация.
Таким образом, проверки лицензии могут выполняться в безопасности вашей собственной серверной комнаты.
+1 (назад к 0): кажется, единственно верное решение проблемы, если принять такой подход в качестве практического для постановки.
Имейте в виду, что если ваш лицензионный веб-сервер отключится или клиентский доступ к Интернету будет недоступен, ваши клиенты не будут рады, что они не могут вести свой бизнес из-за потери доступа к проверкам лицензирования.
@DevPlayer Есть решения для этого. Вы можете реализовать механизм локального ключа, который разрешает временный доступ, когда программное обеспечение не может получить доступ к удаленному серверу лицензирования.
@Джеффри: Это вернет вас туда, откуда вы начали - как защитить этот код. Чтобы быть более безопасным, вам нужно разместить некоторые ключевые функции на своем собственном сервере, поэтому замена его потребует значительных усилий (в какой момент, почему бы не начать конкурента с открытым исходным кодом?)
Хотя нет идеального решения, можно сделать следующее:
- Переместите некоторый критический фрагмент кода запуска в собственную библиотеку.
- Обеспечьте проверку лицензии в собственной библиотеке.
Если вызов собственного кода должен быть удален, программа не запускается в любом случае. Если он не будет удален, лицензия будет применена.
Хотя это не кросс-платформенное или чисто-Python-решение, оно будет работать.
Подход с использованием нативной библиотеки значительно упрощает программную обработку вашей системы лицензионных ключей, поскольку они могут использовать ваш собственный код и API для проверки своих лицензий.
Так? Используйте RSA, чтобы подписать вашу лицензию и позволить им перебор вашего личного ключа, скажем, состоящего из 1024 бит. Это возможно, но занимает много времени . и, следовательно, - деньги.
Я думаю, что есть еще один способ защитить свой код Python; часть метода Обфускации. Я верю, что была такая игра, как Mount and Blade или что-то, что изменилось и перекомпилировало собственный интерпретатор python (оригинальный интерпретатор, который, как я считаю, является открытым исходным кодом), и просто изменил коды OP в таблице OP-кода, чтобы отличаться от стандартного python OP коды.
Таким образом, источник python немодифицирован, но размеры файлов pyc различны, а op-коды не соответствуют общедоступному интерпретатору python.exe. Если вы проверили файлы данных игр, все данные были в исходном формате Python.
Всевозможные неприятные трюки могут быть сделаны, чтобы помешать хакерским хакерам таким образом. Остановить кучу хаосов noob легко. Это про-хакеры, которых вы вряд ли победите. Но большинство компаний не заставляют профессиональных хакеров работать с людьми, которых я представляю (вероятно, из-за того, что все становится взломанным). Но хакерские хакеры повсюду (читайте как любопытный ИТ-персонал).
Вы можете, например, в модифицированном интерпретаторе разрешить ему проверять наличие определенных комментариев или docstrings в вашем источнике. У вас могут быть специальные коды OP для таких строк кода. Например:
Один вариант использования, когда перекомпиляция модифицированного интерпретатора может быть осуществимым, - это то, где вы не писали приложение, приложение большое, но вам платят за его защиту, например, когда вы являетесь выделенным администратором сервера для финансового приложение.
Мне кажется, что немного противоречить тому, чтобы исходный код или коды операций были открыты для глазных яблок, но используйте SSL для сетевого трафика. SSL не является на 100% безопасным. Но он использовал, чтобы остановить глаза МОСТЫ от его чтения. Меньшая мера предосторожности разумна.
Кроме того, если достаточно людей считают, что источник Python и коды операций слишком заметны, вероятно, кто-то в конечном итоге разработает хотя бы простой инструмент защиты. Таким образом, чем больше людей, спрашивающих "как защитить приложение Python", только продвигает эту разработку.
Как я могу кодировать этот пример, чтобы он не читался человеком? Мне сказали использовать base64, но я не уверен, как.
Это только ограниченное решение обфускации первого уровня, но оно встроено: в Python есть компилятор для байт-кода:
создает файл .pyo , содержащий байт-код, где удаляются строки документации и т.д. Вы можете переименовать файл .pyo с расширением .py , и python работает как ваша программа, но не содержит ваш исходный код код.
PS: “ограниченный” уровень запутывания, который вы получаете, таков, что можно восстановить код (с некоторыми именами переменных, но без комментариев и строк документации). Смотрите первый комментарий, как это сделать. Однако в некоторых случаях этот уровень запутывания может считаться достаточным.
PPS: Если ваша программа импортирует модули, запутанные таким образом, то вам нужно вместо этого переименовать их с суффиксом .pyc (я не уверен, что это однажды не сломается), или вы можете работать с .pyo и запускать их с python -O ….pyo (импорт должен работать). Это позволит Python найти ваши модули (в противном случае Python ищет модули .py ).
чтобы он не читался человеком?
i означает, что все файлы закодированы!! когда вы его открываете, вы ничего не можете понять. что я хочу
Как максимум, вы можете скомпилировать источники в байт-код, а затем распространять только байт-код. Но даже это обратимо. Байткод может быть декомпилирован в получитаемые источники.
Base64 тривиально декодировать для всех, поэтому он не может служить реальной защитой и будет скрывать источники только от полных неграмотных ПК. Более того, если вы планируете фактически запустить этот код любым способом, вам нужно будет включить декодер прямо в script (или другой script в вашем дистрибутиве, который должен был запускаться законным пользователем), и это немедленно отмените кодирование/шифрование.
Методы обфускации обычно включают в себя удаление комментариев/документов, манипулирование именами, вставку кода мусора и т.д., поэтому даже если вы декомпилируете байт-код, вы получаете не очень читаемые источники. Но они все равно будут источниками Python, и Python не способен стать нечитаемым беспорядком.
Если вам абсолютно необходимо защитить некоторые функциональные возможности, я бы посоветовал перейти на скомпилированные языки, такие как C или С++, компилировать и распространять .so/.dll, а затем использовать привязки Python к защищенному коду.
Вы можете использовать base64 module для кодирования строк для остановки плечо серфинга, но это не остановит кого-то, кто найдет ваш код, если у них будет доступ к вашим файлам.
Затем вы можете использовать функцию compile() и eval() функция, чтобы выполнить свой код после его декодирования.
Итак, если у вас есть 30 строк кода, вы, вероятно, захотите зашифровать его, сделав что-то вроде этого:
Затем вам понадобится написать второй script, который будет compile() и eval() , который, вероятно, будет включать кодированный script как строковый литерал, заключенный в тройные кавычки. Поэтому он выглядит примерно так:
Вы можете встроить свой код и скомпилировать/запустить из программы на C/C++.
Встраивание Python в другое приложение
embedded.c
В Ubuntu Debian
В сентос, редхат, федора
hello_world.py:
запустить скрипт Python
тем не менее, некоторые строки кода Python могут быть найдены в скомпилированном файле .c
Если вам нужна дополнительная безопасность, вы можете использовать base64 в своем коде
создайте строку base 64 вашего кода
embedded_base64.c
Хорошо, если вы хотите сделать полуобфускированный код, вы делаете код, подобный этому:
и создайте такой файл (используя приведенный выше код):
просто импортируйте “thing.py “и запустите run(something.code) , чтобы запустить код в файле.
Одна хитрость заключается в том, чтобы сделать код сложным для чтения при разработке: никогда не документируйте ничего, если нужно, просто дайте вывод функции, а не то, как она работает. Сделайте имена переменных очень широкими, ссылками на фильмы или противоположными примерами: где btmnsfavclr = 16777215 где “ btmnsfavclr ” означает “Любимый цвет Бэтмена”, а значение – 16777215 или десятичная форма “ ffffff ” или белый. Не забывайте смешивать разные стили именования, чтобы сохранить этих противных людей в вашем коде. Также используйте советы на этом сайте: Топ 11 советов по разработке не поддерживаемого кода.
Может быть, вы можете примерить пиконкрет
зашифровать .pyc в .pye и расшифровать при импорте
шифровать и дешифровать библиотекой OpenAES
использование
Полное шифрование
конвертировать все ваши .py в *.pye
удалить *.py *.pyc или скопировать *.pye в другую папку
main.py зашифрован как main.pye, он не может быть выполнен обычным python . Вы должны использовать pyconcrete для обработки сценария main.pye. pyconcrete (exe) будет установлен в вашем системном пути (например: /usr/local/bin)
Частично зашифрован (pyconcrete как lib)
скачать исходный код pyconcrete и установить с помощью setup.py
импортировать pyconcrete в ваш основной скрипт
план проекта рекомендации
Реальность заключается в том, что Python не подходит для использования, если вы хотите запутать код. В этой публикации есть отличные обсуждения по этому поводу.
Я бы маскировал код следующим образом:
закодированные:
Возможно, вам следует использовать что-то простое, например truecrypt volume для хранения исходного кода, так как это, похоже, является вашей заботой. Вы можете создать зашифрованный файл на USB-ключе или просто зашифровать весь том (при условии, что код подойдет), чтобы вы могли просто взять ключ с собой в конце дня.
Для компиляции вы можете использовать что-то вроде PyInstaller или py2exe, чтобы создать автономный исполняемый файл. Если вы действительно хотите пройти лишнюю милю, загляните в упаковщик или утилиту сжатия, чтобы добавить больше запутывания. Если ни одна из этих опций не является опцией, вы можете по крайней мере скомпилировать скрипт в байт-код, чтобы он не сразу читался. Имейте в виду, что эти методы просто замедляют попытки отладки или декомпиляции вашей программы.
Недавно я наткнулся на этот пост: Обфускация исходного кода Python с использованием AST, где автор рассказывает об обфускации исходного файла Python с помощью встроенного модуля AST. Скомпилированный двоичный файл должен был использоваться для HitB CTF и как таковой имел строгие требования запутывания.
Поскольку вы получаете доступ к отдельным узлам AST, использование этого подхода позволяет выполнять произвольные модификации исходного файла. В зависимости от того, какие преобразования вы выполняете, результирующий двоичный файл может/не может вести себя точно так же, как и не скрытый источник.
Как утверждают другие ответы, на самом деле просто не так хорошо. Base64 можно декодировать. Байткод может быть декомпилирован. Первоначально Python был просто истолкован, и большинство интерпретируемых языков пытаются ускорить интерпретацию машины больше, чем затруднить интерпретацию человеком.
Python был сделан читаемым и доступным, а не запутанным. Языковые решения о том, как код должен быть отформатирован, должны были повысить удобочитаемость для разных авторов.
Obfuscating код python просто не привязан к языку. Переоцените свои причины для запутывания кода.
Теперь есть pyminifier пакет, который может быть полезен. Он запутывает, минимизирует и сжимает код Python.
Это (как было опубликовано ранее) почти полностью бесполезно, но если вы действительно этого хотите, вы можете использовать альтернативную кодировку, например, ROT13.
Есть 2 способа запутать скрипты Python
- Запутывать байтовый код каждого объекта кода
- Запутать весь объект кода модуля Python
Запутывать скрипты Python
Скомпилировать исходный файл python в объект кода
Повторите объект кода, оберните байт-код каждого объекта кода следующим форматом
Сериализация объекта кода и его запутывание
Создайте сценарий оболочки “xxx.py”, $ обозначает строковую константу, сгенерированную на предыдущем шаге.
Запускать или импортировать запутанные скрипты Python
Когда вы импортируете или запускаете этот скрипт-обертку, первый оператор должен вызвать CFunction:
Эта функция принимает 2 параметра: имя модуля и запутанный код, затем
- Восстановить запутанный код
- Создать объект кода по оригинальному коду
- Импортировать оригинальный модуль (это приведет к дублированию кадра в
Traceback)
Запустить или импортировать запутанный байт-код
После импорта модуля, когда вызывается любой объект кода в этом модуле
в первый раз из упакованного байт-кода, описанного в предыдущем разделе, мы
знать
Первая операция JUMP_ABSOLUTE переходит к смещению n
При смещении n инструкция должна вызвать функцию PyCFunction. Эта функция
восстановит запутанный байт-код между смещением 3 и n, и
поместите оригинальный байт-код со смещением 0
После вызова функции последняя инструкция возвращается к
смещение 0. Реальный байт-код теперь выполняется
Cython
В двух словах, это превращает ваш питон в C и компилирует его, таким образом делая его так же хорошо защищенным, как любая “обычная” скомпилированная распространяемая C-программа.
Хотя есть ограничения. Я не изучал их подробно сам, потому что, когда я начал читать о них, я отбросил идею для своих собственных целей. Но это все еще может работать для вас. По сути, вы не можете использовать Python в полной мере, с динамической удивительностью, которую он предлагает. Одна из главных проблем, которая возникла у меня, заключалась в том, что параметры ключевых слов нельзя использовать 🙁 Вы должны писать вызовы функций, используя только позиционные параметры. Я не подтвердил это, но я сомневаюсь, что вы можете использовать условный импорт или evals. не уверен, как полиморфизм обрабатывается…
В любом случае, если вы не пытаетесь запутать огромную базу кода после факта, или в идеале, если у вас есть намерение использовать Cython для начала, это очень заметный вариант.
OpY
Opy запутает ваш обширный, реальный, многомодульный исходный код Python бесплатно! И ВЫ выбираете для каждого проекта, что скрывать, а что нет, редактируя файл конфигурации:
В отличие от некоторых других опций, опубликованных, это работает как для Python 2, так и для 3 ! Это также бесплатно/с открытым исходным кодом, и это не только онлайн-инструмент (если вы не платите), как некоторые другие там.
По общему признанию, я все еще оцениваю это сам, но все начальные тесты этого работали отлично. Похоже, это именно то, что я искал!
Официальная версия запускается как отдельная утилита, с первоначальным заданием, согласно которому вы помещаете скрипт в корень каталога, который вы хотите скрыть, вместе с файлом конфигурации, чтобы определить детали/опции, которые вы хотите использовать. Я не был влюблен в этот план, поэтому я добавил ответвление от проекта, позволяющее вам импортировать и использовать инструмент из библиотеки. Таким образом, вы можете свернуть это непосредственно в более полный пакетный скрипт. (Конечно, вы можете обернуть несколько сценариев py в bash/batch, но я думаю, что чисто Python-решение идеально). Я попросил, чтобы мой форк был объединен с оригинальной работой, но в случае, если этого не произойдет, вот URL моей исправленной версии:
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
Многие задаются вопросом - как скрыть исходный код написанных на питоне скриптов, чтобы затем можно было например продавать эти скрипты. В своё время и мы задались этим вопросом, в следствии чего со временем нашли его решение.
Можно было бы просто отдавать клиентам байт-код, который создает python при первом запуске скрипта. Например, запустили test.py, рядом появился test.pyc, его и продаем. Однако в сети есть скрипты, которые восстанавливают из него исходный код с точностью до байта.
Поэтому, чтобы закрыть сорцы скрипта - его надо скомпилировать. Для этого, с помощью расширения cython его можно перевести в Си код, который и скомпилировать обычными инструментами, вроде make.
Рассмотрим решение пошагово:
- Конвертируем python-скрипт в Си:
Получаем СКРИПТ.c - это исходный код python-модуля, который выполняет то же самое что и питон-скрипт.
Компилируем полученный Си-файл:
Получаем объектный файл СКРИПТ.о
Осталось слинковать его в бинарник. Так как примеры выполняются на линуксе, он будет иметь расширение .so:
На Windows расширение будет .pyd
Таким образом мы имеем новый модуль для питона "СКРИПТ.so",
который можно импортировать в код других скриптов:
Инкапсуляция – это упаковка данных в единый компонент. Сокрытие – это механизм, позволяющий ограничить доступ к данным вне какой-то области. Это немного разные принципы, хотя обычно о них говорят как об одном: мы что-то упаковали в класс, а потом сокрыли от нежелательного доступа из-вне. Можете козырнуть где-нибудь на собеседовании.
Скрывать от доступа из-вне имеет смысл, когда в вашем классе есть данные только для внутреннего использования, и вам нужно защитить от их изменения (будь-то случайного или преднамеренного) из других участков кода.
В Python мы вроде бы доверяем друг другу, и все члены класса по-умолчанию доступны из-вне. Остается лишь соглашение о том, что кто-то их не будет трогать без необходимости.
Никаких вам private/protected.
Попытались обмануть, даже что-то там присвоили, но не нанесли урона классу! Но я знаю колдунство посильнее:
Python не смог окончательно спрятать атрибут.
Работает это так: если имя атрибута начинается с двух подчеркиваний, то Python автоматически переименует его по шаблону _ИмяКласса__ИмяАтрибута. Но! Внутри класса он будет доступен по старому имени: __ИмяАтрибута.
Эта смешная игра в прятки в действительности имеет смысл. От злонамеренного изменения мы не сможем защититься таким образом, а от случайного – да. Вообразим ситуацию с наследованием:
В производном классе мы можем и не знать, что в нашем базовом есть переменная с таким же именем, но при совпадении – мы не нарушим работы базового класса, так как внутри это будут переменные с именами _Base__x и _Derived__x.
Тот же эффект будет и с методами, и с переменными на уровне класса (а не экземпляра).
__setattr__
В одном из примеров мы умудрились установить классу атрибут, которого изначально не было в нем. Если такое поведение нежелательно, то можно определить магический метод __setattr__, который будет проверять, какой атрибут мы хотим установить и кидать исключение, если кто-то хочет записать в класс то, что мы не хотим у себя видеть.
Но сразу скажу, обычно такую защиту никто не делает. Давайте без фанатизма…
Ограничение экспорта из модулей
Еще один механизм сокрытия – сокрытие сущностей (классов, функций и т. п.) на уровне модулей от бездумного импорта.
Напишем модуль. То есть создаем папку с именем testpack, туда кладем файл __init__.py
Далее в другом файле (из основной директории) мы попытаемся импортировать (все – *) из модуля testpack.
Имя foo было импортировано, так как мы упомянули его в переменной __all__, а bar – нет. Эта все та же защита от дурака, потому что если мы намеренно импортируем bar – ни ошибок, ни предупреждений не последует.
Еще одно замечание: если имя переменной (класса, функции) начинается с подчеркивания, то оно так же не будет импортировано при import *, даже если мы не применяем __all__. И как всегда, вы можете импортировать его вручную.
Читайте также: