Как защитить код Python?
Я разрабатываю часть программного обеспечения на Python, которое будет распространено среди моих клиентов-работодателей. Мой работодатель хочет ограничить использование программного обеспечения ограниченным временем файлом лицензии.
Если мы распространем файлы .py или даже .pyc, будет легко (декомпилировать и) удалить код, который проверяет файл лицензии.
Еще один аспект заключается в том, что мой работодатель не хочет, чтобы код читался нашими клиентами, опасаясь, что код может быть украден или, по крайней мере, "новые идеи".
Есть ли хороший способ справиться с этой проблемой? Предпочтительно с готовым решением.
Программное обеспечение будет работать в системах Linux (поэтому я не думаю, что py2exe сделает трюк).
Ответы
Ответ 1
Python, являющийся интерпретированным языком с байтовым кодом, очень затрудняет блокировку. Даже если вы используете exe-packager, например py2exe, макет исполняемого файла хорошо известен, а байт-коды Python хорошо понимать.
Обычно в таких случаях вам нужно сделать компромисс. Насколько важно защищать код? Существуют ли там настоящие секреты (например, ключ для симметричного шифрования банковских переводов), или вы просто параноик? Выберите язык, который позволит вам быстрее разработать лучший продукт и быть реалистом в отношении того, насколько ценны ваши новые идеи.
Если вы решите, что вам действительно нужно принудительно обеспечить проверку лицензии, напишите его как небольшое расширение C, чтобы код проверки лицензии мог быть сверхжестким (но не невозможным!) для обратной инженерии и оставить основную часть вашего кода в Python.
Ответ 2
"Есть ли хороший способ справиться с этой проблемой?" Нет. Ничто не может быть защищено от обратной инженерии. Даже прошивка на DVD-машинах была обратная инженерия и ключ AACS Encryption выставлен. И это несмотря на то, что DMCA делает это уголовным преступлением.
Поскольку ни один технический метод не может запретить вашим читателям читать ваш код, вы должны применять обычные коммерческие методы.
-
Лицензии. Контракты. Условия и положения. Это все еще работает, даже когда люди могут читать код. Обратите внимание, что некоторые из ваших компонентов на базе Python могут потребовать, чтобы вы платили комиссионные, прежде чем продавать программное обеспечение с использованием этих компонентов. Кроме того, некоторые лицензии с открытым исходным кодом запрещают вам скрывать источник или источник этого компонента.
-
Предлагаем значительную ценность. Если ваши вещи настолько хороши - по цене, которую трудно отказать, нет стимула тратить время и деньги на обратное проектирование. Обратное проектирование дорого. Сделайте свой продукт немного дешевле.
-
Предлагайте обновления и улучшения, которые делают любую обратную разработку плохими идеями. Когда следующий релиз нарушает их обратную инженерию, нет смысла. Это может быть доведено до абсурдных крайностей, но вы должны предложить новые функции, которые делают следующий выпуск более ценным, чем обратная инженерия.
-
Предлагайте персонализацию по таким привлекательным ценам, что они предпочитают оплачивать вам сборку и поддержку улучшений.
-
Используйте срок действия лицензионного ключа. Это жестоко, и вы получите плохую репутацию, но это, безусловно, заставляет ваше программное обеспечение перестать работать.
-
Предлагайте его как веб-сервис. SaaS не требует загрузки для клиентов.
Ответ 3
Python - это не тот инструмент, который вам нужен
Вы должны использовать правильный инструмент для правильной работы, и Python не был предназначен для обфускации. Это наоборот; все открыто или легко обнаружить или изменить в Python, потому что это философия языка.
Если вы хотите что-то, чего не видите, найдите другой инструмент. Это не так уж плохо, важно, чтобы для разных видов использования существовало несколько различных инструментов.
Обфускация действительно сложна
Даже скомпилированные программы могут быть обратно спроектированы, поэтому не думайте, что вы можете полностью защитить любой код. Вы можете анализировать запутанный PHP, разбить ключ шифрования флэш-памяти и т.д. Новые версии Windows трещины каждый раз.
Наличие юридического требования - это хороший способ пойти
Вы не можете помешать кому-либо злоупотреблять вашим кодом, но вы можете легко обнаружить, если кто-то это сделает. Поэтому это просто случайная юридическая проблема.
Защита кода переоценена
В настоящее время бизнес-модели, как правило, идут на продажу услуг, а не на продукты. Вы не можете копировать службу, пират или не красть ее. Может быть, пришло время подумать о том, чтобы пойти с потоком...
Ответ 4
Компиляция python и распространение двоичных файлов!
Разумная идея:
Используйте Cython, Nuitka, Shed Skin или что-то похожее на компиляцию python на C-код, а затем распределите приложение как бинарные библиотеки python (pyd).
Таким образом, код Python (байт) не оставлен, и вы сделали любое разумное количество омрачения, которое, как мне кажется, может ожидать любой (т.е. Ваш работодатель) от обычного кода. (.NET или Java менее безопасны, чем этот случай, поскольку этот байт-код не запутывается и его можно легко декомпилировать в разумный источник).
Cython становится все более и более совместимым с CPython, поэтому я думаю, что он должен работать. (Я действительно рассматриваю это для нашего продукта.. Мы уже создаем некоторые сторонние библиотеки как pyd/dll, поэтому отправка нашего собственного кода на Python в качестве двоичных файлов для нас не является слишком большим шагом).
См. Эту статью в блоге (не я) для учебника о том, как это сделать. (спасибо @hithwen)
Сумасшедшая идея:
Вероятно, вы могли бы заставить Cython хранить C файлы отдельно для каждого модуля, а затем просто конкатенировать их все и построить их с сильной вставкой. Таким образом, ваш Python-модуль довольно монолитный и сложный для чипа с помощью обычных инструментов.
Помимо сумасшедших:
Возможно, вы сможете создать единый исполняемый файл, если вы можете связать (и оптимизировать с) время выполнения python и все библиотеки (dll) статически. Таким образом, было бы трудно перехватить вызовы на/из python и любых используемых вами библиотек. Этого нельзя сделать, если вы используете код LGPL.
Ответ 5
Я понимаю, что вы хотите, чтобы ваши клиенты использовали мощь python, но не хотите выставлять исходный код.
Вот мои предложения:
(a) Напишите критические фрагменты кода как библиотеки C или С++, а затем используйте SIP или swig, чтобы показать API-интерфейсы C/С++ в пространстве имен Python.
(b) Используйте cython вместо Python
(c) В обоих (a) и (b) должно быть возможно распределить библиотеки как лицензированные двоичные файлы с интерфейсом Python.
Ответ 6
Знает ли ваш работодатель, что он может "украсть" любые идеи, которые другие люди получают от вашего кода? Я имею в виду, если они смогут читать твою работу, так ты можешь их. Возможно, глядя на то, как вы можете извлечь выгоду из этой ситуации, вы получите лучшую отдачу от своих инвестиций, чем боитесь, сколько вы можете потерять.
[EDIT] Отвечать на комментарий Nick:
Ничего не получилось и ничего не потеряно. У клиента есть то, что он хочет (и заплатил за него, так как сам сделал это изменение). Поскольку он не выпускает изменения, он, как будто это не произошло для всех остальных.
Теперь, если клиент продает программное обеспечение, он должен изменить уведомление об авторских правах (что является незаконным, поэтому вы можете подать в суд и выиграть → простой случай).
Если они не изменят уведомление об авторских правах, клиенты второго уровня заметят, что программное обеспечение исходит от вас оригинальным и задается вопросом, что происходит. Скорее всего, они свяжутся с вами, и вы узнаете о перепродаже своей работы.
Снова у нас есть два случая: оригинальный клиент продал всего несколько экземпляров. Это значит, что они не зарабатывали много денег, так зачем беспокоиться. Или они продаются по объему. Это означает, что вам лучше узнать, что они делают и что-то с этим поделать.
Но в конце концов, большинство компаний пытаются подчиниться закону (как только их репутация разрушена, гораздо труднее заниматься бизнесом). Поэтому они не украдут вашу работу, а будут работать с вами, чтобы улучшить ее. Поэтому, если вы включите источник (с лицензией, которая защищает вас от простой перепродажи), скорее всего, они просто отбросят изменения, которые они сделали, поскольку они будут следить за тем, чтобы изменения находились в следующей версии, и им не нужно ее поддерживать, Это беспроигрышное: вы получаете изменения, и они могут внести изменения сами, если они действительно, отчаянно нуждаются в нем, даже если вы не хотите включать его в официальный релиз.
Ответ 7
Вы видели pyminifier? Он выполняет Minify, obfuscate и сжимает код Python. Пример кода выглядит довольно неприятным для случайной обратной инженерии.
$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ=ImportError
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱=print
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ巡=False
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ澨=object
try:
import demiurgic
except ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ:
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Warning: You're not demiurgic. Actually, I think that normal.")
try:
import mystificate
except ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ:
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Warning: Dark voodoo may be unreliable.")
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺬ=ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ巡
class ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐦚(ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ澨):
def __init__(self,*args,**kwargs):
pass
def ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ클(self,dactyl):
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ퐐=demiurgic.palpitation(dactyl)
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𠛲=mystificate.dark_voodoo(ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ퐐)
return ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𠛲
def ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐠯(self,whatever):
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱(whatever)
if __name__=="__main__":
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Forming...")
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺃ=ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐦚("epicaricacy","perseverate")
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺃ.ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐠯("Codswallop")
# Created by pyminifier (https://github.com/liftoff/pyminifier)
Ответ 8
Не полагайтесь на обфускацию. Как вы правильно сделали вывод, он предлагает очень ограниченную защиту.
UPDATE: ссылка на бумагу, которая сбрасывает инженерный запущенный код python в Dropbox. Переопределение кода - это хороший барьер, но он явно может быть побежден.
Вместо этого, как упоминалось много плакатов, сделайте это:
- Не стоит обратного времени разработки (ваше программное обеспечение так хорошо, имеет смысл платить)
- Заставьте их подписывать контракт и выполнять аудит лицензии, если это возможно.
В качестве альтернативы, как это делает Pingon IDE WingIDE: Отдать код. Правильно, отдайте код и верните людей для обновления и поддержки.
Ответ 9
У файлов .pyc для доставки есть свои проблемы: они не совместимы ни с одной другой версией python, кроме версии python, с которой они были созданы, что означает, что вы должны знать, какая версия python работает в системах, на которых будет работать продукт. Это очень ограничивающий фактор.
Ответ 10
В некоторых случаях может быть возможно перемещать (все или, по крайней мере, ключевую часть) программного обеспечения в веб-службу, которую размещает ваша организация.
Таким образом, проверки лицензии могут выполняться в безопасности вашей собственной серверной комнаты.
Ответ 11
Хотя нет идеального решения, можно сделать следующее:
- Переместите некоторый критический фрагмент кода запуска в собственную библиотеку.
- Обеспечьте проверку лицензии в собственной библиотеке.
Если вызов собственного кода должен быть удален, программа не запускается в любом случае. Если он не будет удален, лицензия будет применена.
Хотя это не кросс-платформенное или чисто-Python-решение, оно будет работать.
Ответ 12
Надежный единственный способ защитить код - запустить его на сервере, которым вы управляете, и предоставить своим клиентам клиент, который взаимодействует с этим сервером.
Ответ 13
Я думаю, что есть еще один способ защитить ваш код Python; часть метода запутывания. Я полагаю, что была такая игра, как Mount and Blade или что-то, что изменило и перекомпилировало их собственный интерпретатор python (оригинальный интерпретатор, который, я считаю, с открытым исходным кодом) и просто изменило коды OP в таблице кодов OP, чтобы они отличались от стандартных OP Python. коды.
Таким образом, исходный код python не изменен, но расширения файлов *.pyc отличаются, и коды операций не соответствуют общедоступному интерпретатору python.exe. Если вы проверили файлы данных игр, все данные были в исходном формате Python.
Таким образом можно совершать всевозможные неприятные трюки, чтобы связываться с незрелыми хакерами. Остановить кучу неопытных хакеров легко. Это профессиональные хакеры, которых вы вряд ли победите. Но я полагаю, что большинство компаний не держат профессиональных хакеров в штате долго (вероятно, потому что все взломано). Но незрелые хакеры повсюду (читай, как любопытный ИТ-персонал).
Например, вы можете в модифицированном интерпретаторе разрешить ему проверять определенные комментарии или строки документа в вашем источнике. Вы можете иметь специальные OP-коды для таких строк кода. Например:
ОП 234 предназначен для строки исходного текста "# Авторские права я написал это" или скомпилирует эту строку в коды операций, которые эквивалентны "if False:", если отсутствует "# Copyright". По сути, отключение целого блока кода по неясной причине.
Один из вариантов использования, когда возможна перекомпиляция измененного интерпретатора, - это когда вы не писали приложение, оно большое, но вам платят за его защиту, например, когда вы являетесь администратором выделенного сервера для финансового приложения.
Я считаю несколько противоречивым оставлять исходные коды или коды операций открытыми для глазных яблок, но использовать SSL для сетевого трафика. SSL также не безопасен на 100%. Но раньше это мешало большинству глаз читать это. Небольшая предосторожность разумна.
Кроме того, если достаточное количество людей сочтет, что исходный код и коды операций Python слишком видны, вероятно, кто-то в конечном итоге разработает хотя бы простой инструмент защиты для него. Поэтому все больше людей, спрашивающих, "как защитить приложение Python", только способствует этой разработке.
Ответ 14
В зависимости от того, кем является клиент, простой механизм защиты в сочетании с разумным лицензионным соглашением будет намного более эффективным, чем любая сложная система лицензирования/шифрования/обфускации.
Лучшим решением будет продажа кода в качестве услуги, например, путем размещения сервиса или поддержки, хотя это не всегда удобно.
Отгрузка кода в виде файлов .pyc
предотвратит вашу защиту, которая будет сдерживаться несколькими #
s, но вряд ли эффективна защита от пиратства (как будто есть такая технология), и в конце дня, он не должен добиваться чего-либо, что будет иметь достойное лицензионное соглашение с компанией.
Сосредоточьтесь на том, чтобы сделать ваш код таким же приятным, насколько это возможно - счастливые клиенты сделают вашу компанию гораздо больше денег, чем предотвращение теоретического пиратства.
Ответ 15
Используйте Cython. Он скомпилирует ваши модули в высокопроизводительные C файлы, которые затем могут быть скомпилированы в собственные двоичные библиотеки. По сути это необратимый код по сравнению с байт-кодом .pyc!
Я написал подробную статью о том, как настроить Cython для проекта Python, посмотрите его:
Защита исходников Python с помощью Cython
Ответ 16
Еще одна попытка сделать ваш код сложнее воровать - использовать jython, а затем использовать java obfuscator.
Это должно работать очень хорошо, как jythonc переводить код python в java, а затем java скомпилируется в байт-код. Таким образом, унция, которую вы запутываете в классах, будет очень трудно понять, что происходит после декомпиляции, не говоря уже о восстановлении реального кода.
Единственная проблема с jython заключается в том, что вы не можете использовать модули python, написанные с помощью c.
Ответ 17
Вы должны посмотреть, как ребята на getdropbox.com делают это для своего клиентского программного обеспечения, включая Linux. Это довольно сложно взломать и требует некоторой довольно творческой разборки, чтобы преодолеть механизмы защиты.
Ответ 18
Как насчет подписания кода со стандартными схемами шифрования путем хэширования и подписания важных файлов и проверки его с помощью методов открытого ключа?
Таким образом вы можете выпустить файл лицензии с открытым ключом для каждого клиента.
Дополнительно вы можете использовать обфускатор python, например этот (только для Google).
Ответ 19
Я был удивлен тем, что не увидел пиконкрет в любом ответе. Может потому что это новее, чем вопрос?
Это может быть именно то, что вам нужно (ред.).
Вместо того, чтобы запутывать код, он шифрует его и расшифровывает во время загрузки.
Со страницы Pypi:
Защитить рабочий процесс скрипта Python
- your_script.py
import pyconcrete
- Pyconcrete подключит модуль импорта
- когда ваш скрипт импортирует
MODULE
, хук импорта MODULE.pye
сначала найти MODULE.pye
а затем расшифровать MODULE.pye
через _pyconcrete.pyd
и выполнить расшифрованные данные (как содержимое .pyc) - Зашифруйте и расшифруйте запись секретного ключа в
_pyconcrete.pyd
(например, DLL или SO), секретный ключ будет _pyconcrete.pyd
в двоичном коде, его нельзя увидеть непосредственно в представлении HEX
Ответ 20
Лучшее, что вы можете сделать с Python, - это затмить вещи.
- Удалите все docstrings
- Распространять только скомпилированные файлы .pyc.
- заморозить его
- Неясные константы внутри класса/модуля, так что help (config) не отображает все
Возможно, вы сможете добавить дополнительную неясность, зашифровав ее часть и дешифруя ее на лету и передав ее в eval(). Но независимо от того, что вы делаете, кто-то может сломать его.
Ничто из этого не остановит определенного злоумышленника от разборки байт-кода или копания через api с помощью, dir и т.д.
Ответ 21
Идея иметь ограниченную по времени лицензию и проверять ее в локально установленной программе не будет работать. Даже при идеальной обфускации проверка лицензии может быть удалена. Однако, если вы проверяете лицензию на удаленной системе и выполняете значительную часть программы на своей закрытой удаленной системе, вы сможете защитить свой IP-адрес.
Предотвращение того, чтобы конкуренты использовали исходный код как свой собственный или записывали свою вдохновленную версию того же кода, одним из способов защиты является добавление подписей в вашу программную логику (некоторые секреты, чтобы иметь возможность доказать, что код был украден у вас) и обфускать исходный код python, поэтому его трудно читать и использовать.
Хорошая обфускация добавляет в основном ту же самую защиту к вашему коду, что и его компиляция в исполняемый файл (и удаление двоичных файлов). Выяснение того, как работает запущенный комплексный код, может быть еще сложнее, чем на самом деле писать собственную реализацию.
Это не поможет предотвратить взлом вашей программы. Даже при использовании кода обфускации лицензионный материал будет взломан, и программа может быть изменена, чтобы иметь несколько другое поведение (точно так же, как компиляция кода в двоичный файл не помогает защите собственных программ).
В дополнение к обфускации символов может быть хорошей идеей, чтобы не подвергать сомнению код, что делает все еще более запутанным, если, например, диаграммы вызовов указывают на множество разных мест, даже если на самом деле эти разные места в конечном итоге совпадают.
Логическая подпись внутри обфускации кода (например, вы можете создать таблицу значений, которая используется логикой программы, но также используется как подпись), которая может быть использована для определения того, что код возник из вас. Если кто-то решает использовать ваш обфусцированный модуль кода как часть своего собственного продукта (даже после повторного пуска его, чтобы он казался другим), вы можете показать, что этот код украден вашей секретной подписью.
Ответ 22
Я рассматривал защиту программного обеспечения в целом для своих собственных проектов, а общая философия заключается в том, что полная защита невозможна. Единственное, чего вы можете надеяться достичь, это добавить защиту на уровень, который будет стоить вашему клиенту больше, чтобы обойти, чем покупать другую лицензию.
Сказав это, я просто проверял google на обструкцию python и не поднимал много чего. В решении .Net обсчетация будет первым подходом к вашей проблеме на платформе Windows, но я не уверен, есть ли у кого-нибудь решения в Linux, которые работают с Mono.
Следующим шагом было бы написать ваш код на скомпилированном языке или если вы действительно хотите пройти весь путь, то в ассемблере. Урезанный исполняемый файл будет намного сложнее декомпилировать, чем интерпретируемый язык.
Все сводится к компромиссам. С одной стороны у вас есть простота разработки программного обеспечения в python, в которой также очень сложно скрывать секреты. На другом конце у вас есть программное обеспечение, написанное на ассемблере, которое намного сложнее написать, но гораздо проще скрыть секреты.
Ваш босс должен выбрать точку где-то вдоль этого континуума, который поддерживает его требования. И тогда он должен дать вам инструменты и время, чтобы вы могли построить то, что он хочет. Однако моя ставка заключается в том, что он будет возражать против реальных затрат на разработку в сравнении с потенциальными денежными потерями.
Ответ 23
www.bitboost.com предлагает обфускатор python. Полное раскрытие: автор мой друг.
Ответ 24
Возможно, что байт-код py2exe в зашифрованном ресурсе для пусковой установки C, который загружает и выполняет его в памяти. Некоторые идеи здесь и здесь.
Некоторые также подумали о программе самообновления, чтобы сделать обратную инженерию дорогостоящей.
Вы также можете найти учебники для предотвращения отладчиков, сделать дизассемблер неудачным, установить контрольные точки отладки и защитите свой код с помощью контрольных сумм. Найти "зашифрованный код" выполните "в памяти" ] для получения дополнительных ссылок.
Но, как уже говорили другие, если ваш код стоит того, обратные инженеры преуспеют в конце.
Ответ 25
Короче:
- Шифрование исходного кода
- Создайте свой собственный загрузчик модуля python, чтобы расшифровать свой код при импорте
- Внедрить загрузчик модуля в C/C++
- Вы можете добавить дополнительные функции загрузчику модуля, например, анти-отладчик, управление лицензиями, привязку аппаратного отпечатка пальца и т.д.
Для более подробной информации посмотрите этот ответ.
Если вас интересует эта тема, этот проект поможет вам - pyprotect.
Ответ 26
Если мы сосредоточимся на лицензировании программного обеспечения, я бы порекомендовал взглянуть на другой ответ о переполнении стека, который я написал здесь, чтобы получить представление о том, как можно построить систему проверки лицензионного ключа.
На GitHub есть библиотека с открытым исходным кодом, которая может помочь вам с проверкой лицензии.
Вы можете установить его, pip install licensing
а затем добавить следующий код:
pubKey = "<RSAKeyValue><Modulus>sGbvxwdlDbqFXOMlVUnAF5ew0t0WpPW7rFpI5jHQOFkht/326dvh7t74RYeMpjy357NljouhpTLA3a6idnn4j6c3jmPWBkjZndGsPL4Bqm+fwE48nKpGPjkj4q/yzT4tHXBTyvaBjA8bVoCTnu+LiC4XEaLZRThGzIn5KQXKCigg6tQRy0GXE13XYFVz/x1mjFbT9/7dS8p85n8BuwlY5JvuBIQkKhuCNFfrUxBWyu87CFnXWjIupCD2VO/GbxaCvzrRjLZjAngLCMtZbYBALksqGPgTUN7ZM24XbPWyLtKPaXF2i4XRR9u6eTj5BfnLbKAU5PIVfjIS+vNYYogteQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"
res = Key.activate(token="WyIyNTU1IiwiRjdZZTB4RmtuTVcrQlNqcSszbmFMMHB3aWFJTlBsWW1Mbm9raVFyRyJd",\
rsa_pub_key=pubKey,\
product_id=3349, key="ICVLD-VVSZR-ZTICT-YKGXL", machine_code=Helpers.GetMachineCode())
if res[0] == None not Helpers.IsOnRightMachine(res[0]):
print("An error occured: {0}".format(res[1]))
else:
print("Success")
Вы можете узнать больше о настройке открытого ключа RSA и т.д. Здесь.
Ответ 27
используя cxfreeze (py2exe для linux), выполнит задание.
http://cx-freeze.sourceforge.net/
он доступен в репозиториях ubuntu
Ответ 28
Использовать тот же способ для защиты двоичного файла c/С++, то есть обфускации каждого тела функции в исполняемом или библиотечном двоичном файле, вставить инструкцию "jump" в начале каждой записи функции, перейти к специальной функции для восстановления запутанный код. Байт-код - двоичный код Python script, поэтому
- Сначала скомпилируйте python script для кодового объекта
- Затем итерации каждого объекта кода, obfuscate co_code каждого объекта кода в следующем виде
0 JUMP_ABSOLUTE n = 3 + len(bytecode)
3
...
... Here it obfuscated bytecode
...
n LOAD_GLOBAL ? (__pyarmor__)
n+3 CALL_FUNCTION 0
n+6 POP_TOP
n+7 JUMP_ABSOLUTE 0
- Сохранить объект с запутанным кодом как .pyc или .pyo файл
Те обфусканные файлы (.pyc или .pyo) могут использоваться обычным интерпретатором python, когда этот объект кода вызывается впервые
-
Первый op - JUMP_ABSOLUTE, он будет переходить к смещению n
-
При смещении n команда должна вызвать PyCFunction. Эта функция восстановит обфускационный байт-код между смещением 3 и n и поместит исходный байт-код со смещением 0. Зафуфированный код можно получить по следующему коду
char *obfucated_bytecode;
Py_ssize_t len;
PyFrameObject* frame = PyEval_GetFrame();
PyCodeObject *f_code = frame->f_code;
PyObject *co_code = f_code->co_code;
PyBytes_AsStringAndSize(co_code, &obfucated_bytecode, &len)
-
После возвращения этой функции последняя команда должна перейти к
offset 0. Выполняется действительно байт-код.
Существует инструмент Pyarmor, чтобы обмануть скрипты python таким образом.