其他
如何保护你的Python代码(一)——现有加密方案
作者 | Prodesire
来源 | Python猫(ID: python_cat)
发行 .pyc 文件 代码混淆 使用 py2exe 使用 Cython
1 发行 .pyc 文件
1.1 思路
1.2 方法
find <src> -name '*.py' -type f -print -exec rm {} ;
1.3 优点
简单方便,提高了一点源码破解门槛 平台兼容性好,.py 能在哪里运行,.pyc 就能在哪里运行
1.4 不足
解释器兼容性差,.pyc 只能在特定版本的解释器上运行 有现成的反编译工具,破解成本低
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
2 代码混淆
2.1 思路
2.2 方法
方法一:使用 oxyry 进行混淆
# 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()
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 ()
方法二:使用 pyobfuscate 库进行混淆
# 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
2.3 优点
简单方便,提高了一点源码破解门槛 兼容性好,只要源码逻辑能做到兼容,混淆代码亦能
2.4 不足
只能对单个文件混淆,无法做到多个互相有联系的源码文件的联动混淆 代码结构未发生变化,也能获取字节码,破解难度不大
3 使用 py2exe
3.1 思路
3.2 方法
print 'Hello World'
from distutils.core import setup
import py2exe
setup(console=['hello.py'])
python setup.py py2exe
3.3 优点
能够直接打包成 exe,方便分发和执行 破解门槛比 .pyc 更高一些
3.4 不足
兼容性差,只能运行在 Windows 系统上 生成的可执行文件内的布局是明确、公开的,可以找到源码对应的 .pyc 文件,进而反编译出源码
4 使用 Cython
4.1 思路
.py
/.pyx
编译为 .c 文件,再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows),其带来的另一个好处就是难以破解。4.2 方法
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'))
python setup.py build_ext --inplace
4.3 优点
生成的二进制 .so 或 .pyd 文件难以破解 同时带来了性能提升
4.4 不足
兼容性稍差,对于不同版本的操作系统,可能需要重新编译 虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高
(本文由Python大本营转载,转载请联系原作者)
◆
精彩推荐
◆
2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。
推荐阅读
5大必知的图算法,附Python代码实现
如何用爬虫技术帮助孩子秒到心仪的幼儿园(基础篇)
Python传奇:30年崛起之路