对上述同样一段 Python 代码 , 经 pyobfuscate 混淆后效果如下:
# coding: utf-8if 64 - 64: i11iIiiIiiif 65 - 65: O0 / iIii1I11I1II1 % OoooooooOO - i1IIiclass 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 + yself . default = defaultif 48 - 48: iII111i % IiII + I1Ii111 / ooOoO0o * Ii1I def name ( self ) :return 'No Name'if 46 - 46: ooOoO0o * I11i - OoooooooOOif 30 - 30: o0 - O0 % o0 - OoooooooOO * O0 * OoooooooOOdef Oo0o ( ) : return True if 60 - 60: i1 + I1Ii111 - I11i / i1IIi if 40 - 40: oOooOoO0Oo0O / O0 % ooOoO0o + O0 * i1IIiI1Ii11I1Ii1i = 1Ooo = o0OO00 ( I1Ii11I1Ii1i , 999 , 100 )Ooo . name ( )Oo0o ( ) # dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
相比于方法一 , 方法二的效果看起来更好些 。除了类和函数进行了重命名、加入了一些空格 , 最明显的是插入了若干段无关的代码 , 变得更加难读了 。
优点
- 简单方便 , 提高了一点源码破解门槛
- 兼容性好 , 只要源码逻辑能做到兼容 , 混淆代码亦能
- 只能对单个文件混淆 , 无法做到多个互相有联系的源码文件的联动混淆
- 代码结构未发生变化 , 也能获取字节码 , 破解难度不大
如果最终发行由 py2exe 打包出的二进制文件 , 那岂不是达到了保护源码的目的?
方法使用 py2exe 进行打包的步骤较为简便 。
- 编写入口文件 。本示例中取名为 hello.py :
print 'Hello World'
- 编写 setup.py :
from distutils.core import setupimport py2exesetup(console=['hello.py'])
- 生成可执行文件
python setup.py py2exe
生成的可执行文件位于 disthello.exe。优点
- 能够直接打包成 exe , 方便分发和执行
- 破解门槛比 .pyc 更高一些
.pyc
使用 Cython思路虽说 Cython 的主要目的是带来性能的提升 , 但是基于它的原理:将 .py / .pyx 编译为 .c 文件 , 再将 .c 文件编译为 .so (Unix) 或 .pyd (Windows) , 其带来的另一个好处就是难以破解 。方法使用 Cython 进行开发的步骤也不复杂 。
- 编写文件 hello.pyx 或 hello.py :
def hello():print('hello')
- 编写 setup.py :
from distutils.core import setupfrom Cython.Build import cythonizesetup(name='Hello World App',ext_modules=cythonize('hello.pyx'))
- 编译为 .c , 再进一步编译为 .so 或 .pyd :
python setup.py build_ext --inplace
执行 python -c "from hello import hello;hello()" 即可直接引用生成的二进制文件中的 hello() 函数 。优点
- 生成的二进制 .so 或 .pyd 文件难以破解
- 同时带来了性能提升
- 兼容性稍差 , 对于不同版本的操作系统 , 可能需要重新编译
- 虽然支持大多数 Python 代码 , 但如果一旦发现部分代码不支持 , 完善成本较高
由于发行商业 Python 程序到客户环境时通常会包含一个 Python 解释器 , 如果改造解释器能解决源码保护的问题 , 那么也是可选的一条路 。
假定我们有一个算法 , 能够加密原始的 Python 代码 , 这些加密后代码随发行程序一起 , 可被任何人看到 , 却难以破解 。另一方面 , 有一个定制好的 Python 解释器 , 它能够解密这些被加密的代码 , 然后解释执行 。而由于 Python 解释器本身是二进制文件 , 人们也就无法从解释器中获取解密的关键数据 。从而达到了保护源码的目的 。
要实现上述的设想 , 我们首先需要掌握基本的加解密算法 , 其次探究 Python 执行代码的方式从而了解在何处进行加解密 , 最后禁用字节码用以防止通过 .pyc 反编译 。
推荐阅读
- Elasticsearch中数据是如何存储的?
- Windows 7用户必看 如何升级至Windows 10
- HTTP是如何使用TCP连接
- 如何将 Python 的一个类方法变为多个方法?
- 如何在Mac下生成ssh密钥?
- 这一次,让你完全理解 HTTPS 到底是如何做到数据传输安全的
- 程序员告诉你微信营销号如何防封、解封
- 黑客是如何控制你手机的?出现这几种情况,你的手机可能已中招
- 一文教会你如何申请ios开发者账号
- 更年期的女性 练太极对你的好处到底有多大