web-dev-qa-db-ja.com

Pythonコードを保護する方法

私は、雇用主の顧客に配布される予定のソフトウェアをPythonで開発しています。私の雇用主は時間制限付きライセンスファイルでソフトウェアの使用を制限したいと思っています。

.pyファイル、あるいは.pycファイルを配布するのであれば、ライセンスファイルをチェックするコードを(逆コンパイルして)削除するのは簡単でしょう。

もう1つの側面は、コードが盗まれる可能性があること、または少なくとも「新しいアイデア」を恐れて、私の雇用主がコードをお客様に読んでほしくないことです。

この問題を処理するための良い方法はありますか?好ましくは既製の溶液を用いる。

ソフトウェアはLinuxシステム上で動作するでしょう(だからpy2exeがうまくいくとは思わない)。

585
Jordfräs

Pythonはバイトコードでコンパイルされたインタプリタ言語であるため、ロックするのが非常に困難です。たとえ py2exe のようなexe-packagerを使ったとしても、実行ファイルのレイアウトはよく知られており、Pythonのバイトコードはよく知られています。

通常このような場合、あなたはトレードオフをしなければなりません。コードを保護することが本当に重要ですか。そこに本当の秘密(銀行振替の対称暗号化のための鍵など)がありますか、それともあなたはただ妄想的ですか?最善の製品を最速で開発できるような言語を選択し、あなたの新しいアイデアがどれほど価値があるかについて現実的になりましょう。

本当に安全にライセンスチェックを実施する必要があると決心した場合、リバースエンジニアにとってライセンスチェックコードが非常に難しい(しかし不可能ではない!)ことができるように小さなC拡張としてそれを書き、そしてPythonであなたのコードの大部分を残す。

348
Ned Batchelder

「この問題に対処するための良い方法はありますか?」いいえ。リバースエンジニアリングに対して保護できるものはありません。 DVDマシンのファームウェアでさえリバースエンジニアリングされ、 AACS暗号化キー が公開されています。そしてDMCAがそれを犯罪としているにもかかわらずです。

技術的な方法では顧客がコードを読むことを妨げることはできないので、通常の市販の方法を適用する必要があります。

  1. ライセンス契約します。規約と条件。人々がコードを読むことができるときでも、これはまだうまくいきます。一部のPythonベースのコンポーネントでは、それらのコンポーネントを使用してソフトウェアを販売する前に料金を支払う必要がある場合があります。また、オープンソースライセンスの中には、そのコンポーネントのソースや由来を隠すことを禁止するものがあります。

  2. 大きな価値を提供します。あなたのものがそれほど上手くなければ - 拒絶するのが難しい価格で - 時間とお金を浪費する動機は何もリバースエンジニアリングです。リバースエンジニアリングは高価です。あなたの製品を少し安くしてください。

  3. リバースエンジニアリングを悪い考えにするアップグレードや機能強化を提供します。次のリリースでリバースエンジニアリングが中断されても、意味がありません。これは極端なことにも当てはまりますが、リバースエンジニアリングよりも次のリリースの価値を高める新しい機能を提供する必要があります。

  4. 非常に魅力的な速度でカスタマイズを提供してください。

  5. 有効期限が切れているライセンスキーを使用してください。これは残酷であり、あなたに悪い評判を与えるでしょうが、それは確かにあなたのソフトウェアが動かなくなる原因になります。

  6. Webサービスとして提供してください。 SaaSは顧客へのダウンロードを含みません。

439
S.Lott

Pythonはあなたが必要とするツールではありません

あなたは正しいことをするために正しいツールを使わなければなりません、そしてPythonは難読化するように設計されていませんでした。それは逆です。それは言語の哲学であるため、Pythonですべてが公開されているか、公開または変更が容易です。

見えないものが欲しい場合は、別のツールを探してください。これは悪いことではありません、用途に応じていくつかの異なるツールが存在することが重要です。

難読化は本当に難しいです

コンパイルされたプログラムでさえリバースエンジニアリングすることができるので、どんなコードでも完全に保護できるとは思わないでください。難読化されたPHPを分析したり、フラッシュ暗号化キーを破ったりすることができます。新しいバージョンのWindowsは毎回クラックされています。

法的要件を満たすことは良い方法です。

誰かがあなたのコードを悪用するのを防ぐことはできませんが、誰かがそれを悪用したかどうかは簡単にわかります。したがって、それは単なる偶然の法的問題です。

コード保護が過大評価されています

今日では、ビジネスモデルは製品の代わりにサービスを販売する傾向があります。あなたはサービスをコピーしたり、海賊版にしたり、盗むことはできません。たぶんそれは流れと行くことを考慮する時間です...

307
e-satis

Pythonをコンパイルしてバイナリを配布する!

賢明なアイデア:

CythonNuitkaShed Skin などを使用して、PythonをCコードにコンパイルしてから、代わりにpythonバイナリライブラリ(pyd)としてアプリを使ってください。

そのようにして、Python(バイト)コードは残されず、誰か(すなわちあなたの雇用者)が通常のCodeから期待できる合理的な量の不明瞭化をしたと私は思います。 (.NETまたはJavaはこの場合より安全性が低い。なぜなら、そのバイトコードは難読化されておらず、比較的簡単に合理的なソースに逆コンパイルできるからである。)

CythonはCPythonとの互換性がますます高まっているので、うまくいくと思います。 (私たちの製品ではこれを実際に考えています。すでにいくつかのサードパーティのライブラリをpyd/dllとして構築しているので、バイナリとして私たち自身のpythonコードを出荷することは私たちにとってそれほど大きなステップではありません。)

そのやり方についてのチュートリアルは このブログ投稿 を参照してください。 (thx @hithwen)

おかしな考え:

あなたはたぶんCythonにC-ファイルをモジュールごとに別々に保存させて、そしてそれらをすべて連結して重いインライン展開で構築することができるでしょう。そのようにして、あなたのPythonモジュールはかなりモノリシックであり、一般的なツールでチップ化するのが難しいです。

クレイジーを超えて:

Pythonランタイムとすべてのライブラリ(dll)に静的にリンクする(そして最適化する)ことができれば、単一の実行ファイルを構築できるかもしれません。そういうわけで、pythonへの/からの呼び出しやあなたが使うどんなフレームワークライブラリでも傍受するのは難しいでしょう。 LGPLコードを使っているのであれば、これはできません。

133
Macke

私はあなたがあなたの顧客にpythonの力を使わせたいがソースコードを公開したくないことを理解しています。

これが私の提案です。

(a)コードの重要な部分をCまたはC++ライブラリとして作成し、 SIP または swigを使用します。 C/C++ APIをPython名前空間に公開します。

(b)Pythonの代わりに cython を使う

(c)(a)と(b)の両方において、Pythonインターフェースを持つライセンスバイナリーとしてライブラリーを配布することが可能なはずです。

57
bhadra

あなたの雇用主は、他の人があなたのコードから得たアイデアを「盗む」ことができることを知っていますか?つまり、彼らがあなたの作品を読むことができれば、あなたも彼らの作品を読むことができます。多分あなたが状況からどのように利益を得ることができるかを見ることはあなたがどれだけ失うことができるかを恐れているよりあなたの投資のより良い収益をもたらすでしょう。

[編集]ニックのコメントへの回答:

何も得られず、何も失われませんでした。顧客は自分が望むものを持っています(そして自分で変更をしてから支払いました)。彼はその変更を公開していないので、それは他の誰にとっても起こらなかったかのようです。

今顧客がソフトウェアを販売するならば、彼らは著作権表示を変更しなければなりません(それは違法です、あなたは訴えることができて勝つでしょう - >単純な場合)。

彼らが著作権表示を変更しないのであれば、第2レベルの顧客はソフトウェアがあなたのオリジナルのものであることに気付き、何が起こっているのか疑問に思うでしょう。たぶん彼らはあなたに連絡するでしょう、そしてあなたはあなたの作品の転売について学ぶでしょう。

この場合も、2つのケースがあります。元の顧客が数部しか販売していなかった。それは彼らがとにかく多くのお金をもうけなかったことを意味します、それでなぜ厄介です。または、彼らは大量に売れました。それはあなたが彼らが何をしているかについて学びそしてそれについて何かをするより良い機会を意味します。

しかし結局、ほとんどの企業は法律を遵守しようとします(評判が台無しになると、ビジネスを行うことははるかに困難になります)。だから彼らはあなたの仕事を盗むのではなくそれを改善するためにあなたと協力するでしょう。そのため、あなたが(あなたが単純な再販からあなたを保護するライセンスで)ソースを含めるならば、それは変更が次のバージョンにあることを確実にするので彼らが単純に彼らが行った変更をプッシュバックするでしょう。それはお互いにメリットがあります。あなたは変更を受け、公式リリースにそれを含めたくない場合でも、変更を自分で行うことができます。

33
Aaron Digulla

あなたは pyminifier を見たことがありますか? Pythonコードを縮小、難読化、および圧縮します。サンプルコードは、カジュアルなリバースエンジニアリングにはかなり厄介です。

$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲמּ=ImportError
ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ燱=print
ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????=False
ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ澨=object
try:
 import demiurgic
except ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲמּ:
 ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ燱("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
 import mystificate
except ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲמּ:
 ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ燱("Warning: Dark voodoo may be unreliable.")
ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲﺬ=ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????
class ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????(ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ澨):
 def __init__(self,*args,**kwargs):
  pass
 def ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ클(self,dactyl):
  ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ퐐=demiurgic.palpitation(dactyl)
  ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????=mystificate.dark_voodoo(ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ퐐)
  return ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????
 def ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????(self,whatever):
  ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ燱(whatever)
if __name__=="__main__":
 ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ燱("Forming...")
 ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲﺃ=ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????("epicaricacy","perseverate")
 ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲﺃ.ﺭ异????????ﭞﰣﺁں????????????뻛????????嬭ﱌ????????????Ꝫﴹ뙫????퉊ﳦﲣפּܟﺶ????ﶨࠔ????????????????????????????ﶻ????????????????????䉊ﰸﭳᣲ????("Codswallop")
# Created by pyminifier (https://github.com/liftoff/pyminifier)
30
Lmwangi

難読化に頼らないでください。あなたが正しく結論したように、それは非常に限られた保護を提供します。アップデート:Dropboxで難読化されたpythonコードをリバースエンジニアリングした paper へのリンクです。アプローチ - オペコードの再マッピングは良い障壁ですが、明らかにそれは打ち負かすことができます。

代わりに、多くのポスターが述べているようにそれを作る:

  • リバースエンジニアリングの時間がない
  • 可能であれば、彼らに契約書に署名させ、免許証監査を行わせる。

あるいは、キックアスPython IDE WingIDEのように、コードを渡します。そうです、コードを渡して、アップグレードとサポートのために人々を呼び戻します。

25
Konrads

.pycファイルを出荷することには問題があります - それらはそれらが作成されたpythonバージョン以外の他のどのpythonバージョンとも互換性がありません。これは非常に制限的な要素です。

18
Erik Forsberg

状況によっては、ソフトウェアの(すべて、または少なくとも重要な部分を)組織がホストするWebサービスに移動することが可能な場合があります。

このようにして、ライセンスチェックを自分のサーバールームの安全の中で実行できます。

16
Oddthinking

完全な解決策はありませんが、次のことが可能です。

  1. 重要なスタートアップコードをネイティブライブラリに移動します。
  2. ネイティブライブラリでライセンスチェックを強制します。

ネイティブコードへの呼び出しが削除されたとしても、プログラムは起動しません。削除されていない場合は、ライセンスが強制されます。

これはクロスプラットフォームや純粋なPythonのソリューションではありませんが、うまくいきます。

14
I K

あなたのPythonコードを保護するもう一つの方法があると思います。難読化手法の一部です。私はMount and Bladeのようなゲームや自分のpythonインタプリタ(私がオープンソースだと思うオリジナルのインタプリタ)を変更して再コンパイルしたものがあったと思っています。コード.

そのため、Pythonのソースは変更されていませんが、*。pycファイルのファイル拡張子は異なり、オペコードはパブリックpython.exeインタプリタと一致しません。ゲームのデータファイルをチェックした場合、すべてのデータはPythonのソース形式でした。

このようにして、未熟なハッカーをいじるためにあらゆる種類の厄介なトリックを行うことができます。経験の浅いハッカーの群れを止めるのは簡単です。それはあなたがたぶん勝つことはないでしょうプロのハッカーです。しかし、ほとんどの企業はプロハッカーをスタッフに留めていないと思います(おそらくハッキングされるため)。しかし未熟なハッカーはいたるところにいます(好奇心の強いITスタッフとして読んでください)。

たとえば、修正されたインタプリタで、ソース内の特定のコメントやドキュメント文字列をチェックできるようにすることができます。そのようなコード行には、特別なOPコードがあります。例えば:

OP 234は、ソース行 "#Copyright私がこれを書いた"、またはその行を "if False:" if "#" Copyrightが欠落している場合と同等の命令コードにコンパイルするためのものです。あいまいな理由のように思われるものに対して、基本的にコードブロック全体を無効にする。

修正されたインタプリタを再コンパイルすることが可能なユースケースは、アプリを書いていない、アプリは大きいが、あなたが金融アプリの専用サーバー管理者である場合のように、それを保護するために支払われます。

ソースコードやオペコードを眼球用に開いたままにしておくが、ネットワークトラフィックにはSSLを使用するのは少し矛盾していると思います。 SSLも100%安全ではありません。しかし、それはほとんど目がそれを読むのを止めるのに慣れています。ちょっとした予防策が賢明です。

また、十分な人々がPythonのソースとオペコードが見え過ぎると考えるならば、誰かがそれのために少なくとも簡単な保護ツールを最終的に開発するだろう。そのため、「Pythonアプリを保護する方法」を尋ねる人が増えると、その開発が促進されるだけです。

10
DevPlayer

コードを保護するための信頼できる唯一の方法は、あなたが管理するサーバー上でそれを実行し、そのサーバーとインターフェースするクライアントをあなたのクライアントに提供することです。

10
Alex Coventry

Cython を使用してください。それはあなたのモジュールを高性能Cファイルにコンパイルするでしょう、そしてそれはそれからネイティブのバイナリライブラリにコンパイルすることができます。 .pycバイトコードと比較すると、これは基本的に不可逆的です。

Pythonプロジェクト用にCythonを設定する方法についての詳細な記事を書いています。

CythonでPythonソースを保護する

9
Vitaly Gordon

クライアントが誰であるかに応じて、賢明な使用許諾契約と組み合わされた単純な保護メカニズムはfarより複雑なライセンス/暗号化/難読化システムより効果的になります。

最善の解決策は、サービスをホスティングする、サポートを提供するなど、サービスとしてコードを販売することです。ただし、これは必ずしも実用的ではありません。

コードを.pycファイルとして出荷することはあなたの保護が数#sによって駄目にされるのを防ぎますが、それは(そのような技術があるかのように)ほとんど効果的な反海賊行為防止ではありません。会社とのまともなライセンス契約.

コードをできるだけ使いやすくすることに集中してください。幸せな顧客を持つことは、理論上の著作権侵害を防ぐよりもはるかに多くのお金を会社にもたらすことになります。

9
dbr

コードを盗みにくくするためのもう1つの試みは、jythonを使用してから Java難読化プログラム を使用することです。

JythoncがpythonコードをJavaに変換してからJavaがバイトコードにコンパイルされるので、これはかなりうまくいくはずです。そのため、実際のコードを回復することは言うまでもなく、逆コンパイル後に何が行われているのかを理解するのは非常に難しくなります。

Jythonの唯一の問題は、cで書かれたpythonモジュールを使用できないことです。

8
Piotr Czapla

あなたはgetdropbox.comの人々がLinuxを含む彼らのクライアントソフトウェアのためにそれをどのようにするかを見るべきです。クラックするのはかなりトリッキーで、保護メカニズムを乗り越えるためにはかなり創造的な分解が必要です。

6
fwzgekg

どんな答えにも pyconcrete が表示されないことに驚きました。たぶんそれは質問よりも新しいのでしょうか?

それはまさにあなたが必要としているものかもしれません。

コードを難読化する代わりに、暗号化してロード時に復号化します。

pypiページ から:

Pythonスクリプトのワークフローを保護する

  • your_script.py import pyconcrete
  • pyconcreteはインポートモジュールをフックします
  • あなたのスクリプトがMODULEをインポートするとき、pyconcrete import hookは最初にMODULE.pyeを見つけ、次にMODULE.pyeを介して_pyconcrete.pydを復号化し、(.pycコンテンツとして)復号化されたデータを実行しようとします。
  • 秘密鍵レコードを_pyconcrete.pyd(DLLまたはSOなど)で暗号化および復号化する秘密鍵はバイナリコードでは非表示になり、HEXビューでは直接表示できません
6
mvallebr

重要なファイルをハッシュ化して署名し、それを公開鍵方式でチェックすることによって、標準の暗号化方式であなたのコードに署名することについてはどうですか?

このようにして、各顧客の公開鍵を使用してライセンスファイルを発行できます。

さらに、あなたは このような Pythonの難読化ツールを使うことができます(単にそれをgoogled)。

6
Peter Parker

時間制限付きライセンスを持ち、ローカルにインストールされたプログラムでそれをチェックするというアイデアは機能しません。完全な難読化でも、ライセンスチェックは削除できます。ただし、リモートシステムでライセンスを確認し、クローズドリモートシステムでプログラムの大部分を実行すると、IPを保護することができます。

競合他社がソースコードを自分のものとして使用したり、同じコードのインスピレーションを受けたバージョンを書いたりすることを防ぐための1つの方法は、プログラムロジックに署名を追加することです(コードがあなたから盗まれたことを証明できる秘密)。 pythonのソースコードなので、読んで利用するのは難しいです。

難読化が十分に行われていれば、コードを実行可能ファイルにコンパイルする(そしてバイナリを削除する)ことで、基本的に同じ保護が追加されます。難読化された複雑なコードがどのように機能するかを理解することは、実際に独自の実装を記述するよりもさらに困難な場合があります。

これはあなたのプログラムのハッキング防止には役立ちません。難読化コードを使用しても、ライセンスの内容がクラックされ、プログラムが少し異なる動作をするように変更される可能性があります(コードをバイナリにコンパイルしてもネイティブプログラムの保護には役立ちません)。

シンボルの難読化に加えて、コードをリファクタリングすることをお勧めします。コールグラフは、実際にはそれらの異なる場所が結局同じことをしても、多くの異なる場所を指します。

難読化されたコード内の論理シグネチャ(たとえば、プログラムロジックで使用されるがシグネチャとしても使用される値のテーブルを作成することができます)。これは、コードがあなたから発生したものであると判断するために使用できます。誰かがあなたの難読化されたコードモジュールを彼ら自身の製品の一部として使うことを決心したならば(それを違ったように見せかけるためにそれを再難読化した後でさえ)あなたは示すことができます。

5
Mikael Lepistö

Pythonでできることは、物事を隠すことです。

  • すべての文書文字列を削除する
  • .pycコンパイル済みファイルのみを配布します。
  • 凍結する
  • Help(config)がすべてを表示しないように、クラス/モジュール内の定数を隠してください。

その一部を暗号化し、その場で復号化してeval()に渡すことで、いくつかの不明瞭さを追加できるかもしれません。しかし、あなたが何をしても誰かがそれを破ることができます。

これのどれもバイトコードを分解することからの決心した攻撃者または助けを借りてあなたのapiを掘り下げるのを妨げるでしょう、dirなど。

5
Brian C. Lane

私は自分のプロジェクトのためにソフトウェア保護を一般的に見てきました、そして一般的な哲学は完全な保護が不可能であるということです。あなたが達成したいと思うことができる唯一のものはあなたの顧客が他のライセンスを購入するよりも迂回するのにより多くの費用がかかるレベルに保護を加えることです。

それによると、私は単にpythonの難読化をグーグルでチェックしていて、何も起こさないと言った。 .NETソリューションでは、Windowsプラットフォームでは難読化があなたの問題への最初のアプローチになりますが、Monoで動くLinux上のソリューションが誰かにあるかどうかはわかりません。

次のことはあなたのコードをコンパイルされた言語で書くことでしょう、あるいはあなたが本当にずっと行きたいのなら、それからアセンブラで。削除された実行ファイルは、インタプリタ言語よりも逆コンパイルするのがはるかに難しいでしょう。

それはすべてトレードオフに帰着します。一方で、あなたはpythonでソフトウェア開発の容易さを持っています、それはそれが秘密を隠すことも非常に難しいです。反対に、あなたはアセンブラで書かれたソフトウェアを持っていますが、それは書くのはもっと難しいですが、秘密を隠すのはずっと簡単です。

あなたの上司は彼の要求を支持するその連続体に沿ったどこかの点を選ばなければなりません。それから彼はあなたがツールと時間をあなたに与えなければならないのであなたは彼が望むものを構築することができます。しかし私の賭けは、彼が実際の開発費と潜在的な金銭的損失に反対するだろうということです。

4
Peter M

Py2exeバイトコードをCランチャー用の暗号化されたリソースに格納し、それをメモリにロードして実行することは可能です。 herehere という考えもあります。

リバースエンジニアリングを高価にするために、 自己修正プログラム と考える人もいます。

デバッガ防止のためのチュートリアル 、逆アセンブラの失敗、 falseデバッガブレークポイント の設定、コード保護チェックサム付き。他のリンクについては["暗号化されたコード" execute "in memory"]を検索してください。

しかし他の人がすでに言ったように、あなたのコードがそれに見合う価値があるならば、リバースエンジニアは結局成功するでしょう。

3
lalebarde

短い話:

  1. ソースコードを暗号化する
  2. インポート時にあなたのコードを復号化するためにあなた自身のpythonモジュールローダーを書く
  3. C/C++でモジュールローダーを実装する
  4. モジュールローダーには、アンチデバッガ、ライセンス管理、ハードウェアフィンガープリントバインディングなどの機能を追加できます。

詳細については、この 答え をご覧ください。

あなたがそのトピックに興味があるなら、このプロジェクトはあなたを助けるでしょう - pyprotect

2
lambda11

私たちがソフトウェアライセンスに焦点を当てているなら、私が here を書いた別の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公開鍵などがどのように設定されているかについてもっと読むことができます here

2
Artem

cxfreeze(linuxの場合はpy2exe)を使用するとうまくいきます。

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

それはUbuntuリポジトリで利用可能です

1
Ali AlNoaimi

同じ方法でc/c ++のバイナリファイルを保護します。つまり、実行可能ファイルまたはライブラリバイナリファイルの各関数本体を難読化し、各関数エントリの先頭に「jump」命令を挿入し、特殊関数にジャンプして難読化コードを復元します。バイトコードはPythonスクリプトのバイナリコードです。

  • まずPythonスクリプトをコードオブジェクトにコンパイルします。
  • 次に、各コードオブジェクトを繰り返し、各コードオブジェクトのco_codeを次のように難読化します。
 0 JUMP_ABSOLUTE n = 3 + len(バイトコード)
 
 3 
 ... 
 ...これは難読化されたバイトコード
です。 ] ... 
 
 n LOAD_GLOBAL? (__pyarmor__)
 n + 3 CALL_FUNCTION 0 
 n + 6 POP_TOP 
 n + 7 JUMP_ABSOLUTE 0 
  • 難読化されたコードオブジェクトを.pycまたは.pyoファイルとして保存する

それらの難読化されたファイル(.pycまたは.pyo)は、それらのコードオブジェクトが最初に呼び出されるときに、通常のpythonインタプリタによって使用されることができます。

  • 最初の操作はJUMP_ABSOLUTEで、オフセットnにジャンプします

  • オフセットnでは、命令はPyCFunctionを呼び出すことです。この関数は、オフセット3とnの間の難読化されたバイトコードを復元し、オリジナルのバイトコードをオフセット0に置きます。難読化されたコードは、次のコードで取得できます。

     char * obfucated_bytecode; 
     Py_ssize_t len; 
     PyFrameObject * frame = PyEval_GetFrame(); 
     PyCodeObject * f_code = frame-> f_code; 
     PyObject * co_code = f_code-> co_code; 
     PyBytes_AsStringAndSize(co_code、&obfucated_bytecode、&len)
    
  • この関数が戻った後、最後の命令はオフセット0にジャンプすることです。実際のバイトコードが実行されます。

この方法でpythonスクリプトを難読化するためのツール Pyarmor があります。

0
Jondy Zhao