Rhys' Blog

python代码保护

2020-01-17

python源码保护

对于编译型语言,比如C、C++、go等来说,从源码到可执行文件往往要经过编译、链接等阶段将源码转化可执行程序,可执行程序是二进制的机器语言文件。发布程序的时候将可执行程序发布,不会涉及到源码,外界也很难将二进制程序通过逆向工程得到源码。
Python执行时会首先将源码编译成字节码文件(.pyc),然后通过解释器将字节码文件逐行解释为机器语言执行。然而,Python的编译过程不是一个强制操作,一般会自动完成,Python开发人员一般也不关注编译过程,因为每次执行Python程序时,虚拟机会自动判断,如果没有源码模块对应的字节码文件,则将源码模块编译为字节码,如果有模块对应的字节码文件,虚拟机会对比源码文件和对应字节码文件的修改时间,如果不一致就会重新编译,一致则不需要重新编译。由于这个特性,发布Python应用的时候可能就是在发布源码,而在一些商业场景下,软件开发商可能仅愿意提供功能服务,而非公开源码。那对应Python来说,应该如何做到源码保护呢?

发布字节码

根据以上对于Python程序执行过程的介绍,Python执行时,会首先在后台自动将源码编译为字节码,然后再解释。所以在发布之前,可以手动将源码编译字节码文件,再发布应用。

优点

  • 操作简单
  • 平台兼容性好

缺点

  • 解释器版本兼容性差,只能在编译时对应的解释器版本才能正常解释
  • 反编译成本低,有比较成熟的工具可以将.pyc文件反编译为.py文件

cython编译

通常使用cython是为了提高程序运行效率,cython可以将py/pyx文件编译为C语言,然后再进一步编译为so文件(Linux)或者pyd文件(Windows),程序运行时,用so文件代替Python源码文件,从而起到了保护源码的作用。

优点

  • 难以破解
  • 同时带来性能提升

缺点

  • 由于编译依赖操作系统,编译后的so文件和编译时的系统版本和Python环境有关,移植到不同版本的系统或Python可能需要重新编译

其他方法

  • 混淆代码
  • 对应Windows程序,可以使用py2exe将源码转换为exe可执行文件
  • 将源码加密,修改Python解释器,在解释前进行解密

参考

https://zhuanlan.zhihu.com/p/54296517