python代码加密

由于Python的动态特性和开源特点,导致Python代码很难做到很好的加密。社区中的一些声音认为这样的限制是事实,应该通过法律手段而不是加密源码达到商业保护的目的;而还有一些声音则是不论如何都希望能有一种手段来加密。于是乎,人们想出了各种或混淆或加密的方案,借此来达到保护源码的目的。

代码混淆

如果代码被混淆到一定程度,连作者看着都费劲的话,是不是也能达到保护源码的目的呢?也就是通过一系列的转换,让代码逐渐不那么让人容易明白。

代码混淆的思路
移除注释和文档。没有这些说明,在一些关键逻辑上就没那么容易明白了。
改变缩进。完美的缩进看着才舒服,如果缩进忽长忽短,看着也一定闹心。
在tokens中间加入一定空格。这就和改变缩进的效果差不多。
重命名函数、类、变量。命名直接影响了可读性,乱七八糟的名字可是阅读理解的一大障碍。
在空白行插入无效代码。这就是障眼法,用无关代码来打乱阅读节奏。

http://pyob.oxyry.com/ 是一个在线混淆 Python 代码的网站,使用它可以方便地进行混淆。
混淆后的代码主要在注释、参数名称和空格上做了些调整,稍微带来了点阅读上的障碍。

发行.pyc文件

大家都知道,Python 解释器在执行代码的过程中会首先生成 .pyc 文件,然后解释执行 .pyc 文件中的内容。当然了,Python 解释器也能够直接执行 .pyc 文件。而 .pyc 文件是二进制文件,无法直接看出源码内容。

什么是.pyc文件
.pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。

Python标准库中提供了一个名为 compileall 的库,可以轻松地进行编译。

1
python -m compileall <src>

编译完成后删除目录下所有.py文件就可以打包发布了。
该方法操作简单而且平台兼容性好(.py能在哪里运行.pyc就能在哪里运行),但是破解难度并不高。uncompyle6就是这样一款反编译工具,效果出众。

1
uncompyle6 -o test.py test.pyc

使用Pyinstaller

打包成windows下的可执行文件,比.pyc加密性更强一些。

1
pyinstaller -F hello.py
0%