PyCon中国2018杭州駅の最後の11月には、Pythonのソースコードの暗号化を共有Pythonインタプリタを変更することによって、暗号化と復号化のPythonコードの目的を達成するための方法について説明します。しかし、病気の著者遅延発症するので、それがタイムリーにされていないとテキスト版に編成し、ついにこれだけの記事、それを破りました。
このシリーズは、最初に既存のソースコードの暗号化方式、方法、長所と短所のアイデアを紹介します、その後、どのようにカスタムPythonインタプリタを通じてよりよい暗号化と復号化のソースコードを達成するために。
優れた暗号化を行うことは困難であるPythonのコードが得られPythonのオープンソースの動特性や機能に。コミュニティの一部の声を、このような制限は、商業保護の目的を達成するための法的手段ではなく、暗号化のソースコードをあるべきということであり、いくつかの音があるにかかわらず暗号化する手段を持っていると思います。以来、人々は、それによって、ソースコードを保護する目的を達成するために、すべての種類または暗号化された、または難読化プログラムを思い付きます。
次のような保護の共通ソース手段が要約されています。
-
.pycファイルのリリースファイル
-
コードの難読化
-
py2exeを使用してください
-
使用Cython
のは、これらの単純な解決策についてお話しましょう。
01.問題に.pycファイル
考え
我々はすべて知っているように、Pythonインタプリタは、最初のコードの実行中に.pycファイルを生成し、その後に.pycファイルの内容の実装を説明します。もちろん、Pythonインタプリタは直接に.pycファイルを実行することができます。.pycファイルのファイルはバイナリファイルであり、直接ソースのコンテンツを見ることができません。コードは、クライアント環境への.pyファイルではなく.pycファイルが発行されている場合は、Pythonコードの保護の目的を達成することはできませんでしょうか?
方法
.pyファイルは、ファイルを.pycファイルにコンパイルされ、その後、ファイルを生成する.pyc Qulaoコードのすべてを再度実行する必要がないかもしれない、非常に簡単なものである、と。
実際には、Pythonの標準ライブラリはcompileallという名前のライブラリを提供し、簡単にコンパイルすることができます。
次のコマンドは、ディレクトリ内のすべての.pyファイルを行き来することができます実行し、それがする.pycファイルにコンパイルされます。
python -m compileallその後解放パッケージ化されるように、全ての.pyファイルでディレクトリを削除します。
$ find <src> -name '*.py' -type f -print -exec rm {} \;
利点
-
少し休憩障壁ソースを改善するのは簡単
-
プラットフォームの互換性、の.py実行、する.pycどこで実行することができます
不十分な
-
違いの互換性を説明し、.pycファイルはインタプリタの特定のバージョンで実行することができます
-
、低コストの休憩をコンパイルするために既製のツールがあります。
python-uncompyle6は、逆コンパイラ、顕著です。
.pyファイルに.pycファイルのデコンパイルするには、以下のコマンドを実行します。
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
02.コードの難読化
コードはある程度混乱している場合でも作者は一切の激しい見えた、そして、それはまた、それのソースを保護する目的を達成することができないのですか?
考え
メモや文書を削除 - :私たちの目的は混乱しているので、徐々にコードは、人々は、それは次のように開始することを理解させることは簡単ではないように、それは、変換の一連です。これらの指示なしに、いくつかの重要なロジックで理解することはそれほど簡単ではありません。
- インデントを変更します。インデントが突然長い急に短い場合には完璧なインデントは確かに吸う見て、ただ快適に見えました。
- 一定のスペースを追加することにより、トークンの真ん中で。この変更およびインデント同様の結果。
- 関数、クラス、変数の名前を変更します。混乱の名前の読みやすさに直接的な影響はなく、読解力の大きな障害に名前を付けます。
- 空白行で無効なコードを挿入されています。これはリズムを破壊するコードを読むために何もして、カバーアップです。
方法
方法の一つ:使用すると、混同されることoxyry
http://pyob.oxyry.com/混乱のPythonコードは、それが簡単に混乱することができます使用して、オンラインサイトです。
私たちはクラス、関数、パラメータの内容に関連したPythonコードのこの部分があるとします。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# coding: utf-8
class A(object):
"""
Description
"""
def __init__(self, x, y, default=None):
self.z = x + y
self.default = default
def name(self):
return 'No Name'
def always():
return True
num = 1
a = A(num, 999, 100)
a.name()
always()
難読Oxyryは、次のコードを取得します:
class A (object ):#line:4
""#line:7
def __init__ (O0O0O0OO00OO000O0 ,OO0O0OOOO0000O0OO ,OO0OO00O00OO00OOO ,OO000OOO0O000OOO0 =None ):#line:9
O0O0O0OO00OO000O0 .z =OO0O0OOOO0000O0OO +OO0OO00O00OO00OOO #line:10
O0O0O0OO00OO000O0 .default =OO000OOO0O000OOO0 #line:11
def name (O000O0O0O00O0O0OO ):#line:13
return 'No Name'#line:14
def always ():#line:17
return True #line:18
num =1 #line:21
a =A (num ,999 ,100 )#line:22
a .name ()#line:23
always ()
コードは、パラメータ名とスペース上のいくつかの調整を行って、コメントを中心に難読化され、読み取りの少しポイントにバリアを作成します。
方法2:使用pyobfuscateライブラリに混乱
pyobfuscateはPythonコードの難読化のかなりのライブラリーの年になるが、それは「健康で強い」アップです。
上記同様にPythonコード部、pyobfuscate混乱後に次の効果:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# coding: utf-8
if 64 - 64: i11iIiiIii
if 65 - 65: O0 / iIii1I11I1II1 % OoooooooOO - i1IIi
class o0OO00 ( object ) :
if 78 - 78: i11i . oOooOoO0Oo0O
if 10 - 10: IIiI1I11i11
if 54 - 54: i11iIi1 - oOo0O0Ooo
if 2 - 2: o0 * i1 * ii1IiI1i % OOooOOo / I11i / Ii1I
def __init__ ( self , x , y , default = None ) :
self . z = x + y
self . default = default
if 48 - 48: iII111i % IiII + I1Ii111 / ooOoO0o * Ii1I
def name ( self ) :
return 'No Name'
if 46 - 46: ooOoO0o * I11i - OoooooooOO
if 30 - 30: o0 - O0 % o0 - OoooooooOO * O0 * OoooooooOO
def Oo0o ( ) :
return True
if 60 - 60: i1 + I1Ii111 - I11i / i1IIi
if 40 - 40: oOooOoO0Oo0O / O0 % ooOoO0o + O0 * i1IIi
I1Ii11I1Ii1i = 1
Ooo = o0OO00 ( I1Ii11I1Ii1i , 999 , 100 )
Ooo . name ( )
Oo0o ( ) # dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
この方法の効果と比較すると、第二の方法は、良く見えます。クラスや関数に加えて、名前が変更されている、いくつかのスペースを追加して、最も顕著に依存しないコードは、いくつかのセグメントを挿入し、それが読みにくくなってしまいます。
利点
- 少し休憩障壁ソースを改善するのは簡単
- 互換性があれば、ソース論理を収容することができるように、難読化コードもでき、良好です
不十分な
- 唯一の単一ファイルの混乱、混乱して互いに連動して複数のソースファイルにリンクすることはできません
- 休憩することは困難ではない、バイトコードを取得することができ、コードの構造を変更していません
03.使用py2exe
考え
py2exeは、Windowsプラットフォーム上で実行可能ファイルのツールを変換するためのPythonスクリプトです。原理は単一の実行可能ファイルに一緒にパッケージに必要な依存関係と結合.pycファイル、ソースファイルをコンパイルすることです。
py2exeバイナリファイルによる最終リリースパッケージ場合は、ソースコードを保護する目的を達成できないでしょうか?
方法
比較的簡単にパッケージ化するpy2exeを使用します。
輸入文書の1)準備。この例ではhello.pyの名前:
print 'Hello World'
2)書かsetup.py:
from distutils.core import setup
import py2exe
setup(console=['hello.py'])
3)実行可能ファイルを生成します
python setup.py py2exe
結果の実行可能ファイルはdistのの\のファイルhello.exeに位置しています。
利点
-
配布して実行するために、直接exeファイルに簡単にパッケージ化することができます
-
.pycファイルよりも高いいくつかの亀裂のしきい値
不十分な
-
互換性が悪い、それが唯一のWindowsシステム上で実行することができます
-
生成された実行可能ファイル内のレイアウトはっきりと開いている、あなたが対応するソースコードに.pycファイルを見つけることができ、その後、ソースコードの逆コンパイル
04.使用Cython
考え
主な目的は、Cythonの性能向上をもたらすことですが、それは原理に基づいていますが:の.py / .pyx .Cファイルがコンパイルされ、その後、.cファイルを.soがコンパイルされている(UNIX)または.pyd(Windowsの場合)、その別の利点は、クラックすることは困難です。
方法
Cythonの開発を使用するには複雑ではありません。
文書のhello.pyxまたはhello.pyの1)準備:
def hello():
print('hello')
2)書かsetup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(name='Hello World app',
ext_modules=cythonize('hello.pyx'))
3).C、さらに.soの又は.pydとしてコンパイルとしてコンパイル。
python setup.py build_ext --inplace
生成されたバイナリファイルへの直接参照ハロー()関数;「ハロー()ハローインポートハローから」パイソン-C行います。
利点
-
クラックが困難又は.pydの.so得られたバイナリファイル
-
パフォーマンスの向上を提供しながら、
不十分な
-
互換性はやや少ない、オペレーティングシステムの異なるバージョンのために、あなたは再コンパイルする必要があるかもしれません
-
ほとんどのPythonコードでサポートされているが、しかし、コードの一部が支援を発見し、高いコストを改善していない場合は、一度