Как защитить код Python?

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

Если мы распространяем файлы .py или даже .pyc, будет легко (декомпилировать и) удалить код, который проверяет файл лицензии.

Другой аспект заключается в том, что мой работодатель не хочет, чтобы код читался нашими клиентами, опасаясь, что код может быть украден или, по крайней мере, «новые идеи».

Есть хороший способ справиться с этой проблемой? Желательно с готовым решением.

Программное обеспечение будет работать в системах Linux (поэтому я не думаю, что py2exe справится с задачей).

4.11.2008 11:57:27
py2exe просто хранит файлы байт-кода .pyc в архиве .zip, так что это определенно не решение. Тем не менее, это может быть полезно в сочетании с подходящим сценарием запуска, чтобы он работал под Linux
Ber 4.11.2008 12:35:25
Dog 25.04.2013 23:43:09
Это наиболее полный ответ на ваш вопрос: wiki.python.org/moin/Asking%20for%20Help/…
Mike 17.12.2019 06:33:49
28 ОТВЕТОВ
РЕШЕНИЕ

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

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

Если вы решите, что вам действительно нужно обеспечить безопасную проверку лицензии, запишите его в виде небольшого расширения C, чтобы код проверки лицензии был очень сложным (но не невозможным!) Для обратного инжиниринга, и оставьте большую часть кода в Python. ,

376
4.11.2008 12:00:34
Даже если код проверки лицензии было трудно реконструировать, потому что он написан на C, разве не было бы относительно легко удалить вызовы кода проверки лицензии?
Blair Conrad 4.11.2008 12:04:42
Да, в зависимости от того, где выполняется проверка лицензии. Если к внутреннему номеру поступает много вызовов, его может быть трудно искоренить. Или же вы можете переместить какую-то другую важную часть приложения в проверку лицензии, чтобы удаление вызова к расширению нанесло ущерб приложению.
Ned Batchelder 4.11.2008 12:10:26
Действительно, вся эта работа не о предотвращении модификации, а об увеличении ее сложности, чтобы она больше не стоила этого. Все, что угодно, может быть реконструировано и модифицировано, если есть достаточно преимуществ.
Ned Batchelder 4.11.2008 12:11:10
@Blair Conrad: Нет, если код проверки лицензии тоже скрывает функциональность. Напримерmylicensedfunction(licenseblob liblob, int foo, int bar, std::string bash)
Brian 9.08.2010 14:26:50
Я на самом деле видел коммерческий код Python, поставляемый как встроенный Python внутри библиотеки C. Вместо того, чтобы преобразовывать некоторые части кода в C, они скрывают весь код Python внутри защитного слоя C. Затем, если им нужен модуль, импортируемый Python, они пишут тонкое расширение Python поверх C. Открытый исходный код - намного более простой образ жизни.
Mike McKerns 4.02.2014 03:38:05

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

6
4.11.2008 12:20:21
но тот факт, что он был пройден, означал, что они потерпели неудачу - суть в том, что не пытайтесь, а обращайтесь за правовой защитой.
Chii 17.11.2008 09:52:52
Опубликована ли какая-либо информация о том, как пройти этот механизм защиты?
Mitar 20.11.2012 02:33:47

Знает ли ваш работодатель, что он может «украсть» любые идеи, которые другие люди получают из вашего кода? Я имею в виду, если они могут читать твои работы, ты можешь их. Возможно, рассмотрение того, как вы можете извлечь выгоду из сложившейся ситуации, принесет лучшую отдачу от ваших инвестиций, чем опасение того, сколько вы можете потерять.

[РЕДАКТИРОВАТЬ] Ответ на комментарий Ника:

Ничего не получено и ничего не потеряно. Клиент имеет то, что он хочет (и заплатил за это, так как он сделал изменение самостоятельно). Так как он не выпускает изменения, как будто это не случилось для всех остальных.

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

Если они не изменят уведомление об авторских правах, клиенты 2-го уровня заметят, что программное обеспечение исходит от вас, и зададутся вопросом, что происходит. Скорее всего, они свяжутся с вами, и вы узнаете о перепродаже вашей работы.

Опять же у нас есть два случая: оригинальный клиент продал только несколько копий. Это означает, что они все равно не заработали много денег, так зачем беспокоиться. Или они продаются в объеме. Это означает, что у вас больше шансов узнать, что они делают, и что-то с этим сделать.

Но, в конце концов, большинство компаний пытаются соблюдать закон (как только их репутация разрушена, вести бизнес гораздо сложнее). Поэтому они не украдут вашу работу, а будут работать с вами, чтобы улучшить ее. Так что, если вы включите источник (с лицензией, которая защищает вас от простой перепродажи), есть вероятность, что они просто отодвинут изменения, которые они сделали, так как это гарантирует, что изменение будет в следующей версии, и им не нужно будет его поддерживать , Это беспроигрышный вариант: вы получаете изменения, и они могут внести изменения сами, если они действительно в них нуждаются, даже если вы не желаете включать их в официальный релиз.

34
20.02.2012 13:07:15
Что если они выпускают программное обеспечение для клиентов, а клиент изменяет его внутри, не переиздавая его?
Nick T 9.08.2010 13:36:57
@Nick: никак не меняет ситуацию. Смотрите мои правки.
Aaron Digulla 9.08.2010 14:14:00
+1 за кражу идей назад. Зачем ограничивать свои возможности обслуживания клиентов своими собственными решениями, если вы видите, как другие улучшают ваше решение и, соответственно, улучшают ваш собственный продукт? «Если у вас есть яблоко, а у меня есть яблоко, и мы обмениваем эти яблоки, то у вас и у меня все еще будет по одному яблоку. Но если у вас есть идея, и у меня есть идея, и мы обмениваемся этими идеями, то у каждого из нас будет две идеи. "
Jordan 30.04.2013 05:04:26
Что, если один из ваших клиентов повторно анонсирует ваш код или идеи бесплатно и анонимно? Вы не можете сказать, кто это сделал, и подать в суд на них, и потому что они не получили от этого выгоды, вы тоже не будете. Это разрушит вашу работу, в то время как один из ваших клиентов заплатил только базовую цену за нее. (очевидно, работает только если у вас есть более одного клиента для вашего решения)
Skandix 27.04.2018 11:05:06
@Skandix Как именно это будет работать? Загрузка вашей работы в Интернете не навредит вам. Это начнёт причинять вам вред, если многие найдут его И вместо этого будут платить покупателям. Кража кода - это миф. «Мои знания бесплатны, мое время дорого» (не уверен, кто это сказал).
Aaron Digulla 17.05.2018 07:33:13

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

С учетом сказанного я просто проверял Google на предмет обмана в Python и не обнаруживал много чего-либо. В решении .Net, obsfucation будет первым подходом к вашей проблеме на платформе Windows, но я не уверен, есть ли у кого-нибудь решения для Linux, которые работают с Mono.

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

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

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

4
4.11.2008 12:28:38

"Есть ли хороший способ справиться с этой проблемой?" Нет. Ничто не может быть защищено от обратного проектирования. Даже встроенное ПО на DVD-машинах было перепроектировано, и ключ шифрования AACS был открыт. И это несмотря на то, что DMCA считает это уголовным преступлением.

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

  1. Лицензии. Контракты. Условия и положения. Это все еще работает, даже когда люди могут читать код. Обратите внимание, что некоторые из ваших компонентов на основе Python могут потребовать уплаты сборов перед продажей программного обеспечения с использованием этих компонентов. Кроме того, некоторые лицензии с открытым исходным кодом запрещают скрывать источник или происхождение этого компонента.

  2. Предложить значительную ценность. Если ваши вещи настолько хороши - по цене, от которой трудно отказаться - нет никакого стимула тратить время и деньги на обратную разработку чего-либо. Обратный инжиниринг стоит дорого. Сделайте ваш продукт чуть дешевле.

  3. Предлагайте обновления и улучшения, которые делают любой реверс-инжиниринг плохой идеей. Когда следующий релиз ломает их реверс-инжиниринг, нет смысла. Это может быть доведено до абсурда, но вы должны предложить новые функции, которые делают следующий выпуск более ценным, чем обратный инжиниринг.

  4. Предлагайте индивидуальные настройки по привлекательным ценам, так что они скорее заплатят, а вы создадите и поддержите усовершенствования.

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

  6. Предложите это как веб-сервис. SaaS не требует загрузки для клиентов.

451
4.11.2009 19:27:31
Пункт 2 еще важнее. Если это дешевле, чем реверс-инжиниринг, плюс ежегодные обновления, никто не будет пытаться, и даже если это произойдет, никто не заплатит хакеру вместо поставщика программного обеспечения.
m3nda 1.09.2015 20:42:18
Это правда. Обратный инжиниринг выполним, но в большинстве ситуаций дорог. @ S.Lott, я считаю, что пункт 6 имеет большее значение в зависимости от вопроса. Если исходный код действительно нуждается в защите, он должен быть удален от конечного пользователя.
assetCorp 10.10.2017 11:56:14
Вопрос: «Есть ли хороший способ защитить мою семью и меня от убийства злоумышленниками во сне?» Интернет: «Нет. Любого можно достать, и ни одно жилище не может быть на 100 процентов непроницаемым. Смертная человеческая семья - неподходящий инструмент для работы».
A Simple Algorithm 29.03.2019 04:05:26
Точка 5 не может быть применена при том же предположении, что она может быть подвергнута обратной инженерии и взломана.
jjmontes 4.11.2019 16:29:27

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

Таким образом, проверки лицензии могут быть выполнены в безопасности вашей собственной серверной комнаты.

17
4.11.2008 12:29:48
+1 (обратно к 0): кажется, единственно верное решение проблемы, если принять такой подход в качестве практического для постановки.
intuited 21.07.2010 17:41:50
Имейте в виду, что если ваш лицензионный веб-сервер не работает или у клиентов отсутствует доступ к Интернету, ваши клиенты не будут рады, что они не смогут вести свой бизнес из-за потери доступа к проверкам лицензирования.
DevPlayer 3.07.2012 16:45:41
@DevPlayer Есть решения для этого. Вы могли бы реализовать механизм локального ключа, который разрешает временный доступ, когда программное обеспечение не может достичь удаленного сервера лицензирования.
Jeffrey 2.03.2014 17:49:09
@Джеффри: Это вернет вас туда, откуда вы начали - как защитить этот код. Чтобы быть более безопасным, вам нужно разместить некоторые ключевые функции на своем собственном сервере, поэтому замена его потребует значительных усилий (в какой момент, почему бы не начать конкурента с открытым исходным кодом?)
Oddthinking 10.04.2015 14:31:50

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

Лучшим решением будет продажа кода в качестве услуги, скажем, путем размещения службы или предоставления поддержки - хотя это не всегда практично.

Отправка кода в виде .pycфайлов предотвратит сбои вашей защиты на несколько #секунд, но вряд ли это эффективная защита от пиратства (как если бы была такая технология), и, в конце концов, она не должна достичь ничего, что Приличное лицензионное соглашение с компанией будет.

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

9
4.11.2008 12:53:25

Как насчет подписи вашего кода стандартными схемами шифрования путем хеширования и подписывания важных файлов и проверки его методами открытого ключа?

Таким образом, вы можете выдать файл лицензии с открытым ключом для каждого клиента.

Кроме того, вы можете использовать Python Obfuscator, как этот (просто погуглил).

6
4.11.2008 12:59:04
+1 за подпись; -1 для обфускатора Вы можете, по крайней мере, предотвратить изменение кода.
Ali Afshar 4.11.2008 13:07:48
Подписание не работает в этом контексте. Всегда можно обойти загрузчик проверки подписи. Первое, что вам нужно для полезной защиты программного обеспечения, - это непрозрачный механизм начальной загрузки. Не то, что Python делает легко.
ddaa 4.11.2008 13:41:59
Да, начальная загрузка в не Python.
Ali Afshar 4.11.2008 16:27:52
Или подтвердите лицензию не только при запуске, но и в нескольких других местах. Может быть легко реализовано и может значительно увеличить время обхода.
Abgan 29.12.2008 02:21:00

Python не тот инструмент, который вам нужен

Вы должны использовать правильный инструмент, чтобы делать правильные вещи, и Python не был разработан, чтобы быть запутанным. Это наоборот; все открыто или легко раскрывается или изменяется в Python, потому что это философия языка.

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

Запутывание действительно трудно

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

Наличие юридического требования - хороший способ

Вы не можете предотвратить использование кем-либо вашего кода, но вы можете легко обнаружить, что кто-то делает. Поэтому это просто случайный юридический вопрос.

Защита кода переоценена

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

313
23.02.2011 07:10:26
Python не тот инструмент, который вам нужен. Мальболге есть. :)
johndodo 4.08.2011 14:00:01
Хороший ответ, но "случайный юридический вопрос"? В самом деле? Где вы живете, что у вас есть какие-либо юридические проблемы, которые случайны?
Mark E. Haase 16.09.2013 13:40:26
Я думаю, что если у нас есть частота - как часто взламывается дорогой запутанный код - мы могли бы сказать о целесообразности использования Python и запутанного кода.
sergzach 18.02.2015 10:28:02
Если у вашего кода есть интересные функции, тот, кто смог его неправильно использовать, распространит его @Macke
assetCorp 10.10.2017 12:00:17
Как в мире вы "легко обнаружите, если кто-то делает"?
Make42 28.01.2020 15:06:52

Лучшее, что вы можете сделать с Python, - это запутать вещи.

  • Удалите все документы
  • Раздайте только скомпилированные файлы .pyc.
  • заморозить это
  • Затенить ваши константы внутри класса / модуля, чтобы help (config) не показывал все

Вы можете добавить некоторую дополнительную неизвестность, зашифровав ее часть и расшифровав на лету и передав ее в eval (). Но что бы вы ни делали, кто-то может сломать это.

Ничто из этого не помешает решительному злоумышленнику разобрать байт-код или покопаться в вашем API с помощью справки, директории и т. Д.

6
4.11.2008 18:45:18

Не надейтесь на запутывание. Как вы правильно сделали, он предлагает очень ограниченную защиту. ОБНОВЛЕНИЕ: Вот ссылка на статью, в которой приведен обратный инженерный обфусцированный код Python в Dropbox. Подход - переназначение кода операции - хороший барьер, но, очевидно, его можно победить.

Вместо этого, как упоминалось во многих постерах, сделайте это:

  • Не стоит тратить время на обратное проектирование (Ваше программное обеспечение настолько хорошее, что имеет смысл платить)
  • Заставьте их подписать контракт и проведите аудит лицензии, если это возможно.

В качестве альтернативы, как делает отличная Python IDE WingIDE: Раздайте код . Правильно, раздайте код и попросите людей вернуться за обновлениями и поддержкой.

25
8.05.2015 13:26:24
Как эта крайняя идея. Получается это огромным образом и огромная доля рынка, тогда у вас очень большая клиентская база для поддержки и дополнений. Я также занимался этим вопросом, и все ответы о «лицензировании» в основном бычьи, потому что он не защищает от широко распространенного копирования, но не дает вам преимущества доли рынка.
Thomas Browne 16.04.2013 14:43:02
Но обновления также просто бесплатны ... так как они будут взимать плату за это? Разве это не просто поддержка?
Make42 1.02.2020 10:48:20
Относительно бизнес-модели WingIDE: Поддержка - это услуга, программный продукт. Масштаб продуктов, сервис - нет. Поддержка - это только хорошая бизнес-модель, если нет другой бизнес-модели, то есть, если никто не будет покупать ваш продукт (по какой-либо причине), вы отдаете его, чтобы у вас была клиентская база, которая по крайней мере покупает ваши услуги.
Make42 1.02.2020 10:50:51

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

11
4.11.2008 20:27:05

Хотя идеального решения не существует, можно сделать следующее:

  1. Переместите некоторый критический фрагмент кода запуска в собственную библиотеку.
  2. Проведите проверку лицензии в собственной библиотеке.

Если бы вызов нативного кода был удален, программа все равно не запустилась бы. Если он не будет удален, лицензия будет применена.

Хотя это не кроссплатформенное или чисто Python-решение, оно будет работать.

14
8.02.2015 17:37:16
Подход с нативной библиотекой значительно упрощает программную обработку вашей системы лицензионных ключей, поскольку они могут использовать ваш собственный код и API для проверки своих лицензий.
Tom Leys 24.11.2008 01:15:17
Так? Используйте RSA, чтобы подписать вашу лицензию и позволить им перебор вашего личного ключа, скажем, состоящего из 1024 бит. Это возможно, но занимает много времени ... а значит - деньги.
Abgan 29.12.2008 02:18:41

Я понимаю, что вы хотите, чтобы ваши клиенты использовали возможности Python, но не хотите раскрывать исходный код.

Вот мои предложения:

(a) Напишите критические фрагменты кода в виде библиотек C или C ++, а затем используйте SIP или swig, чтобы представить API C / C ++ в пространстве имен Python.

(б) Используйте Cython вместо Python

(c) В обоих случаях (a) и (b) должна быть возможность распространять библиотеки в виде лицензионного двоичного файла с интерфейсом Python.

58
6.11.2008 07:41:59
Другие возможности в том же духе: Shed Skin code.google.com/p/shedskin и Nuitka kayhayen24x7.homelinux.org/blog/nuitka-a-python-compiler
TryPyPy 14.01.2011 04:03:13
Я только что посмотрел на Shed Skin, как предложено TyPyPy, и это, кажется, действительно хороший материал!
Filipe 29.01.2013 11:47:27

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

19
16.02.2009 21:09:33

Другая попытка усложнить кражу вашего кода - использовать jython, а затем использовать java obfuscator .

Это должно работать очень хорошо, так как jythonc переводит код Python в Java, а затем Java компилируется в байт-код. Так что, если вы запутаете классы, будет очень трудно понять, что происходит после декомпиляции, не говоря уже о восстановлении реального кода.

Единственная проблема с Jython заключается в том, что вы не можете использовать модули Python, написанные на c.

8
5.05.2009 21:53:15

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

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

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

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

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

Логическая подпись внутри обфусцированного кода (например, вы можете создать таблицу значений, которые используются программной логикой, но также используются в качестве подписи), которую можно использовать для определения того, что код произошел от вас. Если кто-то решит использовать ваш модуль обфусцированного кода как часть своего собственного продукта (даже после того, как он повторно обфусцирует его, чтобы он выглядел иначе), вы можете показать, что код украден с вашей секретной подписью.

5
20.09.2016 12:03:24

Компилировать 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.

142
19.07.2018 08:18:35
Будет ли компилирование с помощью Cython работать с приложением Python 3.4 Django, или оно может работать без огромных усилий?
Daniel 15.09.2015 04:35:45
@ Даниель: Не уверен. Не пробовал на Джанго. Не стесняйтесь отправить новый вопрос об этом.
Macke 4.11.2015 10:11:38
Daniel 4.11.2015 18:08:17
@mlvljr FWIW, IMHO, компиляция в двоичные файлы - хороший компромисс между продажей всех ваших секретов и попыткой защиты от обратного инжиниринга класса NSA. Esp, если у вас есть большая база кода Python и причины быть параноиком. ;)
Macke 8.01.2016 08:18:34
POST hithwen теперь недействителен.
qg_java_17137 5.06.2018 12:45:16

использование cxfreeze (py2exe для linux) сделает эту работу.

http://cx-freeze.sourceforge.net/

доступно в репозиториях Ubuntu

1
3.03.2012 15:13:13
Я думаю, что просто связывает .pyc файлы. Cython, Shed Skin и PyPy выходят за рамки байт-кода.
Cees Timmerman 3.08.2012 11:47:55

Я думаю, что есть еще один способ защитить ваш код Python; часть метода запутывания. Я считаю, что была такая игра, как Mount and Blade или что-то, что изменило и перекомпилировало их собственный интерпретатор python (оригинальный интерпретатор, который, я считаю, с открытым исходным кодом), и просто изменило коды OP в таблице кодов OP, чтобы они отличались от стандартных OP Python. коды.

Таким образом, исходный код python не изменяется, но расширения файлов * .pyc отличаются, и коды операций не соответствуют общедоступному интерпретатору python.exe. Если вы проверили файлы данных игр, все данные были в исходном формате Python.

Таким образом можно совершать всевозможные неприятные трюки, чтобы связываться с незрелыми хакерами. Остановить кучу неопытных хакеров легко. Это профессиональные хакеры, которых вы вряд ли победите. Но я полагаю, что большинство компаний не держат профессиональных хакеров в штате долго (вероятно, потому что все взломано). Но незрелые хакеры повсюду (читай, как любопытный ИТ-персонал).

Например, вы можете в измененном интерпретаторе разрешить ему проверять наличие определенных комментариев или строк документации в вашем источнике. Вы можете иметь специальные OP-коды для таких строк кода. Например:

ОП 234 предназначен для строки исходного текста «# Авторские права я написал это» или скомпилирует эту строку в коды операций, которые эквивалентны «if False:», если отсутствует «# Copyright». По сути, отключение целого блока кода по неясной причине.

Один из вариантов использования, когда возможна перекомпиляция измененного интерпретатора, - это когда вы не написали приложение, оно большое, но вам платят за его защиту, например, когда вы являетесь администратором выделенного сервера для финансового приложения.

Я считаю несколько противоречивым оставлять исходные коды или коды операций открытыми для глазных яблок, но использовать SSL для сетевого трафика. SSL также не безопасен на 100%. Но он используется, чтобы остановить большинство глаз от чтения. Небольшая предосторожность имеет смысл.

Кроме того, если достаточное количество людей сочтет, что исходный код и коды операций Python слишком видны, вероятно, кто-то в конечном итоге разработает хотя бы простой инструмент защиты для него. Поэтому все больше людей, спрашивающих «как защитить приложение Python», только способствует этой разработке.

12
13.02.2019 10:19:39

Возможно иметь байт-код py2exe в зашифрованном ресурсе для модуля запуска C, который загружает и выполняет его в памяти. Некоторые идеи здесь и здесь .

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

Вы также можете найти учебные пособия по предотвращению отладчиков , отключить дизассемблер, установить ложные контрольные точки отладчика и защитить свой код с помощью контрольных сумм. Ищите ["зашифрованный код" выполнить "в памяти"] для получения дополнительных ссылок.

Но, как уже говорили другие, если ваш код того стоит, обратные инженеры в конце концов преуспеют.

3
18.08.2013 08:18:25

Вы смотрели на Pyminifier ? Он минимизирует, запутывает и сжимает код Python. Пример кода выглядит довольно неприятно для случайного обратного инжиниринга.

$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异
32
8.05.2015 10:21:58
Хорошая идея в этом заключается в том, чтобы деморализовать любого, кто пытается расшифровать функциональность. Объедините это с Cython и некоторыми дополнительными модулями шифрования или интернет-звонками, и вы, вероятно, получите приз.
m3nda 1.09.2015 20:28:17
Единственное, что удалось сделать этому пакету, - обмануть «обфускатор», заключающийся в том, что код запутан.
markroxor 3.05.2019 11:24:03
это делало ошибки, когда я пытался. я думаю, что он неправильно обработал данные и не полностью преобразовал их.
Vicrobot 1.10.2019 11:13:40
не работает для всего проекта или механизма шаблонов, так как для отображения в шаблоне необходимо имя переменной
TomSawyer 6.10.2019 17:42:09

Используйте Cython . Он скомпилирует ваши модули в высокопроизводительные C-файлы, которые затем могут быть скомпилированы в собственные двоичные библиотеки. По сути это необратимый код по сравнению с байт-кодом .pyc!

Я написал подробную статью о том, как настроить Cython для проекта Python, посмотрите его:

Защита исходников Python с помощью Cython

19
29.06.2019 15:00:11

Используйте тот же способ защиты двоичного файла c / c ++, то есть обфусцируйте каждое тело функции в исполняемом файле или двоичном файле библиотеки, вставьте инструкцию «jump» в начале каждой записи функции, перейдите к специальной функции для восстановления запутанного кода. Байт-код является двоичным кодом скрипта Python, поэтому

  • Сначала скомпилируйте скрипт Python для кодирования объекта
  • Затем выполните итерацию каждого объекта кода, обфусцируйте co_code каждого объекта кода следующим образом
    0 JUMP_ABSOLUTE n = 3 + len (байт-код)

    3
    ...
    ... здесь это запутанный байт-код
    ...

    n LOAD_GLOBAL? (__Pyarmor__)
    n + 3 CALL_FUNCTION 0
    n + 6 POP_TOP
    n + 7 JUMP_ABSOLUTE 0
  • Сохранить обфусцированный код объекта как .pyc или .pyo файл

Этот запутанный файл (.pyc или .pyo) может использоваться обычным интерпретатором Python, когда этот объект кода вызывается впервые

  • Первая операция - 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)
    
  • После возврата этой функции последняя инструкция должна перейти к смещению 0. Теперь выполняется настоящий байт-код.

Существует инструмент Pyarmor, позволяющий запутывать сценарии Python таким способом.

2
14.12.2017 00:35:38

Я был удивлен тем, что не увидел пиконкрет в любом ответе. Может потому что это новее, чем вопрос?

Это может быть именно то, что вам нужно (ред.).

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

Со страницы Pypi :

Защитить рабочий процесс скрипта Python

  • your_script.py import pyconcrete
  • pyconcrete подключит модуль импорта
  • когда ваш сценарий сделать импорт MODULE, pyconcrete импорт крюк будет пытаться найти MODULE.pyeпервый , а затем расшифровывать с MODULE.pyeпомощью _pyconcrete.pydи выполнить расшифрованные данные (как .pyc контента)
  • Зашифровать и расшифровать запись секретного ключа _pyconcrete.pyd (например, DLL или SO), секретный ключ будет скрыт в двоичном коде, его нельзя увидеть непосредственно в представлении HEX
10
17.03.2018 00:43:32

Короче говоря:

  1. Зашифруйте ваш исходный код
  2. Напишите свой собственный загрузчик модулей Python для расшифровки кода при импорте
  3. Реализовать загрузчик модулей в C / C ++
  4. Вы можете добавить дополнительные функции в загрузчик модулей, например, анти-отладчик, контроль лицензий, привязку аппаратных отпечатков пальцев и т. Д.

Для более подробной информации, посмотрите этот ответ .

Если вам интересна тема, вам поможет этот проект - pyprotect .

4
30.07.2018 03:03:16

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

На 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 и т. Д. Здесь .

3
30.01.2019 10:04:55

Существует полный ответ на сокрытие исходного кода Python, который можно найти здесь .

Обсуждаются возможные методы:
- использование скомпилированного bytecode ( python -m compileall)
- создатели исполняемых файлов (или инсталляторы, такие как PyInstaller )
- программное обеспечение как услуга (на мой взгляд, лучшее решение для сокрытия вашего кода)
- обфускаторы исходного кода python

1
21.04.2020 07:58:58
Ссылка идет на example.com.
Darian 4.03.2020 06:08:54
@Darian Спасибо, что указали на это. Я обновил ссылку.
Mike 21.04.2020 07:59:40