717

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

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

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

この問題を処理する良い方法はありますか?

4

28 に答える 28

487

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

技術的な方法で顧客がコードを読むのを止めることはできないため、通常の商業的な方法を適用する必要があります。

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

  2. 大きな価値を提供します。あなたの作品が非常に優れていて、その価格が断りにくいものであれば、何かをリバースエンジニアリングするために時間とお金を浪費するインセンティブはありません。リバース エンジニアリングにはコストがかかります。あなたの製品を少し安くしてください。

  3. リバース エンジニアリングをお勧めしないアップグレードと機能強化を提供します。次のリリースでリバース エンジニアリングが破られたら、意味がありません。これはばかげた極端に実行することもできますが、次のリリースをリバース エンジニアリングよりも価値のあるものにする新しい機能を提供する必要があります。

  4. 非常に魅力的な料金でカスタマイズを提供するため、拡張機能の構築とサポートにお金を払うことになります。

  5. 有効期限のあるライセンス キーを使用してください。これは残酷で、評判が悪くなりますが、ソフトウェアが動作しなくなることは間違いありません。

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

于 2008-11-04T12:29:24.000 に答える
408

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

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

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

于 2008-11-04T12:00:34.417 に答える
318

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

正しいことを行うには正しいツールを使用する必要があり、Python は難読化されるように設計されていません。それは逆です。それが言語の哲学であるため、Python ではすべてがオープンであるか、簡単に公開または変更できます。

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

難読化は本当に難しい

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

法的要件を持つことは良い方法です

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

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

昨今のビジネスモデルは、製品ではなくサービスを販売する傾向にあります。サービスをコピーしたり、海賊版にしたり、盗んだりすることはできません。流れに乗ることを考える時が来たのかもしれません...

于 2008-11-04T13:03:06.257 に答える
61

顧客に Python の機能を使ってもらいたいが、ソース コードを公開したくないということは理解しています。

ここに私の提案があります:

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

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

(c) (a) と (b) の両方で、ライブラリをライセンスされたバイナリとして Python インターフェイスで配布できる必要があります。

于 2008-11-06T07:41:59.463 に答える
44

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)
于 2015-05-08T10:21:58.150 に答える
34

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

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

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

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

著作権表示を変更しない場合、第 2 レベルの顧客は、ソフトウェアがオリジナルのものであることに気づき、何が起こっているのか不思議に思うでしょう。彼らがあなたに連絡する可能性が高いので、あなたの作品の転売について知ることができます.

ここでも 2 つのケースがあります。最初の顧客は数部しか販売しませんでした。それはとにかく彼らがあまりお金を稼いでいないことを意味します。または、大量に販売しました。つまり、彼らが何をしているかを知り、それについて何かをするチャンスが増えるということです。

しかし、最終的には、ほとんどの企業が法律を遵守しようとします (評判が損なわれると、ビジネスを行うのがはるかに難しくなります)。したがって、彼らはあなたの仕事を盗むことはありませんが、あなたと協力して改善します. そのため、ソースを (単純な再販から保護するライセンスを使用して) 含めた場合、変更が次のバージョンに確実に反映され、維持する必要がなくなるため、彼らが行った変更を単純にプッシュバックする可能性があります。 . それは双方にとって好都合です: あなたは変更を受け取り、公式リリースに含めることを望まなくても、彼らが本当に必死にそれを必要とする場合、彼らは自分で変更を加えることができます.

于 2008-11-04T12:27:52.927 に答える
24

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

代わりに、多くのポスターが言及しているように、次のようになります。

  • リバース エンジニアリングに費やす価値がない (あなたのソフトウェアは非常に優れているため、支払う価値がある)
  • 契約に署名させ、可能であればライセンス監査を実施します。

または、素晴らしい Python IDE WingIDEのように: コードを配布します。そうです、コードを配布して、人々にアップグレードとサポートを求めて戻ってきてもらいましょう。

于 2008-11-04T18:53:11.980 に答える
20

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

于 2009-02-16T21:09:33.657 に答える
18

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

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

于 2008-11-04T12:29:48.430 に答える
16

完全な解決策はありませんが、次のことを行うことができます。

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

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

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

于 2008-11-05T06:10:26.823 に答える
13

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

そのため、python ソースは変更されていませんが、*.pyc ファイルのファイル拡張子は異なり、op コードは公開されている python.exe インタープリターと一致しません。ゲームのデータ ファイルを確認すると、すべてのデータが Python ソース形式でした。

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

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

OP 234 は、ソース行「# Copyright I written this」または「# Copyright」が欠落している場合は「if False:」と同等の op コードにその行をコンパイルするためのものです。基本的に、あいまいな理由のように見えるコードブロック全体を無効にします。

変更されたインタープリターの再コンパイルが実行可能なユース ケースの 1 つは、アプリを作成したのではなく、アプリが大きいが、金融アプリの専用サーバー管理者である場合など、アプリを保護するために報酬が支払われている場合です。

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

また、Python のソースとオペコードがあまりにも目立ちすぎていると考える人が多ければ、最終的に誰かが少なくとも単純な保護ツールを開発する可能性があります。したがって、「Python アプリを保護するにはどうすればよいか」と尋ねる人が増えれば増えるほど、その開発が促進されるだけです。

于 2012-07-03T17:07:27.193 に答える
12

コードを保護するための信頼できる唯一の方法は、管理しているサーバー上でコードを実行し、そのサーバーとやり取りするクライアントをクライアントに提供することです。

于 2008-11-04T20:27:05.130 に答える
10

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

最善の解決策は、コードをサービスとして販売することです。たとえば、サービスをホストしたり、サポートを提供したりすることですが、それが常に実用的であるとは限りません。

コードをファイルとして出荷.pycすることで、保護が数#秒で失敗するのを防ぐことができますが、(そのようなテクノロジーがあるかのように)著作権侵害対策の効果はほとんどなく、結局のところ、会社とのまともなライセンス契約はそうするでしょう。

コードをできるだけ使いやすくすることに集中してください。顧客を満足させることで、理論上の著作権侵害を防ぐよりもはるかに多くのお金を稼ぐことができます。

于 2008-11-04T12:53:25.280 に答える
8

コードを盗むのを難しくするもう1つの試みは、jythonを使用してから、javaobfuscatorを使用することです

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

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

于 2009-05-05T21:53:15.273 に答える
6

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

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

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

于 2008-11-04T12:59:04.707 に答える
6

Python でできる最善のことは、物事を曖昧にすることです。

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

その一部を暗号化し、オンザフライで復号化して eval() に渡すことにより、さらにいくつかのあいまいさを追加できる場合があります。しかし、あなたが何をしても、誰かがそれを破ることができます。

これは、決定的な攻撃者がバイトコードを逆アセンブルしたり、help や dir などを使用して API を掘り下げたりするのを阻止するものではありません。

于 2008-11-04T18:45:18.487 に答える
6

getdropbox.com の担当者が、Linux を含むクライアント ソフトウェアでどのようにそれを行っているかを調べてください。クラックするのは非常に難しく、保護メカニズムを突破するには非常に創造的な分解が必要です。

于 2008-11-04T12:20:21.837 に答える
5

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

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

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

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

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

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

于 2010-06-07T05:07:06.243 に答える
4

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

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

次は、コンパイル済み言語でコードを書くか、本当にやりたい場合はアセンブラーでコードを書くことです。取り除かれた実行可能ファイルは、インタープリター言語よりも逆コンパイルがはるかに困難です。

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

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

于 2008-11-04T12:28:38.370 に答える
3

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

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

また、デバッガーの防止、逆アセンブラーの失敗、偽のデバッガー ブレークポイントの設定、およびチェックサムによるコードの保護に関するチュートリアルを見つけることもできます。[「暗号化されたコード」が「メモリ内で」実行] を検索して、その他のリンクを探します。

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

于 2013-05-22T14:53:50.723 に答える
1

cxfreeze(Linuxの場合はpy2exe)を使用すると機能します。

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

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

于 2012-03-03T15:13:13.993 に答える