it-swarm.com.de

Wie kann ich Python-Code schützen?

Ich entwickle in Python eine Software, die an die Kunden meines Arbeitgebers verteilt wird. Mein Arbeitgeber möchte die Verwendung der Software mit einer zeitlich beschränkten Lizenzdatei einschränken.

Wenn wir die .py-Dateien oder sogar .pyc-Dateien verteilen, kann der Code, der die Lizenzdatei überprüft, leicht dekompiliert und entfernt werden.

Ein anderer Aspekt ist, dass mein Arbeitgeber nicht möchte, dass der Code von unseren Kunden gelesen wird, da er befürchtet, dass der Code gestohlen wird oder zumindest die "neuen Ideen".

Gibt es eine gute Möglichkeit, dieses Problem zu lösen? Vorzugsweise mit einer Standardlösung.

Die Software läuft auf Linux-Systemen (daher glaube ich nicht, dass py2exe den Trick beherrscht).

563
Jordfräs

Python ist eine von Bytecode kompilierte interpretierte Sprache und ist sehr schwer zu blockieren. Selbst wenn Sie einen Exe-Packager wie py2exe verwenden, ist das Layout der ausführbaren Datei bekannt und die Python-Bytecodes sind gut verstanden.

In solchen Fällen müssen Sie normalerweise einen Kompromiss eingehen. Wie wichtig ist es wirklich, den Code zu schützen? Gibt es echte Geheimnisse (zum Beispiel einen Schlüssel zur symmetrischen Verschlüsselung von Banküberweisungen) oder sind Sie nur paranoid? Wählen Sie die Sprache, mit der Sie das beste Produkt am schnellsten entwickeln können, und machen Sie sich realistisch, wie wertvoll Ihre neuartigen Ideen sind.

Wenn Sie sich dazu entschließen, die Lizenzprüfung wirklich sicher zu erzwingen, schreiben Sie sie als kleine C-Erweiterung, damit der Lizenzprüfcode für das Reverse Engineering besonders hart (aber nicht unmöglich!) Sein kann .

336
Ned Batchelder

"Gibt es eine gute Möglichkeit, mit diesem Problem umzugehen?" Nein, nichts kann gegen Reverse Engineering geschützt werden. Sogar die Firmware auf DVD-Rechnern wurde zurückentwickelt und der AACS-Verschlüsselungsschlüssel verfügbar gemacht. Und das trotz der DMCA, die das zu einer Straftat macht.

Da keine technische Methode Ihre Kunden daran hindern kann, Ihren Code zu lesen, müssen Sie handelsübliche Methoden anwenden.

  1. Lizenzen Verträge. Geschäftsbedingungen. Dies funktioniert auch dann, wenn Benutzer den Code lesen können. Beachten Sie, dass für einige Ihrer Python-basierten Komponenten Gebühren anfallen müssen, bevor Sie Software verkaufen, die diese Komponenten verwendet. Einige Open-Source-Lizenzen verbieten Ihnen außerdem, die Quelle oder Herkunft dieser Komponente zu verbergen. 

  2. Bieten Sie erheblichen Wert. Wenn Ihr Material so gut ist - zu einem Preis, der schwer zu verweigern ist - gibt es keinen Anreiz, Zeit und Geld zu verschwenden, indem Sie etwas zurückentwickeln. Reverse Engineering ist teuer. Machen Sie Ihr Produkt etwas günstiger.

  3. Bieten Sie Upgrades und Verbesserungen, die das Reverse Engineering zu einer schlechten Idee machen. Wenn die nächste Version ihr Reverse Engineering bricht, hat es keinen Sinn. Dies kann bis in die absurden Extreme getragen werden, Sie sollten jedoch neue Funktionen anbieten, die die nächste Version wertvoller machen als das Reverse Engineering.

  4. Bieten Sie Anpassungen zu Preisen an, die so attraktiv sind, dass sie lieber dafür bezahlen, dass Sie die Verbesserungen erstellen und unterstützen.

  5. Verwenden Sie einen Lizenzschlüssel, der abläuft. Dies ist grausam und gibt Ihnen einen schlechten Ruf, aber Ihre Software wird definitiv nicht mehr funktionieren. 

  6. Bieten Sie es als Webservice an. SaaS beinhaltet keine Downloads für Kunden. 

433
S.Lott

Python ist nicht das Werkzeug, das Sie brauchen

Sie müssen das richtige Werkzeug verwenden, um das Richtige zu tun, und Python wurde nicht dafür entwickelt, verschleiert zu werden. Es ist das Gegenteil. In Python ist alles offen oder leicht zu enthüllen oder zu ändern, weil dies die Philosophie der Sprache ist.

Wenn Sie etwas möchten, das Sie nicht durchschauen können, suchen Sie nach einem anderen Werkzeug. Dies ist keine schlechte Sache, es ist wichtig, dass verschiedene Werkzeuge für unterschiedliche Zwecke vorhanden sind.

Verschleierung ist wirklich schwer

Sogar kompilierte Programme können rückentwickelt werden. Denken Sie nicht, dass Sie jeden Code vollständig schützen können. Sie können verschleiertes PHP analysieren, den Flash-Verschlüsselungsschlüssel brechen, usw. Neuere Versionen von Windows werden jedes Mal geknackt.

Eine gesetzliche Anforderung ist ein guter Weg

Sie können nicht verhindern, dass jemand Ihren Code missbraucht, aber Sie können leicht herausfinden, ob jemand dies tut. Daher ist es nur ein beiläufiges rechtliches Problem.

Der Codeschutz wird überschätzt

Heutzutage tendieren Geschäftsmodelle dazu, Dienstleistungen anstelle von Produkten zu verkaufen. Sie können keine Dienste kopieren, piraten oder stehlen. Vielleicht ist es Zeit zu überlegen, mit dem Fluss zu gehen ...

305
e-satis

Kompilieren Sie Python und verteilen Sie Binärdateien!

Sinnvolle Idee: 

Verwenden Sie Cython , Nuitka , Shed Skin oder etwas Ähnliches, um Python in C-Code zu kompilieren, und verteilen Sie Ihre App stattdessen als Python-Binärbibliotheken (pyd).

Auf diese Weise ist kein Python-Code (Byte-Code) mehr vorhanden, und Sie haben jede vernünftige Verschleierung vorgenommen, die jeder (d. H. Ihr Arbeitgeber) von regulärem Code erwarten könnte, denke ich. (.NET oder Java sind weniger sicher als dieser Fall, da dieser Bytecode nicht verschleiert wird und relativ leicht in eine vernünftige Quelle zerlegt werden kann.)

Cython wird immer besser mit CPython kompatibel, daher denke ich, dass es funktionieren sollte. (Ich erwäge das eigentlich für unser Produkt. Wir bauen bereits einige Drittanbieter-Bibliotheken als pyd/dlls, daher ist der Versand unseres eigenen Python-Codes als Binärdateien für uns kein allzu großer Schritt.)

In This Blog Post (nicht von mir) finden Sie eine Anleitung dazu. (thx @hithwen)

Verrückte Idee:

Sie könnten Cython wahrscheinlich dazu bringen, die C-Dateien für jedes Modul separat zu speichern, sie dann einfach alle zu verketten und mit starkem Inlining zu erstellen. Auf diese Weise ist Ihr Python-Modul ziemlich monolithisch und mit gängigen Tools nur schwer zugänglich.

Jenseits von verrückt:

Sie können möglicherweise eine einzige ausführbare Datei erstellen, wenn Sie die Python-Laufzeitumgebung und alle Bibliotheken (DLLs) statisch verknüpfen (und mit ihnen optimieren) können. Auf diese Weise ist es sicherlich schwierig, Aufrufe an/von Python und den von Ihnen verwendeten Framework-Bibliotheken abzufangen. Dies ist jedoch nicht möglich, wenn Sie LGPL-Code verwenden.

130
Macke

Ich verstehe, dass Sie möchten, dass Ihre Kunden die Leistungsfähigkeit von Python nutzen, den Quellcode jedoch nicht verfügbar machen möchten.

Hier sind meine Vorschläge:

(a) Schreiben Sie die kritischen Teile des Codes als C- oder C++ - Bibliotheken und verwenden Sie dann SIP oder swig , um die C/C++ - APIs für den Python-Namespace bereitzustellen.

(b) Verwenden Sie cython anstelle von Python

(c) In (a) und (b) sollte es möglich sein, die Bibliotheken als lizenziertes Binärprogramm mit einer Python-Schnittstelle zu verteilen.

57
bhadra

Ist Ihrem Arbeitgeber bekannt, dass er Ideen, die andere Personen von Ihrem Code erhalten, "stehlen" kann? Ich meine, wenn sie Ihre Arbeit lesen können, können Sie auch ihre. Ein Blick auf die Frage, wie Sie von der Situation profitieren können, könnte zu einer besseren Rendite Ihrer Investition führen, als zu befürchten, wie viel Sie verlieren könnten.

[EDIT] Antwort auf Nicks Kommentar:

Nichts hat gewonnen und nichts verloren. Der Kunde hat, was er will (und bezahlt hat, seit er die Änderung selbst vorgenommen hat). Da er die Änderung nicht freigibt, ist es, als ob es nicht für alle anderen passiert wäre.

Wenn der Kunde nun die Software verkauft, muss er den Copyright-Hinweis ändern (was illegal ist, damit Sie klagen können und gewinnen -> einfacher Fall).

Wenn sie den Copyright-Hinweis nicht ändern, werden die Kunden der zweiten Stufe feststellen, dass die Software von Ihnen stammt und sich fragen, was los ist. Die Chancen stehen gut, dass sie sich mit Ihnen in Verbindung setzen und so lernen Sie den Weiterverkauf Ihrer Arbeit kennen.

Wieder haben wir zwei Fälle: Der ursprüngliche Kunde verkaufte nur wenige Exemplare. Das bedeutet, dass sie sowieso nicht viel Geld verdient haben, warum also die Mühe machen. Oder sie verkauften sich in Volumen. Dies bedeutet, dass Sie bessere Chancen haben, zu erfahren, was sie tun und etwas dagegen unternehmen.

Aber am Ende versuchen die meisten Unternehmen, das Gesetz einzuhalten (sobald ihr Ruf ruiniert ist, ist es viel schwieriger, Geschäfte zu machen). Sie stehlen Ihre Arbeit also nicht, sondern arbeiten mit Ihnen zusammen, um sie zu verbessern. Wenn Sie also die Quelle angeben (mit einer Lizenz, die Sie vor dem einfachen Weiterverkauf schützt), besteht die Chance, dass sie einfach die von ihnen vorgenommenen Änderungen zurückschieben, da dies sicherstellt, dass die Änderung in der nächsten Version enthalten ist und sie nicht beibehalten werden müssen . Das ist Win-Win: Sie erhalten Änderungen und sie können die Änderung selbst vornehmen, wenn sie wirklich dringend benötigt werden, selbst wenn Sie nicht bereit sind, sie in die offizielle Veröffentlichung aufzunehmen.

33
Aaron Digulla

Haben Sie einen Blick auf pyminifier geworfen? Sie können Python-Code minimieren, verschleiern und komprimieren. Der Beispielcode sieht für gelegentliches Reverse Engineering ziemlich böse aus.

$ 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)
27
Lmwangi

Verlassen Sie sich nicht auf Verschleierung. Wie Sie richtig festgestellt haben, bietet es einen sehr eingeschränkten Schutz. UPDATE: Hier ist ein Link zu Papier , der den verwirrten verschleierten Python-Code in Dropbox umgekehrt hat. Der Ansatz - Opcode-Remapping ist eine gute Barriere, kann aber eindeutig besiegt werden.

Stattdessen machen es viele Plakate so:

  • Keine Reverse-Engineering-Zeit wert (Ihre Software ist so gut, es macht Sinn zu bezahlen)
  • Lassen Sie sie einen Vertrag unterzeichnen und führen Sie, falls möglich, eine Lizenzprüfung durch. 

Alternativ dazu kann WingIDE wie der Kick-Ass Python IDE Folgendes tun: Geben Sie den Code weg. Richtig, gib den Code weg und lass die Leute zurückkommen, um Upgrades und Support zu erhalten.

25
Konrads

Beim Versand von .pyc-Dateien treten Probleme auf - sie sind mit keiner anderen Python-Version als der Python-Version kompatibel, mit der sie erstellt wurden. Das bedeutet, dass Sie wissen müssen, auf welcher Python-Version auf den Systemen das Produkt ausgeführt wird. Das ist ein sehr einschränkender Faktor.

17
Erik Forsberg

Unter bestimmten Umständen ist es möglich, die Software (alle oder zumindest einen wichtigen Teil) in einen Webdienst zu verschieben, den Ihre Organisation hostet.

Auf diese Weise können die Lizenzprüfungen in der Sicherheit Ihres eigenen Serverraums durchgeführt werden.

16
Oddthinking

Obwohl es keine perfekte Lösung gibt, kann Folgendes getan werden:

  1. Verschieben Sie einen wichtigen Teil des Startcodes in eine native Bibliothek.
  2. Erzwingen Sie die Lizenzprüfung in der nativen Bibliothek.

Wenn der Aufruf des nativen Codes entfernt werden würde, würde das Programm sowieso nicht starten. Wenn sie nicht entfernt wird, wird die Lizenz erzwungen.

Obwohl dies keine plattformübergreifende oder reine Python-Lösung ist, wird es funktionieren.

14
I K

Ich denke, es gibt eine weitere Methode, um Ihren Python-Code zu schützen. Teil der Verschleierungsmethode. Ich glaube, es gab ein Spiel wie Mount und Blade oder etwas, das ihren eigenen Python-Interpreter (den ursprünglichen Interpreter, von dem ich glaube, dass er Open Source ist) geändert und neu kompiliert hat. Er hat lediglich die OP-Codes in der OP-Codetabelle geändert, um sich vom Standard-Python-OP zu unterscheiden Codes.

Die Python-Quelle ist also unverändert, aber die Dateierweiterungen der * .pyc-Dateien sind unterschiedlich und die Op-Codes stimmen nicht mit dem öffentlichen Interpreter python.exe überein. Wenn Sie die Spieledatendateien überprüft haben, waren alle Daten im Python-Quellformat.

Auf diese Weise kann man mit unreifen Hackern alle möglichen bösen Tricks machen. Ein Haufen unerfahrener Hacker zu stoppen ist einfach. Es sind die professionellen Hacker, die Sie wahrscheinlich nicht schlagen werden. Aber die meisten Unternehmen lassen sich keine langweiligen Profis vorweisen (wahrscheinlich, weil die Dinge gehackt werden). Aber unreife Hacker gibt es überall (lesen Sie als neugierige IT-Mitarbeiter).

In einem modifizierten Interpreter können Sie beispielsweise zulassen, dass bestimmte Kommentare oder Dokumentzeichenfolgen in Ihrer Quelle geprüft werden. Sie könnten spezielle OP-Codes für solche Codezeilen haben. Zum Beispiel:

OP 234 ist für die Quellzeile "# Copyright Ich habe dies geschrieben" Oder kompiliere diese Zeile in Op-Codes, die gleich "if False:" sind, wenn "# Copyright" fehlt. Grundsätzlich das Deaktivieren eines ganzen Codeblocks aus einem unklaren Grund.

Ein Anwendungsfall, in dem das Neukompilieren eines geänderten Interpreters möglich ist, ist möglich, wenn Sie die App nicht geschrieben haben. Die App ist groß, aber Sie werden dafür bezahlt, um sie zu schützen, beispielsweise wenn Sie ein dedizierter Serveradministrator für eine Finanz-App sind.

Ich finde es ein wenig widersprüchlich, die Quelle oder die Opcodes für Augäpfel offen zu lassen, aber SSL für den Netzwerkverkehr zu verwenden. SSL ist auch nicht 100% sicher. Aber es wird verwendet, um die meisten Augen am Lesen zu hindern. Eine kleine Vorsichtsmaßnahme ist sinnvoll.

Wenn genug Leute der Meinung sind, dass Python-Quell- und Opcodes zu sichtbar sind, wird wahrscheinlich irgendjemand irgendwann mindestens ein einfaches Schutzwerkzeug dafür entwickeln. Je mehr Leute fragen, "wie man die Python-App schützt", desto mehr fördert diese Entwicklung.

10
DevPlayer

Der zuverlässigste Weg, Code zu schützen, besteht darin, ihn auf einem Server auszuführen, den Sie steuern, und Ihren Clients einen Client bereitzustellen, der eine Schnittstelle zu diesem Server herstellt.

10
Alex Coventry

Je nachdem, wer der Kunde ist, ist ein einfacher Schutzmechanismus in Kombination mit einer vernünftigen Lizenzvereinbarung weit wirksamer als jedes komplexe Lizenzierungs-/Verschlüsselungs-/Verschleierungssystem.

Die beste Lösung wäre, den Code als Service zu verkaufen, beispielsweise durch das Hosten des Service oder das Anbieten von Support - obwohl dies nicht immer praktikabel ist.

Der Versand des Codes als .pyc -Dateien verhindert, dass Ihr Schutz durch einige # vereitelt wird, aber es ist kaum ein wirksamer Schutz gegen Piraterie (als ob es eine solche Technologie gäbe) und am Ende des Tages Es sollte nichts erreicht werden, was eine anständige Lizenzvereinbarung mit dem Unternehmen bewirken würde.

Konzentrieren Sie sich darauf, Ihren Code so benutzerfreundlich wie möglich zu gestalten. Wenn Sie zufriedene Kunden haben, bringt Ihr Unternehmen weit mehr Geld als die Verhinderung theoretischer Produktpiraterie.

9
dbr

Ein weiterer Versuch, den Code schwieriger zu stehlen, besteht in der Verwendung von Jython und dann mit Java obfuscator

Dies sollte ziemlich gut funktionieren, da Jythonc Python-Code nach Java übersetzt und Java dann zu Bytecode kompiliert wird. Wenn du also die Klassen verschleierst, wird es schwer zu verstehen sein, was nach der Dekompilierung passiert. 

Das einzige Problem bei Jython ist, dass Sie keine in c geschriebenen Python-Module verwenden können.

8
Piotr Czapla

Sie sollten einen Blick darauf werfen, wie die Jungs von getdropbox.com dies für ihre Client-Software tun, einschließlich Linux. Es ist ziemlich schwierig zu knacken und erfordert eine ziemlich kreative Zerlegung, um die Schutzmechanismen zu überwinden.

6
fwzgekg

Wie wäre es, wenn Sie Ihren Code mit Standard-Verschlüsselungsschemata signieren, indem Sie wichtige Dateien hashen, signieren und mit öffentlichen Schlüsselmethoden überprüfen?

Auf diese Weise können Sie für jeden Kunden eine Lizenzdatei mit einem öffentlichen Schlüssel ausgeben.

Zusätzlich können Sie einen Python-Obfuscator wie this (einfach googeln) verwenden.

6
Peter Parker

Verwenden Sie Cython . Sie werden Ihre Module zu hochperformanten C-Dateien kompilieren, die dann in native Binär-Bibliotheken kompiliert werden können. Dies ist im Grunde nicht reversibel, verglichen mit dem .pyc-Bytecode!

Ich habe einen ausführlichen Artikel darüber geschrieben, wie man Cython für ein Python-Projekt einrichten kann.

Python-Quellen mit Cython schützen

5
Vitaly Gordon

Ich war überrascht, als ich pyconcrete in keiner Antwort sah. Vielleicht weil es neuer ist als die Frage?

Es könnte genau das sein, was Sie brauchen (ed).

Anstatt den Code zu verschleiern, wird er verschlüsselt und zur Ladezeit entschlüsselt.

Von pypi page :

Schützen Sie den Arbeitsablauf des Python-Skripts 

  • your_script.py import pyconcrete
  • pyconcrete hakt das Importmodul ein 
  • wenn Ihr Skript MODULE, .__ importiert. pyconcrete import hook versucht zuerst MODULE.pye und dann .__ zu finden. MODULE.pye über _pyconcrete.pyd entschlüsseln und entschlüsselte Daten (als .pyc-Inhalt) ausführen 
  • verschlüsseln und Entschlüsseln des geheimen Schlüsseldatensatzes in _pyconcrete.pyd (wie DLL oder SO) würde der geheime Schlüssel im Binärcode verborgen sein, kann nicht sehen Sie es direkt in der HEX-Ansicht
5
mvallebr

Die Vorstellung einer zeitlich eingeschränkten Lizenz und deren Überprüfung in einem lokal installierten Programm wird nicht funktionieren. Selbst bei perfekter Verschleierung kann die Lizenzprüfung entfernt werden. Wenn Sie jedoch die Lizenz auf dem Remote-System überprüfen und einen erheblichen Teil des Programms auf Ihrem geschlossenen Remote-System ausführen, können Sie Ihre IP-Adresse schützen.

Um zu verhindern, dass Konkurrenten den Quellcode als ihren eigenen verwenden oder ihre inspirierte Version des gleichen Codes schreiben, besteht eine Möglichkeit zum Schutz darin, Ihrer Programmlogik Signaturen hinzuzufügen (einige Geheimnisse, um zu beweisen, dass Ihnen der Code gestohlen wurde) und zu verschleiern Python-Quellcode ist also schwer zu lesen und zu verwenden. 

Gute Verschleierung fügt Ihrem Code im Wesentlichen den gleichen Schutz hinzu, der durch das Kompilieren in ausführbare Dateien (und das Entfernen von Binärdateien) erfolgt. Herauszufinden, wie verschleierter komplexer Code funktioniert, ist möglicherweise noch schwieriger als das Erstellen Ihrer eigenen Implementierung. 

Dies hilft nicht, das Hacken Ihres Programms zu verhindern. Selbst bei Verschleierungscode wird Lizenzmaterial geknackt, und das Programm kann geändert werden, um ein etwas anderes Verhalten zu zeigen (in derselben Weise wie das Kompilieren von Code in Binärdateien nicht zum Schutz nativer Programme beiträgt). 

Neben der Verschleierung von Symbolen kann es sinnvoll sein, den Code nicht zu ändern, was alles noch verwirrender macht, wenn z. Anrufdiagramme zeigen auf viele verschiedene Orte, auch wenn diese verschiedenen Orte tatsächlich dasselbe tun. 

Logische Signatur in verschleiertem Code (z. B. können Sie eine Tabelle mit Werten erstellen, die von der Programmlogik verwendet wird, aber auch als Signatur verwendet wird), mit der festgestellt werden kann, dass der Code von Ihnen stammt. Wenn sich jemand dafür entscheidet, Ihr verschleiertes Codemodul als Teil seines eigenen Produkts zu verwenden (selbst wenn es erneut kopiert wurde, damit es anders aussieht), können Sie zeigen, dass der Code mit Ihrer geheimen Signatur gestohlen wird.

5
Mikael Lepistö

Das Beste, was Sie mit Python tun können, ist, Dinge zu verschleiern.

  • Entfernen Sie alle Dokumentenketten
  • Verteilen Sie nur die kompilierten .pyc-Dateien.
  • friere es ein
  • Verschleiern Sie Ihre Konstanten innerhalb einer Klasse/eines Moduls, damit help (config) nicht alles anzeigt

Möglicherweise können Sie zusätzliche Unklarheiten hinzufügen, indem Sie einen Teil davon verschlüsseln, im laufenden Betrieb entschlüsseln und an eval () weitergeben. Aber egal was Sie tun, jemand kann es brechen.

Nichts davon hindert einen entschlossenen Angreifer daran, den Bytecode zu zerlegen oder mit Hilfe, Verzeichnis usw. durch Ihre API zu graben.

5
Brian C. Lane

Ich habe mir den Softwareschutz im Allgemeinen für meine eigenen Projekte angesehen und die allgemeine Philosophie ist, dass ein vollständiger Schutz nicht möglich ist. Sie können nur hoffen, dass Sie den Schutz erhöhen, der Ihren Kunden mehr kosten würde als den Kauf einer anderen Lizenz.

Nachdem dies gesagt wurde, habe ich nur Google auf Python-Obsfucation überprüft und nicht viel aufgetaucht. Bei einer .NET-Lösung wäre Obsfucation ein erster Ansatz für Ihr Problem auf einer Windows-Plattform. Ich bin jedoch nicht sicher, ob jemand Linux-Lösungen hat, die mit Mono funktionieren. 

Die nächste Sache wäre, Ihren Code in einer kompilierten Sprache zu schreiben, oder wenn Sie wirklich den ganzen Weg gehen wollen, dann in Assembler. Eine gestrippte ausführbare Datei wäre viel schwieriger zu dekompilieren als eine interpretierte Sprache.

Auf Kompromisse kommt es an. An einem Ende haben Sie eine einfache Softwareentwicklung in Python, bei der es auch sehr schwierig ist, Geheimnisse zu verbergen. Auf der anderen Seite haben Sie in Assembler geschriebene Software, die viel schwieriger zu schreiben ist, die Geheimnisse jedoch viel leichter zu verbergen ist.

Ihr Chef muss irgendwo entlang des Kontinuums einen Punkt auswählen, der seine Anforderungen erfüllt. Und dann muss er Ihnen die Werkzeuge und Zeit geben, damit Sie bauen können, was er will. Meine Wette ist jedoch, dass er echte Entwicklungskosten und potenzielle Geldverluste ablehnen wird.

4
Peter M

Es ist möglich, den py2exe-Bytecode in einer verschlüsselten Ressource für einen C-Launcher zu speichern, der ihn lädt und im Speicher ausführt. Einige Ideen hier und hier .

Einige haben auch an ein selbst modifizierendes Programm gedacht, um Reverse Engineering teuer zu machen.

Sie können auch tutorials zum Verhindern von Debuggern finden, den Disassembler zum Scheitern bringen, false Debugger-Haltepunkte setzen und Ihren Code mit Prüfsummen schützen. Suchen Sie nach "verschlüsselter Code" im Speicher ausführen] nach weiteren Links.

Aber wie andere schon sagten, wenn Ihr Code es wert ist, werden Reverse Engineers am Ende Erfolg haben.

3
lalebarde

Um es kurz zu machen:

  1. Verschlüsseln Sie Ihren Quellcode
  2. Schreiben Sie Ihren eigenen Python-Modul-Loader, um Ihren Code beim Import zu entschlüsseln
  3. Implementieren Sie den Modullader in C/C++
  4. Sie können dem Modullader weitere Funktionen hinzufügen, z. B. Anti-Debugger, Lizenzsteuerung, Hardware-Fingerprint-Bindung usw.

Weitere Informationen finden Sie in dieser Antwort .

Wenn Sie sich für das Thema interessieren, hilft Ihnen dieses Projekt - pyprotect .

2
lambda11

die Verwendung von cxfreeze (py2exe für Linux) erledigt den Job.

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

es ist in Ubuntu-Repositories verfügbar

1
Ali AlNoaimi

Gehen Sie auf dieselbe Weise vor, um die Binärdatei von c/c ++ zu schützen, d. H. Jeden Funktionskörper in der ausführbaren Datei oder in der Bibliotheksbinärdatei zu verschleiern, am Anfang jedes Funktionseintrags eine Anweisung "jump" einzufügen und zu einer speziellen Funktion zu springen, um verschleierten Code wiederherzustellen. Bytecode ist also binärer Code eines Python-Skripts 

  • Kompilieren Sie zuerst das Python-Skript zum Code-Objekt
  • Dann iterieren Sie jedes Codeobjekt und verschleiern Sie co_code jedes Codeobjekts wie folgt
 0 JUMP_ABSOLUTE n = 3 + len (Bytecode) 

 3
 ...
 ... Hier ist es Bytecode verschleiert 
 ...

 n LOAD_GLOBAL? (__pyarmor__) 
 n + 3 CALL_FUNCTION 0 
 n + 6 POP_TOP 
 n + 7 JUMP_ABSOLUTE 0 
  • Speichern Sie ein verschleiertes Codeobjekt als .pyc- oder .pyo-Datei

Diese verschleierten Dateien (.pyc oder .pyo) können vom normalen Python-Interpreter verwendet werden, wenn das Codeobjekt zum ersten Mal aufgerufen wird

  • Die erste Operation ist JUMP_ABSOLUTE, sie springt zum Offset n

  • Beim Offset n lautet die Anweisung, eine PyCFunction aufzurufen. Diese Funktion stellt den verschleierten Bytecode zwischen Offset 3 und n wieder her und setzt den ursprünglichen Bytecode auf Offset 0. Der verschleierte Code kann mit dem folgenden Code abgerufen werden

     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) 
    
  • Nachdem diese Funktion zurückgekehrt ist, springt die letzte Anweisung zu Offset 0. Der wirklich Bytecode wird jetzt ausgeführt.

Es gibt ein Werkzeug Pyarmor , um Python-Skripte auf diese Weise zu verschleiern.

0
Jondy Zhao

Wenn wir uns auf Softwarelizenzen konzentrieren, würde ich empfehlen, einen Blick auf eine andere Stack Overflow-Antwort zu werfen, die ich here geschrieben habe, um einige Anregungen zu erhalten, wie ein System zur Überprüfung von Lizenzschlüsseln aufgebaut werden kann.

Es gibt eine Open-Source-Bibliothek in GitHub , die Ihnen beim Lizenzbestätigungsbit helfen kann.

Sie können es mit pip install licensing installieren und dann den folgenden Code hinzufügen:

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")

Weitere Informationen zur Konfiguration des öffentlichen RSA-Schlüssels usw. finden Sie hier .

0
Artem