Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

    Наличие законных требований - хороший способ пойти

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

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

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

    Компилируйте 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.

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

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

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

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

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

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

    [EDIT] Ответ на комментарий Ника:

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

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

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

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

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

    Вы смотрели на pyminifier ? Он минимизирует, запутывает и сжимает код 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's 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)
    

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

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

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

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

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

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

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

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

    <Ол>
  • Переместите некоторый критический фрагмент кода запуска в собственную библиотеку.
  • Включите проверку лицензии в собственной библиотеке.
  • Если удалить исходный код, программа все равно не запустится. Если он не будет удален, лицензия будет применена.

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

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

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

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

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

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

    OP 234 предназначен для исходной линии «# Copyright Я написал это« или составьте эту строку в OP -коды, которые эквивалентны «если false:», если «# Copyright» отсутствует.По сути, отключение целого блока кода по какой-то неясной причине.

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

    Я считаю немного противоречивым оставлять источник или коды операций открытыми для всеобщего обозрения, но использовать SSL для сетевого трафика.SSL также не является на 100% безопасным.Но оно используется для того, чтобы БОЛЬШИНСТВО глаз не прочитало это.Небольшая мера предосторожности разумна.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    От страница pypi:

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

    • ваш_скрипт.py import pyconcrete
    • pyconcrete подключит модуль импорта
    • когда ваш скрипт импортирует MODULE, Pyconcrete Import Hook постарается найти MODULE.pye сначала, а затем расшифровывать MODULE.pye с помощью _pyconcrete.pyd и выполнить расшифрованные данные (как содержание .pyc)
    • зашифровать и расшифровать запись секретного ключа в _pyconcrete.pyd(Как DLL или около того). Секретный ключ будет скрыть в двоичном коде, не может увидеть его непосредственно в шестнадцатеричном представлении

    Лучшее, что вы можете сделать с помощью Python, — это скрыть некоторые вещи.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    <Ол>
  • Зашифруйте свой исходный код
  • Напишите свой собственный загрузчик модуля python для расшифровки кода при импорте
  • Реализовать загрузчик модулей на C / C ++
  • Вы можете добавить дополнительные функции в загрузчик модулей, например, анти-отладчик, контроль лицензий, привязку аппаратных отпечатков пальцев и т. д.
  • Подробнее читайте в этом ответе .

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

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

    На 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 и т. д., можно узнать здесь .

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

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

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

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

    • Сначала скомпилируйте скрипт Python для кодирования объекта.
    • Затем повторите каждый объект кода, запутайте co_code каждого объекта кода следующим образом:
        0   JUMP_ABSOLUTE            n = 3 + len(bytecode)
    
        3
        ...
        ... Here it's 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, когда этот объект кода вызывается в первый раз.

    • Первая операция — 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.Теперь исполняется настоящий байт-код.

    Есть инструмент Пьярмор таким образом запутать скрипты Python.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top