Я разрабатываю программное обеспечение на Python, которое будет распространяться среди клиентов моего работодателя. Мой работодатель хочет ограничить использование программного обеспечения с помощью файла лицензии с ограничением по времени.
Если мы будем распространять файлы .py или даже файлы .pyc, будет легко (декомпилировать и) удалить код, который проверяет файл лицензии.
Другой аспект заключается в том, что мой работодатель не хочет, чтобы код читали наши клиенты, опасаясь, что код может быть украден или, по крайней мере, «новые идеи».
Есть ли хороший способ справиться с этой проблемой? Желательно с готовым решением.
Программное обеспечение будет работать в системах Linux (поэтому я не думаю, что py2exe поможет).
вот так: stackoverflow.com/questions/15955948/…
Это наиболее исчерпывающий ответ на ваш вопрос: wiki.python.org/moin/Asking%20for%20Help/…






Python, будучи интерпретируемым языком с байтовым кодом, очень сложно заблокировать. Даже если вы используете exe-упаковщик, такой как 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. Открытый исходный код - намного более простой образ жизни.
Подходит ли для этого Cython?
Я знаю, что это устарело, но должен отметить, что хранение криптографических ключей или чего-либо важного внутри исполняемого файла - плохая идея ™. Тот факт, что исполняемый файл скомпилирован в двоичный файл, не имеет значения. Вы можете просто запустить против него команду strings, и ключ будет прямо перед вами.
Исправление для Windows - скомпилировать файл в формат. Pyd и импортируйте его позже
Вы должны посмотреть, как ребята из getdropbox.com делают это для своего клиентского программного обеспечения, включая Linux. Его довольно сложно взломать и требует довольно творческой разборки, чтобы обойти механизмы защиты.
но тот факт, что это было преодолено, означал, что они потерпели неудачу - суть в том, что просто не пытайтесь, а ищите юридическую защиту.
Публикуется ли какая-либо информация о том, как пройти этот механизм защиты?
Знает ли ваш работодатель, что он может «украсть» любые идеи, которые другие люди почерпнули из вашего кода? Я имею в виду, что если они могут читать ваши работы, вы тоже можете читать их. Может быть, глядя на то, как вы можете извлечь выгоду из ситуации, можно было бы лучше окупить ваши инвестиции, чем бояться, сколько вы можете потерять.
[РЕДАКТИРОВАТЬ] Ответ на комментарий Ника:
Ничего не получилось и ничего не потеряно. У клиента есть то, что он хочет (и заплатил за это, поскольку он сам внес изменения). Поскольку он не выпускает изменения, это как будто не случилось со всеми остальными.
Теперь, если клиент продает программное обеспечение, он должен изменить уведомление об авторских правах (что является незаконным, поэтому вы можете подать в суд и выиграть -> простой случай).
Если они не изменят уведомление об авторских правах, клиенты 2-го уровня заметят, что программное обеспечение исходит от вас, и зададутся вопросом, что происходит. Скорее всего, они свяжутся с вами, и вы узнаете о перепродаже вашей работы.
Опять же, у нас есть два случая: первоначальный покупатель продал всего несколько копий. Это означает, что они в любом случае не зарабатывали много денег, так что зачем беспокоиться. Или они продаются в больших объемах. Это означает, что у вас больше шансов узнать о том, что они делают, и что-то с этим сделать.
Но, в конце концов, большинство компаний стараются соблюдать закон (когда их репутация испорчена, вести бизнес становится намного сложнее). Таким образом, они не украдут вашу работу, а будут работать с вами над ее улучшением. Поэтому, если вы включите источник (с лицензией, которая защищает вас от простой перепродажи), есть вероятность, что они просто оттеснят внесенные изменения, поскольку это гарантирует, что изменение будет в следующей версии, и им не придется его поддерживать. . Это беспроигрышный вариант: вы получаете изменения, и они могут вносить изменения сами, если они действительно отчаянно в них нуждаются, даже если вы не желаете включать их в официальный выпуск.
Что, если они выпускают программное обеспечение для клиентов, а клиент изменяет его внутри, не выпуская повторно?
@Nick: Никак не меняет ситуацию. Смотрите мои правки.
+1 за кражу идей обратно. Зачем ограничивать возможности обслуживания клиентов собственными решениями, если вы можете видеть, как другие улучшают ваше решение и, соответственно, улучшают ваш собственный продукт? "Если у вас есть яблоко, а у меня есть яблоко, и мы обмениваемся этими яблоками, то у вас и у меня все равно будет по одному яблоку. Но если у вас есть идея, и у меня есть идея, и мы обмениваемся этими идеями, то каждый из нас будет иметь две идеи ".
Что, если один из ваших клиентов повторно выпустит ваш код или идеи бесплатно и анонимно? Вы не можете сказать, кто это сделал, и подать на них в суд, а поскольку они не получили от этого выгоды, вы тоже не сможете. Это испортит вашу работу, пока один из ваших клиентов заплатил за нее только базовую цену. (очевидно, работает только в том случае, если у вас есть несколько клиентов для вашего решения)
@Skandix Как именно это будет работать? Размещение вашей работы в Интернете не вредит вам. Это могло бы навредить вам, если бы многие люди нашли это, И эти люди вместо этого стали бы платить клиентам. Кража кода - это миф. «Мои знания бесплатны, мое время стоит дорого» (не уверен, кто это сказал).
Как мне украсть что-нибудь обратно? Они просто вставляют код в свой продукт и никому не рассказывают, как он работает, а просто продают его. Как я узнаю, что они вообще использовали мой код?
@ Make42 Если бы вы никогда не замечали, как бы это отличалось от того, что не происходит? На вас это просто не повлияет. Итак, чтобы доказать это, вы должны знать, что они «украли» ваш код.
@AaronDigulla: Я не думаю, что это применимо. Другие люди, которым вор продает, могли бы стать моими покупателями, но я никогда не узнаю. Если кто-то А даст Б немного денег, чтобы он доставил их мне без моего ведома. B крадет деньги, оставляя их себе. Возможно, мне не будет грустно, потому что я никогда не знал, но у меня все равно меньше денег, чем если бы Б сдержал обещание.
@ Make42 Как здесь помогает обфускация? Они по-прежнему могут продавать ваше программное обеспечение без изменений кому-либо, не делясь с вами. Я думаю, что хорошим примером является MongoDB и аналогичные сервисы, где большая группа людей приложила много усилий, а GAFA «крадет» их доход, продавая услуги, связанные с продуктами, без отдачи. Открытость в своем продукте - вот что создает больший рынок. Возможность предоставлять услуги, связанные с продуктом, приносит большую часть дохода. Сам продукт - это просто открывалка для дверей.
@AaronDigulla: Защита вашего кода (не обязательно обфускация) помогает с двумя пунктами: 1) Код редко передается на 100%. Обычно нужно настроить пару вещей. Часто этого очень мало (поэтому стоит изменить), но без этих изменений код непригоден для нового проекта. Защищая ваш код, защищает вашу работу от использования в проектах, в которых вы не участвуете. 2) Когда вы продаете программное обеспечение, то на самом деле вы продаете лицензионный ключ (как вы, скорее всего, хорошо знаете). Защита вашего кода гарантирует, что механизм запроса ключа невозможно обойти.
Что касается MongoDB: ваш пример является примером точки мой: они открыли код, и в конце дня GAFA крадет их доход. Вы хотите сказать, что продажа услуг того стоит. Конечно, но MongoDB этого не сделал.
Относительно «Мои знания бесплатны, мое время дорого обходится»: Нет, это не так. Некоторые проекты я завершаю за пару дней, но на то, чтобы приобрести эти знания, потребовались годы, если не десятилетия. Фактически, это (в идеальном мире) причина, по которой кому-то с долгим образованием (например, доктору философии) платят больше, чем тому, кто только что прошел профессиональную подготовку (например, уборщик): им возмещаются неоплачиваемые годы работы. ожидается, что они приобретут много знаний, в то время как очистка не требует большого обучения. (Это не означает неуважения к уборщице как к человеку.)
@ Make42 MongoDB - это точка зрения для нас обоих. Это пример, когда большинство людей считают, что это «очевидная» кража. Обфускация не помогла бы, поскольку GAFA может использовать код как есть. Тем не менее, это угловой случай, потому что это база данных, и это имел в виду, чтобы быть полезными как есть. Я согласен с тем, что вы продаете лицензионный ключ, но этот ключ невозможно защитить от кода - любую защиту на основе кода можно обойти; это просто вопрос усилий. Поэтому лицензионный ключ защищен договором (лицензия на программное обеспечение или старый добрый коммерческий продукт).
Мой основной аргумент: обфускация кода обычно пустая трата времени. Оформите лицензию на программное обеспечение или обратитесь к юристу. Добавление некоторой базовой защиты, такой как файл лицензии, демонстрирует, что вы хотите защитить свой код от «кражи», что достаточно хорошо в суде (их волнует намерение, а не высота технических препятствий).
Относительно полезности «как есть»: Да, это может иметь место здесь, но для многих программных приложений в профессиональном контексте это не так.
«Это просто вопрос усилий» - конечно! Но если стоимость усилий больше, чем стоимость моего фактического продукта или услуги, то я достаточно хорошо защитил свой код, потому что мне выгоднее платить мне, чем воровать у меня. Это препятствие, которое я должен создать. Лицензия, конечно же, будет иметь срок действия.
«Обфускация кода - обычно пустая трата времени». - когда я говорю о защите, я имею в виду что-то вроде компиляции Python на C и C в байт-код, а не с использованием pyminifier. Когда я слышу «запутывание», я думаю о пиминификаторе, а не о первом подходе. (Может быть, мы неправильно понимаем друг друга.) Что ж, я думаю, что если использование Nuitka занимает у меня пару часов после проекта, который занял у меня год, то это, похоже, не займет много времени, и если я защищу свой код таким образом Достаточно (в упомянутом экономическом смысле), мне это не кажется пустой тратой.
Выиграть судебный процесс дорого, сложно и вредно для всех участников. В тот момент, когда вам нужны юристы, у вас уже большие проблемы.
Я рассмотрел защиту программного обеспечения в целом для своих собственных проектов, и общая философия заключается в том, что полная защита невозможна. Единственное, на что вы можете надеяться, - это добавить защиту до уровня, обход которого обойдется вашему клиенту дороже, чем покупка другой лицензии.
С учетом сказанного, я просто проверял Google на предмет обфукции Python и ничего не обнаруживал. В решении .Net обфукация будет первым подходом к вашей проблеме на платформе Windows, но я не уверен, есть ли у кого-нибудь в Linux решения, работающие с Mono.
Следующим шагом будет написание кода на скомпилированном языке или, если вы действительно хотите пройти весь путь, на ассемблере. Вырезанный исполняемый файл будет намного сложнее декомпилировать, чем интерпретируемый язык.
Все сводится к компромиссам. С одной стороны, у вас есть простота разработки программного обеспечения на Python, в котором также очень сложно скрыть секреты. С другой стороны, у вас есть программное обеспечение, написанное на ассемблере, которое намного сложнее написать, но гораздо проще скрыть секреты.
Ваш босс должен выбрать точку в этом континууме, которая соответствует его требованиям. А затем он должен дать вам инструменты и время, чтобы вы могли построить то, что он хочет. Однако я уверен, что он будет возражать против реальных затрат на разработку по сравнению с потенциальными денежными потерями.
"Есть ли хороший способ справиться с этой проблемой?" Нет. Ничто не может быть защищено от реверс-инжиниринга. Даже прошивка на DVD-машинах была подвергнута обратному проектированию, и был обнаружен Ключ шифрования AACS. И это несмотря на то, что DMCA квалифицирует это как уголовное преступление.
Поскольку никакие технические методы не могут помешать вашим клиентам читать ваш код, вы должны применять обычные коммерческие методы.
Лицензии. Контракты. Условия и положения. Это все еще работает, даже когда люди могут читать код. Обратите внимание, что для некоторых из ваших компонентов на основе Python может потребоваться оплата комиссии перед продажей программного обеспечения, использующего эти компоненты. Кроме того, некоторые лицензии с открытым исходным кодом запрещают вам скрывать источник или происхождение этого компонента.
Предлагайте значительную ценность. Если ваш материал настолько хорош - по цене, от которой трудно отказаться - нет смысла тратить время и деньги на обратное проектирование чего-либо. Обратный инжиниринг стоит дорого. Сделайте ваш продукт немного дешевле.
Предлагайте обновления и улучшения, которые делают любую обратную разработку плохой идеей. Когда следующий выпуск ломает их обратное проектирование, в этом нет смысла. Это можно довести до абсурдных крайностей, но вам следует предложить новые функции, которые сделают следующий выпуск более ценным, чем обратное проектирование.
Предлагайте настройку по настолько привлекательным ценам, чтобы они предпочли заплатить вам за создание и поддержку улучшений.
Используйте лицензионный ключ, срок действия которого истекает. Это жестоко и создаст вам плохую репутацию, но определенно заставит ваше программное обеспечение перестать работать.
Предложите это как веб-сервис. SaaS не требует загрузки для клиентов.
Пункт 2 еще важнее. Если это дешевле, чем обратное проектирование, плюс ежегодные обновления, никто не будет пытаться, и даже если это произойдет, никто не будет платить хакеру вместо поставщика программного обеспечения.
Это правда. Обратный инжиниринг выполним, но в большинстве случаев дорого. @ S.Lott, я считаю, что пункт 6 имеет большее значение, исходя из этого вопроса. Если исходный код действительно нуждается в защите, он должен быть удален от конечного пользователя.
Вопрос: «Есть ли хороший способ защитить мою семью и себя от убийства злоумышленниками во сне?» Интернет: «Нет. Кого угодно можно найти, и ни одно жилище не бывает на 100% непроницаемым. Смертная человеческая семья - неподходящий инструмент для работы».
Пункт 5 не может быть применен, исходя из того же предположения, что его можно реконструировать и взломать.
В некоторых случаях можно переместить (все или хотя бы ключевую часть) программное обеспечение в веб-службу, размещенную в вашей организации.
Таким образом, проверка лицензии может выполняться в безопасности вашей серверной комнаты.
+1 (обратно к 0): это кажется единственно верным решением проблемы, если предположить, что такой подход применим для данной настройки.
Имейте в виду, что если ваш лицензирующий веб-сервер выйдет из строя или у клиентов отключится доступ в Интернет, ваш клиент будет недоволен тем, что он не может вести свой бизнес из-за потери доступа к проверкам лицензирования.
@DevPlayer Есть решения для этого. Вы можете реализовать механизм локального ключа, который разрешает временный доступ, когда программное обеспечение не может достичь удаленного сервера лицензирования.
@ Джеффри: Это вернет вас к тому, с чего вы начали - как защитить этот код. Для большей безопасности вам необходимо разместить некоторые ключевые функции на своем собственном сервере, поэтому его замена потребует значительных усилий (в этот момент почему бы просто не создать конкурента с открытым исходным кодом?)
В зависимости от того, кто является клиентом, простой механизм защиты в сочетании с разумным лицензионным соглашением будет на далеко более эффективным, чем любая сложная система лицензирования / шифрования / запутывания.
Лучшим решением будет продажа кода как услуги, например, путем размещения услуги или предложения поддержки, хотя это не всегда практично.
Отправка кода в виде файлов .pyc предотвратит нарушение вашей защиты несколькими #, но это вряд ли эффективная защита от пиратства (как если бы такая технология существует), и, в конце концов, она не должна достичь ничего такого, что приличное лицензионное соглашение с компанией будет.
Сосредоточьтесь на том, чтобы сделать ваш код максимально удобным для использования - довольные клиенты принесут вашей компании гораздо больше денег, чем предотвращение некоторого теоретического пиратства.
А как насчет подписания вашего кода стандартными схемами шифрования путем хеширования и подписания важных файлов и проверки их с помощью методов с открытым ключом?
Таким образом вы можете выдать лицензионный файл с открытым ключом для каждого клиента.
Дополнительно вы можете использовать обфускатор python, например Вот этот (просто погуглил).
+1 За подписание; -1 для обфускатора. По крайней мере, можно предотвратить изменение кода.
Подпись в этом контексте не работает. Всегда можно обойти загрузчик проверки подписи. Первое, что вам понадобится для полезной защиты программного обеспечения, - это непрозрачный механизм начальной загрузки. Не то, что Python упрощает.
Да, загрузка не на питоне.
Или проверяйте лицензию не только при запуске, но и в нескольких других местах. Может быть легко реализован и может значительно увеличить время обхода.
Вы должны использовать правильный инструмент, чтобы делать правильные вещи, а Python не предназначен для обфускации. Напротив; в Python все открыто или легко раскрывается или изменяется, потому что это философия языка.
Если вам нужно что-то, чего вы не видите, поищите другой инструмент. Это неплохо, важно, чтобы существовало несколько разных инструментов для разных целей.
Даже скомпилированные программы можно реконструировать, поэтому не думайте, что вы можете полностью защитить любой код. Вы можете анализировать запутанный PHP, взламывать ключ шифрования флэш-памяти и т. д. Новые версии Windows взламываются каждый раз.
Вы не можете предотвратить неправильное использование вашего кода кем-либо, но вы можете легко обнаружить, если кто-то это сделает. Следовательно, это просто случайный юридический вопрос.
В настоящее время бизнес-модели, как правило, направлены на продажу услуг, а не продуктов. Вы не можете скопировать сервис, пиратствовать или украсть его. Может, пора подумать, плыть по течению ...
Python - не тот инструмент, который вам нужен. Мальболге есть. :)
Хороший ответ, но «случайный юридический вопрос»? Действительно? Где вы живете, если у вас есть случайные юридические проблемы Любые?
Думаю, если у нас есть частота - как часто взламывается дорогой запутанный код - мы могли бы сказать о целесообразности использования Python и запутанного кода.
Если в вашем коде есть интересные особенности, тот, кто смог его неправильно использовать, распространит его @Macke
Как, черт возьми, вы могли бы «легко обнаружить, если кто-то это обнаружит»?
Это мнение, а не технический ответ. Я согласен с тем, что обфускация не означает, что ваш код полностью заблокирован, но она предотвращает взломы на низком уровне и имеет смысл в зависимости от вашего варианта использования.
«Защита кода переоценена», о чем вы думаете о локальных услугах?
Лучшее, что вы можете сделать с Python, - это скрыть вещи.
Вы можете добавить некоторую дополнительную неясность, зашифруя ее часть, расшифровав на лету и передав в eval (). Но что бы вы ни делали, кто-то может это сломать.
Ничто из этого не помешает решительному злоумышленнику разобрать байт-код или покопаться в вашем API с помощью help, dir и т. д.
Не полагайтесь на обфускацию. Как Вы правильно заключили, он предлагает очень ограниченную защиту. ОБНОВЛЕНИЕ: вот ссылка на статью, который реконструировал запутанный код Python в Dropbox. Подход - переназначение кода операции - хороший барьер, но, очевидно, его можно преодолеть.
Вместо этого, как упоминалось на многих плакатах, сделайте это:
В качестве альтернативы, как это делает потрясающая Python IDE WingIDE: Отдай код. Верно, отдайте код, и пусть люди вернутся за обновлениями и поддержкой.
Нравится эта крайняя идея. Получите огромный доступ и огромную долю рынка, тогда у вас будет очень большая клиентская база для поддержки и дополнений. Я также боролся с этим вопросом, и все «лицензионные» ответы в основном бычьи, потому что это не защищает от широко распространенного копирования, но не дает вам никакого преимущества на рынке.
Но апгрейды также бесплатны ... так как они будут за это платить? Разве это не была бы просто поддержка?
По поводу бизнес-модели WingIDE: Поддержка - это услуга, программное обеспечение - продукт. Продукты масштабируются, а сервис - нет. Поддержка - это хорошая бизнес-модель только в том случае, если нет другой бизнес-модели, то есть, если никто не будет покупать ваш продукт (по какой-либо причине), вы отдаете продукт, чтобы у вас была клиентская база, которая, по крайней мере, покупает вашу услугу.
Единственный надежный способ защитить код - запустить его на сервере, которым вы управляете, и предоставить своим клиентам клиента, который взаимодействует с этим сервером.
Хотя идеального решения не существует, можно сделать следующее:
Если бы вызов машинного кода был удален, программа все равно не запустилась бы. Если он не удален, лицензия будет применена.
Хотя это не кроссплатформенное решение или решение на чистом Python, оно будет работать.
Подход с использованием собственных библиотек значительно упрощает программный перебор вашей системы лицензионных ключей, поскольку они могут использовать ваш собственный код и API для проверки своих лицензий.
Так? Используйте RSA, чтобы подписать вашу лицензию, и позвольте им перебрать ваш закрытый ключ, скажем, состоящий из 1024 бит. Можно, но нужно много времени ... а значит - денег.
Я понимаю, что вы хотите, чтобы ваши клиенты использовали возможности Python, но не хотите раскрывать исходный код.
Вот мои предложения:
(a) Напишите критические фрагменты кода как библиотеки C или C++, а затем используйте ГЛОТОК или глоток, чтобы предоставить API-интерфейсы C / C++ пространству имен Python.
(b) Используйте Cython вместо Python
(c) В пунктах (a) и (b) должна быть возможность распространять библиотеки как лицензионные двоичные файлы с интерфейсом Python.
Другие возможности в том же духе: Shed Skin code.google.com/p/shedskin и Nuitka kayhayen24x7.homelinux.org/blog/nuitka-a-python-compiler
Я только что взглянул на Shed Skin, как это было предложено TyPyPy, и, похоже, это действительно хороший материал!
Доставка файлов .pyc имеет свои проблемы - они несовместимы с какой-либо другой версией python, кроме той версии python, с которой они были созданы, что означает, что вы должны знать, какая версия python работает в системах, на которых будет работать продукт. Это очень ограничивающий фактор.
Да, но не в том случае, если вы распространяете именно эту версию Python со своим запутанным кодом.
Еще одна попытка усложнить кражу вашего кода - использовать jython, а затем использовать обфускатор Java.
Это должно работать очень хорошо, поскольку jythonc переводит код python в java, а затем java компилируется в байт-код. Так что, даже если вы запутаете классы, будет действительно сложно понять, что происходит после декомпиляции, не говоря уже о восстановлении фактического кода.
Единственная проблема с jython заключается в том, что вы не можете использовать модули python, написанные на c.
Идея иметь лицензию с ограничением по времени и проверять ее в локально установленной программе не сработает. Даже при идеальной обфускации проверку лицензии можно убрать. Однако, если вы проверите лицензию в удаленной системе и запустите значительную часть программы в своей закрытой удаленной системе, вы сможете защитить свой IP.
Чтобы не дать конкурентам использовать исходный код как свой собственный или написать свою вдохновленную версию того же кода, один из способов защиты - добавить подписи в логику вашей программы (некоторые секреты, чтобы иметь возможность доказать, что код был украден у вас) и скрыть исходный код python, поэтому его трудно читать и использовать.
Хорошая обфускация добавляет к вашему коду в основном такую же защиту, как и его компиляция в исполняемый файл (и удаление двоичного файла). Разобраться, как работает запутанный сложный код, может быть даже сложнее, чем написать собственную реализацию.
Это не поможет предотвратить взлом вашей программы. Даже при обфускации кода лицензионные материалы будут взломаны, и программа может быть изменена, чтобы иметь несколько иное поведение (точно так же, как компиляция кода в двоичный код не помогает защитить собственные программы).
В дополнение к обфускации символов может быть хорошей идеей отменить рефакторинг кода, что делает все еще более запутанным, если, например, Графы вызовов указывают на множество разных мест, даже если на самом деле эти разные места в конечном итоге делают одно и то же.
Логическая подпись внутри обфусцированного кода (например, вы можете создать таблицу значений, которые используются логикой программы, но также используются как подпись), которая может использоваться для определения того, что код исходит от вас. Если кто-то решит использовать ваш модуль обфусцированного кода как часть своего продукта (даже после его повторной обфускации, чтобы он казался другим), вы можете показать, что этот код украден с вашей секретной подписью.
Разумная идея:
Используйте Cython, Нуйтка, Слитая кожа или что-то подобное для компиляции Python в код C, а затем вместо этого распространяйте свое приложение как двоичные библиотеки Python (pyd).
Таким образом, не останется никакого (байтового) кода Python, и, я думаю, вы сделали сколько-нибудь разумное затушевывание, которое кто-либо (то есть ваш работодатель) мог ожидать от обычного кода. (.NET или Java менее безопасны, чем этот случай, поскольку этот байт-код не запутывается и может быть относительно легко декомпилирован в разумный исходный код.)
Cython становится все более и более совместимым с CPython, поэтому я думаю, что он должен работать. (На самом деле я рассматриваю это для нашего продукта. Мы уже создаем некоторые сторонние библиотеки в виде pyd / dll, поэтому отправка нашего собственного кода Python в виде двоичных файлов - не слишком большой шаг для нас.)
См. Это сообщение в блоге (не мной), чтобы узнать, как это сделать. (спасибо @hithwen)
Безумная идея:
Вероятно, вы могли бы заставить Cython хранить C-файлы отдельно для каждого модуля, а затем просто объединить их все и построить их с тяжелым встраиванием. Таким образом, ваш модуль Python будет довольно монолитным, и его сложно обработать обычными инструментами.
Помимо сумасшествия:
Возможно, вы сможете создать один исполняемый файл, если сможете статически связать (и оптимизировать) со средой выполнения Python и всеми библиотеками (dll). Таким образом, было бы сложно перехватить вызовы на / от python и любых библиотек фреймворка, которые вы используете. Однако этого нельзя сделать, если вы используете код LGPL.
Будет ли компиляция с помощью cython работать с приложением Python 3.4 Django, или его можно заставить работать без огромных усилий?
@ Даниэль: Не уверен. Не пробовал на Django. Не стесняйтесь задавать новый вопрос по этому поводу.
@mlvljr FWIW, IMHO компиляция в двоичные файлы - это хороший компромисс между продажей всех ваших секретов и попыткой защиты от реверс-инжиниринга класса NSA. Esp, если у вас большая база кода Python и есть причины для паранойи. ;)
POST hithwen теперь недействителен.
использование cxfreeze (py2exe для linux) выполнит эту работу.
http://cx-freeze.sourceforge.net/
он доступен в репозиториях ubuntu
Я думаю, что это просто объединяет файлы .pyc. Cython, Shed Skin и PyPy выходят за рамки байт-кода.
Я думаю, что есть еще один способ защитить ваш код Python; часть метода обфускации. Я считаю, что была игра, такая как Mount and Blade или что-то, что изменило и перекомпилировало их собственный интерпретатор python (исходный интерпретатор, который, как я считаю, является открытым исходным кодом), и просто изменил коды OP в таблице кодов OP, чтобы они были отличными от стандартного OP python коды.
Таким образом, исходный код python не изменен, но расширения файлов * .pyc отличаются, а коды операций не соответствуют общедоступному интерпретатору python.exe. Если вы проверили файлы данных игр, все данные были в формате исходного кода Python.
Таким образом, с незрелыми хакерами можно проделывать всевозможные неприятные уловки. Остановить кучу неопытных хакеров легко. Вы вряд ли сможете победить профессиональных хакеров. Но я полагаю, что большинство компаний не держат в штате профессиональных хакеров надолго (вероятно, потому, что их взламывают). Но незрелые хакеры повсюду (читаются как любопытные ИТ-специалисты).
Например, в модифицированном интерпретаторе вы можете разрешить ему проверять наличие определенных комментариев или строк документов в вашем источнике. У вас могут быть специальные коды OP для таких строк кода. Например:
OP 234 предназначен для исходной строки "# Авторские права, которые я написал" или скомпилируйте эту строку в коды операций, которые эквивалентны «if False:», если «# Copyright» отсутствует. По сути, отключение всего блока кода по какой-то непонятной причине.
Один из вариантов использования, где может быть осуществима перекомпиляция модифицированного интерпретатора, - это когда вы не писали приложение, приложение большое, но вам платят за его защиту, например, когда вы являетесь администратором выделенного сервера для финансового приложения.
Мне кажется немного противоречивым оставлять источник или коды операций открытыми для глаз, но использовать SSL для сетевого трафика. SSL тоже не на 100% безопасен. Но он используется, чтобы не дать БОЛЬШИНСТВУ глаз его прочитать. Небольшая предосторожность разумна.
Кроме того, если достаточное количество людей сочтет, что исходный код Python и коды операций слишком заметны, вероятно, кто-то в конечном итоге разработает хотя бы простой инструмент защиты для него. Таким образом, чем больше людей спрашивают, «как защитить приложение Python», тем больше способствует этому развитию.
Можно иметь байт-код py2exe в зашифрованном ресурсе для модуля запуска C, который загружает и выполняет его в памяти. Некоторые идеи здесь и здесь.
Некоторые также подумали о самомодифицирующаяся программа, чтобы сделать обратный инжиниринг дорогим.
Вы также можете найти учебники по предотвращению отладчиков, заставить дизассемблер выйти из строя, установить ложные точки останова отладчика и защитить свой код контрольными суммами. Найдите дополнительные ссылки по запросу ["зашифрованный код" выполнить "в памяти"].
Но, как уже говорили другие, если ваш код того стоит, обратные инженеры в конце концов добьются успеха.
Вы смотрели пиминификатор? Он минимизирует, запутывает и сжимает код 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)
Хороший момент в этом - деморализовать любого, кто пытается расшифровать функциональность. Объедините это с Cython и дополнительным шифрованием над модулями или интернет-звонками, и вы, вероятно, получите приз.
Единственное, что удалось сделать этому пакету, - это обмануть «обфускатора», заставив его запутать код.
это делало ошибки, когда я пытался. Я думаю, что он неправильно обработал данные и не полностью преобразовал их.
не работает для всего проекта или механизма шаблонов, так как ему нужно имя переменной для отображения в шаблоне
Кажется, что эта библиотека не поддерживается и дает мне ошибки с отступами. Я использую Python 3.7
Ага. Я могу подтвердить, что пиминификатор мертв
pyminifier может быть мертв, но я обнаружил, что последний push это репо был в мае 2020 года ... (как я его нашел: вилка techgaun.github.io/active-forks/index.html#liftoff/…, похоже, добавляет исправления других людей (возможно, глядя на открытые запросы на вытягивание в исходном репо) ...
Используйте Cython. Он скомпилирует ваши модули в высокопроизводительные файлы C, которые затем можно будет скомпилировать в собственные двоичные библиотеки. Это практически необратимо по сравнению с байт-кодом .pyc!
Я написал подробную статью о том, как настроить Cython для проекта Python, посмотрите:
Используйте тот же способ защиты двоичного файла c / C++, то есть запутайте тело каждой функции в исполняемом или двоичном файле библиотеки, вставьте инструкцию «переход» в начало каждой записи функции, перейдите к специальной функции, чтобы восстановить запутанный код. Байт-код - это двоичный код скрипта Python, поэтому
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) может использоваться обычным интерпретатором 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 таким способом.
Я был удивлен, что ни в одном ответе не увидел pyconcrete. Может потому что новее вопроса?
Это может быть именно то, что вам нужно (ред.).
Вместо того, чтобы запутывать код, он шифрует его и расшифровывает во время загрузки.
Из страница pypi:
Protect python script work flow
- your_script.py
import pyconcrete- pyconcrete will hook import module
- when your script do import
MODULE, pyconcrete import hook will try to findMODULE.pyefirst and then decryptMODULE.pyevia_pyconcrete.pydand execute decrypted data (as .pyc content)- encrypt & decrypt secret key record in
_pyconcrete.pyd(like DLL or SO) the secret key would be hide in binary code, can’t see it directly in HEX view
Короче говоря:
Для более подробной информации посмотрите этот отвечать.
Если вам интересна тема, вам поможет этот проект - pyprotect.
Если мы сосредоточимся на лицензировании программного обеспечения, я бы порекомендовал взглянуть на другой ответ на Stack Overflow, который я написал здесь, чтобы получить некоторое вдохновение о том, как может быть построена система проверки лицензионного ключа.
На 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 и т. д. здесь.
Существует исчерпывающий ответ о сокрытии исходного кода Python, который можно найти здесь.
Обсуждаются следующие возможные методы:
- использовать скомпилированный байт-код (python -m compileall)
- создатели исполняемых файлов (или установщики, такие как PyInstaller)
- программное обеспечение как услуга (на мой взгляд, лучшее решение для сокрытия кода)
- обфускаторы исходного кода Python
Ссылка идет на example.com.
py2exe просто хранит файлы с байтовым кодом .pyc в архиве .zip, так что это определенно не решение. Тем не менее, это может быть полезно в сочетании с подходящим сценарием запуска, чтобы заставить его работать под Linux.