Python代码加密 - 4种方案

Python代码加密 - 4种方案

  1. 发行.pyc文件(👍)
  2. 代码混淆(👍)
  3. 使用py2exe(仅限windows)
  4. 使用Cython(兼容性差)

1、发行 .pyc文件

1)原理

.pyc文件 : 二进制文件,无法看出源码内容。

python执行代码原理:代码 —> .pyc文件 —> 解释执行.pyc文件中内容。

因此,python解释器也可以直接执行.pyc文件

2)步骤

使用python标准库自带的 compileall即可。

# 遍历<path>目录下所有的.py文件,编译成.pyc文件
python -m compileall <path>

# .pyc文件也可直接执行,下面两者效果相同
python scriptStudy.py
python scriptStudy.pyc

在这里插入图片描述

3)优点
  • 简单方便,提高源码破解门槛
  • 平台兼容性好,.py能在哪运行,.pyc就能在哪运行
4)缺点
  • 解释器兼容性查,.pyc只能在特定版本的解释器上运行

  • 有现成的反编译工具,破解成本低

    • python-uncompyle6 就是这样一款反编译工具

    • # 将.pyc文件反编译为.py文件
      uncompyle6 *compiled-python-file-pyc-or-pyo*
      

2、代码混淆

1)原理

通过一系列的转换,让代码逐渐不让人那么容易明白。

主要有以下几种手段:

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

http://pyob.oxyry.com/ 是一个在线混淆 Python 代码的网站,使用它可以方便地进行混淆。

左侧输入源码,点击[OBFUSCATE](模糊),即可在右侧看到模糊后的代码。

在这里插入图片描述

方法②: 使用pyobfuscate库进行混淆

pyobfuscate 算是一个颇具年头的 Python 代码混淆库了,但却是“老当益壮”了。

在这里插入图片描述

  • 使用方法:

    • 下载安装pyobfuscate(pypi上没有)https://github.com/astrand/pyobfuscate

      • git clone https://github.com/astrand/pyobfuscate.git
        cd pyobfuscate/
        python setup.py install
        
      • 上面安装 macos可能会失败,原因是文件中指定data放到/usr/bin,而macos文件系统有安全保护。 我这里直接将源码复制到 pyobfuscate 目录下,然后执行命令模糊代码。

      • cd pyobfuscate
        ./pyobfuscate mycode.py
        
        
    • 如果安装好,则可直接调用,模糊代码

      • pyobfuscate example.py
        
    • 结果会输出在控制台,类似print。

    • 不幸的是,pyobfuscate一次只能处理一个源文件,所以它并不适合大型项目。它目前似乎也只适用于python2

3)优点
  • 简单方便,提高了一点源码破解门槛
  • 兼容性好,只要源码逻辑能做到兼容,混淆代码亦能
4)缺点
  • 只能对单个文件混淆,无法做到多个互相有联系的源码文件的联动混淆
  • 代码结构未发生变化,也能获取字节码,破解难度不大
  • pyobfuscate年久未更,目前只适用于python2

3、使用py2exe

1)原理

py2exe 是一款将 Python 脚本转换为 Windows 平台上的可执行文件的工具。其原理是将源码编译为 .pyc 文件,加之必要的依赖文件,一起打包成一个可执行文件。

最终发行由 py2exe 打包出的二进制文件。

2)步骤(只能在windos运行)
  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
    
  4. 生成的可执行文件位于 dist\hello.exe

3)优点
  • 能够直接打包成 exe,方便分发和执行
  • 破解门槛比 .pyc 更高一些
4)缺点
  • 兼容性差,只能运行在 Windows 系统上
  • 生成的可执行文件内的布局是明确、公开的,可以找到源码对应的 .pyc 文件,进而反编译出源码

4、使用Cython

1)原理

虽说 Cython 的主要目的是带来性能的提升,但是基于它的原理:将 .py/.pyx 编译为 .c 文件,再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows),其带来的另一个好处就是难以破解。

2)步骤
  1. 编写文件 hello.pyxhello.py

    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

    python3 setup.py build_ext --inplace
    
  4. 执行 python3 -c "from hello import hello;hello()" 即可直接引用生成的二进制文件中的 hello() 函数。

在这里插入图片描述

3)优点
  • 生成的二进制 .so 或 .pyd 文件难以破解
  • 同时带来了性能提升
4)缺点
  • 兼容性稍差,对于不同版本的操作系统,可能需要重新编译
  • 虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高

参考资料:如何保护你的 Python 代码 (一)—— 现有加密方案

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值