Pythonコードを保護するにはどうすればよいですか?


632

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

.pyファイルまたは.pycファイルを配布する場合、ライセンスファイルをチェックするコードを(逆コンパイルして)削除するのは簡単です。

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

この問題を処理する良い方法はありますか?既製のソリューションを使用することをお勧めします。

ソフトウェアはLinuxシステムで実行されます(そのため、py2exeでうまくいくとは思いません)。


25
py2exeは.pycバイトコードファイルを.zipアーカイブに格納するだけなので、これは間違いなく解決策ではありません。それはウンターLinuxを走らせるために、適切なstarupスクリプトと組み合わせたときそれでも、それは便利です
BERを計算


これは、あなたの質問に最も包括的な答えである:wiki.python.org/moin/Asking%20for%20Help/...
マイク

回答:


378

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

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

ライセンスチェックを安全に実施する必要があると判断した場合は、ライセンスチェックコードをリバースエンジニアリングするのが非常に難しい(ただし不可能ではない)ように、小さなC拡張機能として記述し、コードの大部分をPythonに残す。


157
ライセンスチェックコードがCで記述されているためリバースエンジニアリングが難しい場合でも、ライセンスチェックコードの呼び出しを削除するのは比較的簡単ではないでしょうか。
ブレアコンラッド

59
はい、ライセンスチェックが実行される場所によって異なります。内線番号への呼び出しが多い場合、根絶するのが難しい場合があります。または、アプリケーションの他の重要な部分をライセンスチェックに移動して、拡張機能への呼び出しを削除すると、アプリが機能しなくなる可能性があります。
Ned Batchelder

103
実際、この作業はすべて変更を防ぐことではなく、困難を増して価値がなくなるようにすることです。十分な利点があれば、何でもリバースエンジニアリングおよび変更できます。
Ned Batchelder

11
@Blair Conrad:ライセンスチェックコードが機能を隠す場合も同様です。例えばmylicensedfunction(licenseblob liblob, int foo, int bar, std::string bash)
ブライアン

8
私は実際にCライブラリ内に埋め込まれたPythonとして出荷されている商用Pythonコードを見てきました。コードの一部をCに変換する代わりに、Pythonコード全体を保護Cレイヤー内に隠します。次に、Pythonでインポート可能なモジュールが必要な場合は、Cの上に薄いPython拡張機能を記述します。オープンソースの方がはるかに簡単です。
Mike McKerns、2014

454

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

技術的な方法ではコードの読み取りを妨げることはないため、通常の商用方法を適用する必要があります。

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

  2. 重要な価値を提供します。ものごとが非常に優れている場合-拒否するのが難しい価格で-時間とお金を無駄にして何かをリバースエンジニアリングするインセンティブはありません。リバースエンジニアリングは高価です。製品を少し安くします。

  3. リバースエンジニアリングを悪いアイデアにするアップグレードと拡張機能を提供します。次のリリースでリバースエンジニアリングが中断しても、意味がありません。これはばかげた極端に持ち越される可能性がありますが、次のリリースをリバースエンジニアリングよりも価値のあるものにする新しい機能を提供する必要があります。

  4. 魅力的な料金でカスタマイズを提供し、拡張機能の構築とサポートを有料で提供します。

  5. 期限切れのライセンスキーを使用します。これは残酷で、評判は悪くなりますが、ソフトウェアが動作しなくなることは確かです。

  6. Webサービスとして提供します。SaaSには顧客へのダウンロードは含まれません。


7
ポイント2はさらに重要です。それがリバースエンジニアリングよりも安く購入でき、さらに毎年更新される場合、誰も試しませんし、そうしたとしても、ソフトウェアのプロバイダーの代わりにハッカーに支払う人は誰もいません。
m3nda

それは本当だ。リバースエンジニアリングは実行可能ですが、ほとんどの状況でコストがかかります。@ S.Lott、私は質問に基づいてポイント6がより重要であると信じています。ソースコードを本当に保護する必要がある場合は、エンドユーザーから離れている必要があります。
Delali

7
質問:「私たちの睡眠中に侵入者に殺されることから私の家族と私自身を守る良い方法はありますか?」インターネット:「いいえ。誰にでも到達することができ、住居が100%侵入できないことはありません。人間の家族はこの仕事に適したツールではありません。」
単純なアルゴリズム

ポイント5は、リバースエンジニアリングおよびクラックが可能であるという同じ仮定に適用できませんでした。
jjmontes

313

Pythonは必要なツールではありません

適切なことを行うには適切なツールを使用する必要があり、Pythonは難読化するようには設計されていません。それは逆です。すべてがオープンであるか、Pythonで明らかにしたり修正したりできるのは、それが言語の哲学だからです。

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

難読化は本当に難しい

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

法的要件があることは良い方法です

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

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

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


16
Pythonは必要なツールではありません。マルボルジです。:)
johndodo

8
良い答えですが、「偶然の法的問題」ですか?本当に?あなたが持っているどこに住んでいます任意のカジュアルされている法的問題を?
Mark E. Haase 2013

1
私は、頻度があれば(高価な難読化されたコードがハッキングされる頻度です)、Pythonと難読化されたコードの実用性について言えるでしょう。
sergzach 2015

あなたのコードに興味深い機能がある場合、それを誤用した人がそれを再配布します@Macke
Delali

1
どのようにして「誰かが発見したら簡単に発見」できますか?
Make42

145

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

賢明なアイデア:

CythonNuitkaShed Skinなどを使用し pythonをCコードにコンパイルし、代わりにアプリをpythonバイナリライブラリ(pyd)として配布します。

そうすれば、Python(バイト)コードが残されず、だれでも(つまり、雇用主)が通常のコードから期待できる合理的な量の不明瞭化を実行したと思います。(.NETまたはJavaは、バイトコードが難読化されておらず、比較的簡単に適切なソースに逆コンパイルできるため、この場合よりも安全性が低くなります。)

CythonはCPythonとの互換性をますます持っているので、うまくいくと思います。(私は実際に私たちの製品でこれを検討しています。.サードパーティのライブラリをpyd / dllとして既に構築しているため、バイナリとして独自のpythonコードを出荷することは、私たちにとって過度に大きなステップではありません。)

その方法に関するチュートリアルについては、このブログ投稿(私ではない)を参照してください。(thx @hithwen)

クレイジーなアイデア:

おそらく、Cythonにモジュールごとに個別にCファイルを格納させ、それらをすべて連結して、重いインラインでビルドすることができます。そうすれば、Pythonモジュールはかなりモノリシックになり、一般的なツールでチップするのが難しくなります。

クレイジーを超えて:

Pythonランタイムとすべてのライブラリ(dll)に静的にリンク(および最適化)できる場合は、単一の実行可能ファイルを構築できる可能性があります。そうすれば、Pythonや使用しているフレームワークライブラリとの間の呼び出しをインターセプトすることは確かに困難になります。LGPLコードを使用している場合は、これを行うことはできません。


cythonでのコンパイルはpython 3.4 Djangoアプリで機能しますか、それとも多大な労力なしで機能させることができますか?
Daniel

@ダニエル:わかりません。Djangoを試していない。それについて新しい質問を投稿してください。
Macke、2015年


4
@mlvljr FWIW、バイナリーへのIMHOコンパイルは、すべての秘密を販売することとNSAクラスのリバースエンジニアリングから保護することとのトレードオフです。特に大きなPythonコードベースと偏執狂の理由がある場合。;)
Macke

2
hithwenのPOSTは現在無効です。
qg_java_17137 2018年

58

お客様にPythonの機能を使用してほしいが、ソースコードを公開したくないとのことですが、

これが私の提案です:

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

(b)Pythonの代わりにcythonを使用する

(c)(a)と(b)の両方で、Pythonインターフェイスを使用して、ライセンスされたバイナリとしてライブラリを配布できるはずです。


1
同じような他の可能性:Shed Skin code.google.com/p/shedskinおよびNuitka kayhayen24x7.homelinux.org/blog/nuitka-a-python-compiler
TryPyPy

TyPyPyによって提案されたShed Skinを調べたところ、本当に良いもののようです!
フィリペ、2013年

34

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

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

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

顧客がソフトウェアを販売する場合、著作権表示を変更する必要があります(これは違法なので、訴訟を起こして勝つことができます->単純なケース)。

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

ここでも2つのケースがあります。最初の顧客が数部しか販売していません。それはとにかく彼らは多くのお金を稼いでいなかったということです、それでなぜわざわざ。または、ボリュームで販売しました。それはあなたが彼らが何をするかについて学び、それについて何かをするより良いチャンスを意味します。

しかし結局のところ、ほとんどの企業は法律を遵守しようとします(評判が台無しになると、ビジネスを行うのがはるかに難しくなります)。したがって、彼らはあなたの仕事を盗むのではなく、あなたと協力してそれを改善します。したがって、ソースを含めると(単純な再販から保護するライセンスが含まれている場合)、変更が次のバージョンにあることを確認し、維持する必要がないため、変更がプッシュバックされる可能性があります。 。双方にメリットがあります。変更を取得し、公式リリースに含めたくない場合でも、本当に必要な場合は変更を自分で行うことができます。


ソフトウェアを顧客にリリースし、顧客が再リリースせずに内部で変更した場合はどうなりますか?
Nick T

@ニック:状況をまったく変えません。私の編集を参照してください。
Aaron Digulla

6
アイデアを盗むための+1。他の人があなたのソリューションを改善し、それに応じてあなた自身の製品を改善するのを見ることができるのに、なぜあなたの顧客サービス力をあなたの社内ソリューションに制限するのですか?「あなたがりんごを持っていて、私がりんごを持っていて、これらのりんごを交換する場合、あなたと私はそれぞれ1つずつりんごを持っています。 2つのアイデア。」
ジョーダン

顧客の1人が無料で匿名でコードまたはアイデアを再リリースした場合はどうなりますか?あなたは誰がそれをしたのか分からず、彼らを訴えることはできません。彼らはそれから恩恵を受けなかったので、あなたもそうしません。これはあなたの仕事を台無しにするでしょうが、あなたの顧客の1人はそれの基本的な価格だけを支払いました (明らかに、ソリューションに複数の顧客がいる場合にのみ機能します)
Skandix 2018

1
@Skandixそれはどのように機能しますか?作品をインターネットにアップロードしても害はありません。多くの人がそれを見つけ、代わりにそれらの人々が顧客に支払っているなら、それはあなたに害を及ぼし始めます。コードの盗難は神話です。「私の知識は無料ですが、私の時間は高価です」(だれが言ったかはわかりません)
アーロンディグラ2018年

34

あなたは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)

6
これの良い点は、機能性を解読しようとする人を意気消沈させることです。それをCythonと組み合わせて、モジュールまたはインターネット通話を介していくつかの追加の暗号化を行うと、おそらく賞品を獲得できます。
m3nda

このパッケージが達成した唯一のことは、コードが難読化されている「難読化ツール」をだますことです。
markroxor

私が試したとき、これはエラーを作りました。私はそれがデータを誤って処理し、完全に変換しなかったと思います。
-Vicrobot、

テンプレートに表示する変数名が必要なため、プロジェクト全体またはテンプレートエンジンでは機能しません
TomSawyer

このライブラリはメンテナンスされていないようで、インデントエラーが発生します。私はPython 3.7を使用しています
PV

25

難読化に依存しないでください。あなたが正しく結論付けたように、それは非常に限られた保護を提供します。更新:以下は、Dropboxで難読化されたpythonコードをリバースエンジニアリングした論文へリンクです。アプローチ-オペコードの再マッピングは良い障壁ですが、明らかにそれを無効にすることができます。

代わりに、多くのポスターが言及しているように、それを作ります:

  • リバースエンジニアリングの時間に見合わない(ソフトウェアは非常に優れているので、支払うのは理にかなっています)
  • 契約書に署名させ、可能であればライセンス監査を実施します。

あるいは、キックアスPython IDE WingIDEが行うように:コードを配布します。その通りです。コードを配布して、アップグレードとサポートのために人々を呼び戻してください。


1
この極端なアイデアのように。それを巨大な方法で巨大な市場シェアで入手し、サポートとアドオンのための非常に大きな顧客基盤を持っています。私もこの質問に取り組んでいます。「ライセンス」の答えはすべて、広範囲にわたるコピーを防ぐことはできませんが、市場シェアの利点が得られないため、基本的に強引です。
Thomas Browne

しかし、アップグレードはただのプレゼントでもあります...それで彼らはそれに対してどのように課金しますか?それは単なるサポートではないでしょうか?
Make42

WingIDEビジネスモデルについて:サポートはサービスであり、ソフトウェアは製品です。製品はスケールしますが、サービスはスケールしません。サポートは、他のビジネスモデルがない場合にのみ、優れたビジネスモデルです。つまり、(何らかの理由で)誰もあなたの製品を購入しない場合は、その製品を譲渡し、少なくともサービスを購入する顧客基盤を確保します。
Make42

20

Cythonを使用します。モジュールを高性能のCファイルにコンパイルし、ネイティブのバイナリライブラリにコンパイルできます。これは、.pycバイトコードと比較して、基本的に元に戻すことができません。

Pythonプロジェクト用にCythonを設定する方法に関する詳細な記事を書いたので、チェックしてみてください。

CythonによるPythonソースの保護


19

.pycファイルの配布には問題があります。これらのファイルには、作成されたpythonバージョン以外のpythonバージョンとの互換性がありません。つまり、製品を実行するシステムで実行されているpythonバージョンを知っておく必要があります。これは非常に制限的な要素です。


はい。ただし、難読化されたコードでその正確なPythonバージョンを配布する場合はできません。
アレックス

17

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

こうすることで、ライセンスチェックをサーバールームの安全な場所で実行できます。


+1(0に戻る):このようなアプローチが設定に実用的であると仮定すると、それが問題の唯一の真の解決策のようです。
2010

10
ライセンスWebサーバーがダウンしたり、顧客のインターネットアクセスがダウンしたりすると、ライセンスチェックへのアクセスが失われるため、顧客はビジネスを運営できなくなることに注意してください。
DevPlayer

1
@DevPlayerこれに対する解決策があります。ソフトウェアがリモートライセンスサーバーに到達できない場合に一時的なアクセスを許可するローカルキーメカニズムを実装できます。
Jeffrey

1
@Jeffrey:これで、元の場所に戻ることができます-そのコードを保護する方法。安全性を
高めるに

14

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

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

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

これはクロスプラットフォームまたは純粋なPythonソリューションではありませんが、機能します。


3
ネイティブライブラリアプローチを使用すると、独自のコードとAPIを使用してライセンスを検証できるため、プログラムによってライセンスキーシステムをブルートフォースで実行することがはるかに簡単になります。
Tom Leys

8
そう?RSAを使用してライセンスに署名し、1024ビットで構成される秘密鍵をブルートフォースにブルートフォースさせる。それは可能ですが、多くの時間がかかります...そしてお金-。
Abgan、2008

12

Pythonコードを保護する方法がもう1つあると思います。難読化メソッドの一部。Mount and Bladeなどのゲームがあり、独自のpythonインタープリター(オープンソースと思われる元のインタープリター)を変更して再コンパイルし、OPコードテーブルのOPコードを標準のpython OPとは異なるものに変更しただけだと思いますコード。

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

この方法で未熟なハッカーを混乱させるために、あらゆる種類の厄介なトリックを実行できます。経験の浅いハッカーの集団を阻止するのは簡単です。あなたが倒す可能性が低いのはプロのハッカーです。しかし、ほとんどの企業は、私が想像する限り、プロのハッカーを長い間スタッフに留めていません(おそらくハッキングされるためです)。しかし、未熟なハッカーがいたるところにいます(好奇心の強いITスタッフとして読んでください)。

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

OP 234は、ソース行「#Copyright I wrote this」または「#Copyright」が欠落している場合にその行を「if False:」と同等のopコードにコンパイルします。基本的に、コードブロック全体を無効にすることは、何らかの不明瞭な理由のように思われます。

変更されたインタープリターの再コンパイルが可能な場合の1つのユースケースは、アプリを作成しなかった場合、アプリは大きいですが、財務アプリの専任サーバー管理者である場合など、アプリを保護するために支払われます。

目玉のためにソースまたはオペコードを開いたままにして、ネットワークトラフィックにSSLを使用することは少し矛盾しています。SSLも100%安全ではありません。しかし、それはほとんどの目がそれを読むのを止めるために使用されます。少し注意が必要です。

また、Pythonのソースとオペコードが見えすぎていると考える人が多ければ、結局誰かが少なくとも簡単な保護ツールを開発する可能性があります。したがって、「Pythonアプリを保護する方法」を尋ねる人が増えるほど、その開発は促進されます。


11

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


10

pyconcreteが表示されないことに驚いた答えにさ。多分それは質問より新しいからでしょうか?

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

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

pypiページから:

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

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

9

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

最善の解決策は、コードをサービスとして販売することです。たとえば、サービスをホスティングしたり、サポートを提供したりすることです。

コードを.pycファイルとして送信すると、保護が数#秒で無効になるのを防ぐことができますが、海賊行為からの保護にはほとんど効果がなく(そのようなテクノロジーがある場合と同様)、結局のところ、それは次のことを達成することはできません。会社とのきちんとしたライセンス契約はするでしょう。

コードをできる限り使いやすくすることに集中します。顧客が満足すると、理論上の違法コピーを防止するよりもはるかに多くの利益を得ることができます。


8

コードを盗みにくくする別の試みは、jythonを使用してから、java obfuscatorを使用することです。

これは、jythoncがPythonコードをJavaに変換し、Javaがバイトコードにコンパイルされるので、かなりうまくいくはずです。したがって、クラスを難読化すると、実際のコードの回復は言うまでもなく、逆コンパイル後に何が起こっているのかを理解するのが非常に難しくなります。

jythonの唯一の問題は、cで記述されたpythonモジュールを使用できないことです。


6

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

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

さらに、このようなpythonの難読化ツールを使用できます(ググっただけです)。


1
+1署名用。難読化プログラムの場合は-1コードが変更されるのを少なくとも防ぐことができます。
Ali Afshar

2
このコンテキストでは、署名は機能しません。署名チェックローダーをバイパスすることは常に可能です。有用なソフトウェア保護のために最初に必要なのは、不透明なブートストラップメカニズムです。Pythonが簡単にするものではありません。
ddaa 2008年

はい、Python以外のブートストラップ。
Ali Afshar、

または、起動時だけでなく、他のいくつかの場所でライセンスを検証します。簡単に実装でき、バイパスする時間を大幅に増やすことができます。
Abgan、2008

6

Linuxなどのクライアントソフトウェアに対してgetdropbox.comの担当者がどのようにそれを行っているかを確認する必要があります。解読するのは非常にトリッキーであり、保護メカニズムを通り抜けるにはかなり創造的な分解が必要です。


8
しかし、それが過ぎ去ったという事実は、彼らが失敗したことを意味しました-一番下の行は、ただ試みないで、法的保護のために行きます。
Chii、

この保護メカニズムに合格する方法について公開されている情報はありますか?
Mitar

6

Pythonでできる最善のことは、不明瞭になることです。

  • すべてのドキュメント文字列を取り除きます
  • .pycコンパイル済みファイルのみを配布します。
  • 凍らせる
  • help / configがすべてを表示しないように、クラス/モジュール内の定数を不明瞭にします

その一部を暗号化し、その場で暗号化を解除してeval()に渡すことにより、いくつかの追加の隠蔽を追加できる場合があります。しかし、あなたが何をしても、誰かがそれを壊すことができます。

これはいずれも、攻撃者がバイトコードを逆アセンブルしたり、ヘルプやディレクトリなどを使用してAPIを調べたりすることを阻止するものではありません。


5

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

競合他社が独自のソースコードを使用したり、同じコードの独自のバージョンを作成したりするのを防ぐための1つの方法は、プログラムロジックに署名を追加し(コードが盗まれたことを証明するためのいくつかの秘密)、難読化することです。 Pythonのソースコードなので、読みにくく、利用しにくいです。

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

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

シンボルの難読化に加えて、コードのリファクタリングを解除することをお勧めします。たとえば、実際にそれらの異なる場所が最終的に同じことを行ったとしても、呼び出しグラフが多くの異なる場所を指す場合、すべてがさらに混乱します。

難読化されたコード内の論理署名(たとえば、プログラムロジックで使用されるが、署名としても使用される値のテーブルを作成する場合があります)。これは、コードが自分から発信されたものかどうかを判断するために使用できます。難読化されたコードモジュールを独自の製品の一部として使用することを誰かが決定した場合(それを再難読化して異なるように見せた後でも)、あなたが示すことができる場合、そのコードは秘密の署名で盗まれます。


4

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

そうは言っても、私はpythonの難読化についてgoogleをチェックしているだけで、何も表示していません。.Netソリューションでは、難読化がWindowsプラットフォームでの問題に対する最初のアプローチになりますが、Monoで動作するLinux上のソリューションがあるかどうかはわかりません。

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

それはすべてトレードオフに帰着します。一方では、Pythonでのソフトウェア開発が容易であり、秘密を隠すことも非常に困難です。反対側では、アセンブラで作成したソフトウェアを書くのははるかに困難ですが、秘密を隠すのははるかに簡単です。

上司は、その連続体のどこかで、自分の要件をサポートするポイントを選択する必要があります。そして彼はあなたが彼が望むものを構築できるようにあなたにツールと時間を与えなければなりません。しかし私の賭けは、彼が実際の開発コストと潜在的な金銭的損失に反対するだろうということです。


4

短い話:

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

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

トピックに興味がある場合は、このプロジェクトが役立ちます-pyprotect


3

メモリにロードして実行するCランチャーの暗号化されたリソースにpy2exeバイトコードを含めることができます。ここここのいくつかのアイデア

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

また、デバッガーを防止するためのチュートリアルを見つけ、逆アセンブラーを失敗させ、誤ったデバッガーブレークポイントを設定することもできます。、およびチェックサムによるコードの保護ます。その他のリンクについては、["暗号化されたコード" execute "in memory"]を検索してください。

しかし、他の人がすでに言ったように、あなたのコードに価値がある場合、リバースエンジニアは最終的に成功します。


3

ソフトウェアライセンスに焦点を当てる場合は、ここで書いた別の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公開鍵などの設定方法については、こちらをご覧ください


2

同じ方法を使用してc / c ++のバイナリファイルを保護します。つまり、実行可能ファイルまたはライブラリバイナリファイルの各関数本体を難読化し、各関数エントリの先頭に「ジャンプ」命令を挿入し、特殊関数にジャンプして難読化されたコードを復元します。バイトコードは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があります。



1

pythonのソースコードを非表示にする方法についての包括的な回答がありますこちらをご覧ください

考えられる手法は次のとおりです。-
コンパイルされたバイトコード(python -m compileall)を使用します
-実行可能な作成者(またはPyInstallerのようなインストーラー
-サービスとしてのソフトウェア(私の意見ではコードを隠す最良のソリューション)-python
ソースコード難読化ツール


リンクはexample.comに移動します。
Darian

@Darianが指摘してくれてありがとう。リンクを更新しました。
マイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.