如何加密你的 Python 代码( 二 )


对上述同样一段 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 是一款将 Python 脚本转换为 windows 平台上的可执行文件的工具 。其原理是将源码编译为 .pyc 文件 , 加之必要的依赖文件 , 一起打包成一个可执行文件 。
如果最终发行由 py2exe 打包出的二进制文件 , 那岂不是达到了保护源码的目的?
方法使用 py2exe 进行打包的步骤较为简便 。
  1. 编写入口文件 。本示例中取名为 hello.py :
print 'Hello World'
  1. 编写 setup.py :
from distutils.core import setupimport py2exesetup(console=['hello.py'])
  1. 生成可执行文件
python setup.py py2exe生成的可执行文件位于 disthello.exe。
优点
  • 能够直接打包成 exe , 方便分发和执行
  • 破解门槛比 .pyc 更高一些
不足.pyc使用 Cython思路虽说 Cython 的主要目的是带来性能的提升 , 但是基于它的原理:将 .py / .pyx 编译为 .c 文件 , 再将 .c 文件编译为 .so (Unix) 或 .pyd (Windows) , 其带来的另一个好处就是难以破解 。
方法使用 Cython 进行开发的步骤也不复杂 。
  1. 编写文件 hello.pyx 或 hello.py :
def hello():print('hello')
  1. 编写 setup.py :
from distutils.core import setupfrom Cython.Build import cythonizesetup(name='Hello World App',ext_modules=cythonize('hello.pyx'))
  1. 编译为 .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 解释器本身是二进制文件 , 人们也就无法从解释器中获取解密的关键数据 。从而达到了保护源码的目的 。
要实现上述的设想 , 我们首先需要掌握基本的加解密算法 , 其次探究 Python 执行代码的方式从而了解在何处进行加解密 , 最后禁用字节码用以防止通过 .pyc 反编译 。


推荐阅读