Як захистити код Python?


632

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

Якщо ми поширимо .py файли або навіть .pyc файли, буде легко (декомпілювати та) видалити код, який перевіряє файл ліцензії.

Інший аспект полягає в тому, що мій роботодавець не хоче, щоб код читали наші клієнти, побоюючись, що код може бути викрадений або принаймні "нові ідеї".

Чи є хороший спосіб вирішити цю проблему? Переважно з розрядним розчином.

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


25
py2exe просто зберігає файли коду байтів .pyc в архіві .zip, тому це, безумовно, не є рішенням. Все-таки це може бути корисно в поєднанні з відповідним сценарієм перезавантаження, щоб змусити його працювати з Linux
Бер


Це найбільш вичерпна відповідь на ваше запитання: wiki.python.org/moin/Asking%20for%20Help/…
Майк

Відповіді:


378

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

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

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


157
Навіть якби код перевірки ліцензії був важким для інженерів зворотного зв’язку, оскільки він написаний на С, чи не все-таки буде відносно легко видалити виклики до коду перевірки ліцензії?
Блер Конрад

59
Так, це залежно від того, де проводиться перевірка ліцензії. Якщо дзвінків на розширення є багато, це може бути важко викорінити. Або ви можете перемістити якусь іншу найважливішу частину програми в перевірку ліцензії, так що видалення виклику до розширення калічить додаток.
Нед Батчелдер

103
Дійсно, вся ця робота полягає не у запобіганні модифікації, а у збільшенні її складності, щоб вона вже не варта. Все може бути реверсивним та модифікованим, якщо є достатня користь.
Нед Батчелдер

11
@Blair Conrad: Ні, якщо код перевірки ліцензії також приховує функціональність. Напр.mylicensedfunction(licenseblob liblob, int foo, int bar, std::string bash)
Брайан

8
Я фактично бачив комерційний код python, що постачається як вбудований python всередині бібліотеки С. Замість перетворення деяких частин коду на C вони приховують весь код пітона всередині захисного шару С. Потім, якщо вони хочуть, щоб модуль, імпортований python, вони пишуть тоне розширення python на вершині C. Відкритий код - це набагато простіший спосіб життя.
Майк Маккернс

454

"Чи є хороший спосіб вирішити цю проблему?" Ні. Ніщо не може бути захищено від зворотного проектування. Навіть мікропрограмне забезпечення на DVD-машинах було розроблено за допомогою зворотного ходу та відкрито ключ шифрування AACS . І це, незважаючи на те, що DMCA вчинило це кримінальне правопорушення.

Оскільки жоден технічний метод не може зупинити ваших клієнтів читати ваш код, вам доведеться застосовувати звичайні комерційні методи.

  1. Ліцензії. Контракти. Правила та умови. Це все ще працює, навіть коли люди можуть читати код. Зауважте, що деякі з компонентів на основі Python можуть вимагати сплати комісій, перш ніж продавати програмне забезпечення за допомогою цих компонентів. Також деякі ліцензії з відкритим кодом забороняють приховувати джерело або джерела цього компонента.

  2. Пропонуйте значну цінність. Якщо ваш матеріал настільки хороший - ціною, від якої важко відмовитись, немає жодного стимулу витрачати час і гроші на зворотне інженерія. Зворотна техніка дорога. Зробіть свій товар трохи дешевшим.

  3. Запропонуйте оновлення та удосконалення, які роблять будь-яку зворотну інженерію поганою ідеєю. Коли наступний випуск порушує їх зворотну інженерію, немає сенсу. Це можна віднести до абсурдних крайнощів, але вам слід запропонувати нові функції, які роблять наступний реліз більш цінним, ніж зворотна інженерія.

  4. Запропонуйте налаштування за такими привабливими ставками, що вони краще заплатять за створення та підтримку розширень.

  5. Використовуйте ліцензійний ключ, термін дії якого закінчується. Це жорстоко і дасть вам погану репутацію, але це, безумовно, змушує ваше програмне забезпечення перестати працювати.

  6. Запропонуйте це як веб-сервіс. SaaS не передбачає завантаження клієнтів.


7
Точка 2 ще важливіша. Якщо це дешевше, ніж зворотна інженерія, а також щорічні оновлення, ніхто не спробує, і навіть якщо це станеться, ніхто не заплатить хакеру замість постачальника програмного забезпечення.
м3нда

Це правда. Зворотний інжиніринг доцільний, але у більшості ситуацій дорогий. @ S.Lott, я вважаю, що пункт 6 має більше значення на основі цього питання. Якщо вихідний код дійсно потребує захисту, він повинен бути віддалений від кінцевого користувача.
Делалі

7
Запитання: "чи є хороший спосіб захистити мою сім'ю та себе від того, щоб зловмисники були вбиті уві сні?" Інтернет: "Ні. До кого можна дістатися, і жодне житло ніколи не на 100 відсотків непроникне. Смертна людська сім'я - неправильний інструмент для роботи".
Простий алгоритм

Пункт 5 не може бути застосований за тим самим припущенням, що він може бути розроблений і розбитий зворотним ходом.
jjmontes

313

Python - це не потрібний інструмент

Ви повинні використовувати правильний інструмент, щоб зробити все правильно, і Python не був розрахований на затуманення. Це навпаки; у Python все відкрито або легко розкрити чи змінити, оскільки це філософія мови.

Якщо ви хочете щось не бачити, знайдіть інший інструмент. Це не погано, важливо, щоб існувало кілька різних інструментів для різних звичаїв.

Затухання справді важке

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

Наявність юридичної вимоги - хороший шлях

Ви не можете перешкодити комусь зловживати вашим кодом, але ви можете легко виявити, чи є хтось. Тому це просто випадкове юридичне питання.

Захист коду завищений

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


16
Python - це не потрібний інструмент. Malbolge є. :)
johndodo

8
Хороша відповідь, але "випадковий юридичний питання"? Дійсно? Де ви живете, що у вас є якісь випадкові юридичні проблеми?
Марк Е. Хааз

1
Я думаю, якщо у нас є частота - як часто зламається дорогий неясний код - ми можемо сказати про практичність використання Python та неясного коду.
сергзач

Якщо ваш код має цікаві функції, той, хто зміг його неправильно використати, перерозподілив його @Macke
Delali

1
Як у світі ви «легко виявите, чи хтось це робить»?
Make42

145

Складіть пітон і розподіліть двійкові файли!

Розумна ідея:

Використовуйте Cython , Nuitka , Shed Skin або щось подібне, щоб компілювати python в код C, а потім поширювати додаток як бінарні бібліотеки python (pyd).

Таким чином, жодного коду Python (байт) не залишилося, і ви зробили будь-яку розумну кількість затемнення, яку ніхто (тобто ваш роботодавець) не міг очікувати від звичайного Кодексу, я думаю. (.NET або Java менш безпечні, ніж цей випадок, оскільки цей байт-код не затуманений і порівняно легко може бути декомпільований у розумне джерело.)

Cython стає все більш сумісним із CPython, тому я думаю, що це має працювати. (Я насправді розглядаю це для нашого продукту. Ми вже будуємо деякі ліцензії третьої сторони як pyd / dlls, тому доставка нашого власного коду python як бінарних файлів не є надто великим кроком для нас.)

Дивіться це повідомлення в блозі (не мені) для підручника про те, як це зробити. (thx @hithwen)

Божевільна ідея:

Ви, ймовірно, можете отримати Cython для зберігання C-файлів окремо для кожного модуля, а потім просто об'єднати їх усіх і створити їх з важкими вкладками. Таким чином, ваш модуль Python досить монолітний і його важко чіпати за допомогою загальних інструментів.

Поза божевільним:

Можливо, ви зможете створити єдиний виконуваний файл, якщо зможете статично зв’язати (і оптимізувати) пітон виконання та всі бібліотеки (dlls). Таким чином, було б точно важко перехоплювати дзвінки в / з python та будь-які бібліотеки фреймворку, якими ви користуєтесь. Це неможливо зробити, якщо ви використовуєте код LGPL.


Чи вдасться компілювати роботу з cython за допомогою програми Django python 3.4, чи можна змусити його працювати без величезних зусиль?
Даніель

@Daniel: Не впевнений. Не пробував на Джанго. Сміливо публікуйте нове запитання з цього приводу.
Макке


4
@mlvljr FWIW, Компіляція IMHO до бінарних файлів - це приємний компроміс між продажем усіх своїх секретів та спробою захистити від реверсивної інженерії класу NSA. Окрім того, якщо у вас є велика база коду пітона, і ви можете бути параноїком. ;)
Макке

2
POST hithwen зараз недійсний.
qg_java_17137

58

Я розумію, що ви хочете, щоб ваші клієнти використовували силу python, але не хочете розкривати вихідний код.

Ось мої пропозиції:

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

(b) Використовуйте cython замість Python

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


1
Інші можливості в тій самій жилці: Shed Skin code.google.com/p/shedskin та Nuitka kayhayen24x7.homelinux.org/blog/nuitka-a-python-compiler
TryPyPy

Я щойно подивився на Shed Skin, як це запропонував TyPyPy, і, здається, це справді хороші речі!
Філіпе

34

Чи знає ваш роботодавець, що він може "вкрасти" назад будь-які ідеї, які отримують інші люди з вашого коду? Я маю на увазі, якщо вони можуть прочитати вашу роботу, то ви можете і їх. Можливо, дивлячись на те, як ви можете отримати вигоду з ситуації, ви отримаєте кращий прибуток від своїх інвестицій, ніж боятися, скільки ви можете втратити.

[EDIT] Відповідь на коментар Ніка:

Нічого не здобутого і нічого втраченого. Клієнт має те, що хоче (і заплатив за те, що сам змінив). Оскільки він не випускає зміни, це немовби не відбулося для всіх інших.

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

Якщо вони не змінять повідомлення про авторські права, клієнти 2-го рівня помітять, що програмне забезпечення виходить від вас оригінальним, і запитають, що відбувається. Цілком ймовірно, що вони зв’яжуться з вами, і ви дізнаєтесь про перепродажу вашої роботи.

Знову маємо два випадки: оригінальний клієнт продав лише кілька примірників. Це означає, що вони все одно не заробили багато грошей, то чому б це турбувати. Або продали в обсязі. Це означає, що для вас більше шансів дізнатися про те, що вони роблять, і щось зробити.

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


Що робити, якщо вони випускають програмне забезпечення для клієнтів, а клієнт внутрішньо модифікує його, не випускаючи його знову?
Нік Т

@Nick: Це жодним чином не змінює ситуацію. Дивіться мої зміни.
Аарон Дігулла

6
+1 за крадіжку ідей назад. Навіщо обмежувати власні повноваження клієнтів вашими внутрішніми рішеннями, коли ви могли бачити, як інші покращують ваше рішення та відповідно покращують ваш власний продукт? "Якщо у вас є яблуко, а у мене яблуко, і ми обмінюємось цими яблуками, то у вас і у мене все одно буде по одне яблуко. Але якщо у вас є ідея, і я маю ідею, і ми обмінюємось цими ідеями, то кожен з нас матиме дві ідеї ».
Йорданія

Що робити, якщо хтось із ваших клієнтів повторно випускає ваш код або ідеї безкоштовно та анонімно? Ви не можете сказати, хто це зробив, і подати до суду, і тому, що вони не отримали з цього приводу, ви також не будете. Це зіпсує вашу роботу, тоді як один з вас клієнтів заплатив за неї лише основну ціну. (очевидно, працює лише в тому випадку, якщо у вас є кілька клієнтів для вирішення)
Skandix

1
@Skandix Як саме це би працювало? Завантаження вашої роботи в Інтернет не шкодить вам. Це почне заподіювати вам шкоду, якби багато людей знайшли це, а ті люди замість цього платять клієнтам. Крадіжка коду - міф. "Мої знання - безкоштовно, мій час дорогий" (не впевнений, хто це сказав).
Аарон Дігулла

34

Ви переглядали пімініфікатор ? Це робить Minify, затемнювати та стискати 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)

6
Хорошим моментом у цьому є деморалізація тих, хто намагається розшифрувати функціональність. Поєднайте це з Cython та деякими додатковими криптовалютами через модулі чи Інтернет-дзвінки, і ви, мабуть, отримали приз.
м3нда

Єдине, що вдалося виконати цим пакетом, - це обдурити «обфускатора», що код придушений.
markroxor

це робило помилки, коли я намагався. Я думаю, що це неправильно обробляв дані і не повністю перетворював їх.
Vicrobot

не працює для цілого проекту чи шаблону, оскільки для відображення в шаблоні потрібна назва змінної
TomSawyer

Здається, ця бібліотека не підтримується, і дає мені помилки з відступом. Я використовую Python 3.7
PV

25

Не покладайтеся на опущення. Як ви правильно зробили висновок, він забезпечує дуже обмежений захист. ОНОВЛЕННЯ: Ось посилання на папір якому зворотно спроектовано заплутаний код пітона в Dropbox. Підхід - перекомпонування опкоду - хороший бар'єр, але, очевидно, його можна перемогти.

Натомість, як багато плакатів згадують, це:

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

Крім того, як робить ударний пітфон IDE WingIDE: Віддайте код . Правильно, видайте код і попросіть людей повернутися для оновлення та підтримки.


1
Як ця екстремальна ідея. Отримує це величезним способом та масовою часткою на ринку, тоді у вас дуже велика клієнтська база для підтримки та доповнення. Я також стикаюся з цим питанням, і всі відповіді на "ліцензування" в основному бувають, оскільки це не захищає від широкого копіювання, але не дає переваги частці ринку.
Томас Браун

Але, оновлення - це просто розпродаж… та як би вони платили за це? Чи не буде це просто підтримка?
Make42

Що стосується бізнес-моделі WingIDE: Підтримка - це сервіс, програмний продукт. Масштаби продуктів, сервіс ні. Підтримка - це лише хороша бізнес-модель, якщо іншої бізнес-моделі немає - це означає, якщо ніхто не купує ваш товар (з будь-якої причини), ви віддаєте товар, щоб у вас була клієнтська база, яка принаймні купує вашу послугу.
Make42

20

Використовуйте Cython . Він буде компілювати ваші модулі до високоефективних файлів C, які потім можуть бути скомпільовані в рідні бінарні бібліотеки. Це в основному незворотний, порівняно з байт-кодом .pyc!

Я написав докладну статтю про те, як налаштувати Cython для проекту Python, перевірте це:

Захист джерел Python за допомогою Cython


19

У доставці файлів .pyc є свої проблеми - вони не сумісні ні з будь-якою іншою версією python, ніж з версією python, для якої вони були створені, а значить, ви повинні знати, яка версія python працює в системах, на яких буде працювати продукт. Це дуже обмежуючий фактор.


Так, але ні, якщо ви розповсюджуєте цю точну версію Python зі своїм затуманеним кодом.
Олексій

17

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

Таким чином, перевірку ліцензії можна проводити в безпеці вашої власної серверної кімнати.


+1 (назад до 0): це здається єдиним вірним рішенням проблеми, вважаючи такий підхід практичним для постановки.
інтуїтована

10
Майте на увазі, що якщо ваш веб-сервер ліцензування знизиться або доступ клієнтів до Інтернету знижений, ваш клієнт не буде радий, що він не може вести свій бізнес через втрату доступу до ліцензійних чеків.
DevPlayer

1
@DevPlayer Є рішення для цього. Ви можете реалізувати механізм локального ключа, який дозволяє тимчасовий доступ, коли програмне забезпечення не може отримати сервер віддаленого ліцензування.
Джеффрі

1
@ Джефрі: Це поверне вас до місця, з якого ви почали - як захистити цей код. Щоб бути більш безпечним, вам потрібно покласти частину ключових функціональних можливостей на свій власний сервер, тому його заміна зажадає значних зусиль (в який момент, чому б просто не запустити конкурента з відкритим кодом?)
Відмітка

14

Хоча ідеального рішення немає, можна зробити наступне:

  1. Перемістіть критичну частину стартового коду в рідну бібліотеку.
  2. Закріпіть перевірку ліцензії у рідній бібліотеці.

Якби виклик до рідного коду було видалено, програма все одно не запускалася. Якщо його не буде видалено, ліцензія буде застосована.

Хоча це не крос-платформа чи рішення з чистого Python, воно буде працювати.


3
Підхід до рідної бібліотеки комусь значно полегшує програмування насильницької системи ліцензійних ключів, оскільки вони можуть використовувати ваш власний код та API для перевірки своїх ліцензій.
Том Лейс

8
Тому? Використовуйте RSA, щоб підписати свою ліцензію та дозволити їм жорстоко примусити ваш приватний ключ, скажімо, що складається з 1024 біт. Це можливо, але забирає багато часу ... а значить - гроші.
Абган

12

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

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

Таким чином можна поводити всілякі неприємні хитрощі, щоб возитися з незрілими хакерами. Зупинити купу недосвідчених хакерів легко. Це професійні хакери, які ви, швидше за все, не обіграєте. Але більшість компаній довго не тримають професіоналів-хакерів на персоналі (ймовірно, тому, що речі зламаються). Але незрілі хакери є всюди (читайте як цікаві ІТ-співробітники).

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

OP 234 призначений для вихідного рядка "# Copyright я написав це" або компілюйте цей рядок у коди op, що еквівалентно "if False:" якщо "# Copyright" відсутній. В основному вимкнення цілого блоку коду через те, що, здається, є якоюсь незрозумілою причиною.

Один з випадків використання, коли перекомпіляція модифікованого інтерпретатора може бути здійсненою - це те, де ви не написали додаток, програма велика, але вам потрібно її захистити, наприклад, коли ви призначений адміністратор сервера для фінансового додатка.

Я вважаю трохи суперечливим залишати джерело або опкоди відкритими для очних яблук, але використовувати SSL для мережевого трафіку. SSL також не є 100% безпечним. Але він використовується для того, щоб зупинити НАЙБІЛЬШЕ очі від його читання. Розумна обережність обережна.

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


11

Єдиний надійний спосіб захисту коду - це запустити його на сервері, яким ви керуєте, та надати своїм клієнтам клієнта, який взаємодіє з цим сервером.


10

Я був здивований тим, що не бачив піконтон в жодній відповіді. Може тому, що це новіше питання?

Це може бути саме те, що вам потрібно (ред.).

Замість того, щоб обфускувати код, він зашифровує його та розшифровує під час завантаження.

З сторінки pypi :

Захистіть робочий потік сценарію python

  • your_script.py import pyconcrete
  • pyconcrete зачепить модуль імпорту
  • коли ваш сценарій імпортує MODULE, гак імпорту pyconcrete спробує спочатку знайти, MODULE.pyeа потім розшифрувати MODULE.pyeза допомогою _pyconcrete.pydта виконати розшифровані дані (як .pyc вміст)
  • шифрувати та розшифровувати запис секретного ключа в _pyconcrete.pyd (наприклад, DLL або SO), секретний ключ буде приховано у двійковому коді, його не можна побачити безпосередньо у вікні HEX

9

Залежно від того, хто такий клієнт, простий механізм захисту в поєднанні з розумною ліцензійною угодою буде далеко ефективнішим, ніж будь-яка складна система ліцензування / шифрування / затухання.

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

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

Концентруйтеся на тому, щоб зробити свій код якомога приємнішим для використання - щасливі клієнти зроблять вашу компанію набагато більше грошей, ніж запобігання деяким теоретичним піратству ..


8

Ще одна спроба зробити ваш код складніше вкрасти - використовувати jython, а потім використовувати java obfuscator .

Це має працювати досить добре, оскільки jythonc переводить код python у java, а потім java компілюється у байт-код. Тож унцію ви притупляєте класи, буде важко зрозуміти, що відбувається після декомпіляції, не кажучи вже про відновлення фактичного коду.

Єдина проблема з jython полягає в тому, що ви не можете використовувати модулі python, написані c.


6

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

Таким чином ви можете видавати файл ліцензії з відкритим ключем для кожного замовника.

Додатково ви можете використовувати пітон обфуськатор як цей (тільки гуглі його).


1
+1 для підписання; -1 для обфускатора Ви можете принаймні запобігти зміні коду.
Алі Афшар

2
Підписання не працює в цьому контексті. Завжди можна обійти завантажувач, що перевіряє підпис. Перше, що вам потрібно для корисного захисту програмного забезпечення - це непрозорий механізм завантаження. Не те, що Python робить легко.
ddaa

Так, завантажувальний пристрій в непітон.
Алі Афшар

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

6

Слід поглянути, як хлопці з getdropbox.com роблять це для свого клієнтського програмного забезпечення, включаючи Linux. Це досить складно зламати і вимагає досить творчих розбирань, щоб позбутися механізмів захисту.


8
але той факт, що це було минуло, означало, що вони не змогли - підсумок просто не намагайтеся, а йдіть на юридичний захист.
Chii

Чи публікується якась інформація про те, як пройти ці механізми захисту?
Мітар

6

Найкраще, що ви можете зробити з Python - це затемнити речі.

  • Викресліть усі документи
  • Поширюйте лише файли .pyc, зібрані.
  • заморозити його
  • Затемніть свої константи всередині класу / модуля, щоб довідка (конфігурація) не показувала все

Можливо, вам вдасться додати деяку додаткову незрозумілість, зашифрувавши її частину та розшифрувавши її на льоту та передавши її в eval (). Але незалежно від того, що ти робиш, хтось може зламати це.

Ніщо з цього не завадить рішучому зловмиснику розбирати байт-код або копати ваші api за допомогою довідки, dir тощо.


5

Ідея мати ліцензію з обмеженою часом та перевірити її в локально встановленій програмі не вийде. Навіть при ідеальній обфускації перевірку ліцензії можна зняти. Однак якщо ви перевірите ліцензію на віддаленій системі та запустите значну частину програми на закритій віддаленій системі, ви зможете захистити свій IP.

Запобігання конкурентам використання вихідного коду як власного або написання їх натхненної версії того самого коду, одним із способів захисту є додавання підписів до логіки вашої програми (деякі секрети, щоб можна було довести, що код був викрадений у вас) та придушити python вихідний код, тому важко читати та використовувати.

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

Це не допоможе запобігти злому вашої програми. Навіть з кодом обфускування ліцензійні матеріали будуть зламані, а програма може бути модифікована таким чином, щоб мати дещо іншу поведінку (так само, як компіляція коду до бінарного не допомагає захищати рідні програми).

На додаток до затуманення символів може бути корисною ідеєю відключення коду, що робить все ще більш заплутаним, якщо, наприклад, графіки викликів вказують на багато різних місць, навіть якщо насправді ці різні місця в кінцевому підсумку роблять те саме.

Логічний підпис всередині прихованого коду (наприклад, ви можете створити таблицю значень, яка використовується логікою програми, але також використовується як підпис), яка може бути використана для визначення того, що код походить від вас. Якщо хтось вирішить використовувати ваш прихований кодовий модуль як частину власного продукту (навіть після того, як його повторно обмацують, щоб він здався інакшим), ви можете показати, що цей код викрадений з вашим секретним підписом.


4

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

З урахуванням сказаного, я просто перевіряв google на предмет затемнення пітона і не виявляв багато нічого. У рішенні .Net затемнення буде першим підходом до вашої проблеми на платформі Windows, але я не впевнений, чи є у когось рішення для Linux, які працюють з Mono.

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

Все зводиться до компромісів. З одного боку у вас є легкість розробки програмного забезпечення в python, в якій також дуже важко приховати секрети. З іншого боку, у вас є програмне забезпечення, написане в асемблері, яке важче написати, але приховати секрети набагато простіше.

Ваш начальник повинен вибрати точку десь уздовж цього континууму, який підтримує його вимоги. І тоді він повинен дати вам інструменти та час, щоб ви могли будувати те, що він хоче. Однак я маю надію, що він буде заперечувати проти реальних витрат на розвиток порівняно з потенційними грошовими втратами.


4

Довга історія:

  1. Зашифруйте свій вихідний код
  2. Напишіть власний завантажувач модулів python, щоб розшифрувати код під час імпорту
  3. Встановіть завантажувач модулів у C / C ++
  4. Ви можете додати додаткові функції до завантажувача модулів, наприклад, антивідладчик, контроль ліцензії, апаратне прив'язування відбитків пальців тощо.

Детальніше дивіться цю відповідь .

Якщо вас цікавить тема, вам допоможе цей проект - піпротект .


3

Можливо, щоб байт-код py2exe був у зашифрованому ресурсі для запуску C, який завантажує та виконує його в пам'яті. Деякі ідеї тут і тут .

Деякі також подумали про програму самовиправлення, яка зробить зворотну інженерію дорогою.

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

Але, як уже говорили інші, якщо ваш код того вартий, інженери-реверси в кінцевому підсумку досягнуть успіху.


3

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

На 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, і т.д. конфигурируется тут .


2

Використовуйте той самий спосіб захисту двійкового файлу c / c ++, тобто обмацуйте кожен функціональний орган у виконавчому або бібліотечному двійковому файлі, вставте інструкцію "стрибок" на початку кожного запису функції, перейдіть до спеціальної функції, щоб відновити затуманений код. Байт-код - це двійковий код скрипту Python, так

  • Спочатку компілюйте скрипт python для кодування об'єкта
  • Потім повторіть кожний об'єкт коду, затемніть ко-код кожного кодового об'єкта як наступний
    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 таким чином.



1

Існує вичерпна відповідь про приховування вихідного коду python, яку можна знайти тут .

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


Посилання переходить до example.com.
Даріан

@Darian дякую, що вказали на це. Я оновив посилання.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.