python源代码文件加密

2023-05-16

由于python设计的初衷是开源的,因此py文件是可以直接看到源码的。但开发商业软件,代码加密保护就比较重要了。

python编译后程序

pyc文件是py文件经过编译后生成的二进制文件,因此可以发布pyc文件以隐藏源代码。pyc文件拥有更快的加载速度,执行速度没有区别。pyc是一种跨平台的字节码,pyc的内容是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。
python提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是py_compile模块:
生成单个pyc文件
python -m py_compile test.py
python -O -m py_compile test.py
-O 优化成字节码(pyo)
-m 表示把后面的模块当成脚本运行
-OO 表示优化的同时删除文档字符串
批量生成pyc文件
python -m compileall

对服务器脚本敏感信息加密的程序,就可以使用这种方式生成pyc文件,提高一层保护的功能,当然反编译在很大程度上还是能还原回来的:

#对程序进行编译
[root@localhost encrypt]# python -m py_compile optcrypt.py
[root@localhost encrypt]# python -m py_compile server.py 
[root@localhost encrypt]# python -m py_compile __init__.py
#生成文件
[root@localhost encryptc]# ls
global.properties  __init__.pyc  optcrypt.pyc  server.pyc  test.sh

程序加密

目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe或者可执行文件进行保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举几种形式的保护流程。

1.pyexe、PyInstaller、py2app 打包软件

这些工具用于将一个Python项目打包成单个可执行的文件,对 python转exe或者可执行文件,方便(在没有Python环境的机器上)使用。但通过压缩包可以方便地得到所有pyc文件或源文件,与C/C++编译生成的可执行文件有本质上的区别,基本上是零保护。

1.1 pyinstaller用法

pip install pyinstaller
#系统的python打包
pyinstaller -F ./autocheckin.py -p '~/.local/lib/python3.8/site-packages/'
#pyenv的虚拟环境打包(系统自带的库路径是不是需要指定呢?)
pyinstaller -F ./hello.py -p '~/.pyenv/versions/tele/lib/python3.8/site-packages/','/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.8/dist-packages'

2.对.py/.pyc加密

第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置后直接点击加壳。
第二步,对.py/.pyc 进行加密,使用 DSProtector 对.py/.pyc 进行保护。

3.使用cython保护python的代码(推荐)

先安装cython
pip install cython
有些系统要求Cython大写
pip install Cython

No package cython available.

  • Maybe you meant: Cython

然后安装python开发包
centos系统下
yum install python-devel
然后对python代码文件进行转换:
cython hello.py --embed #把python代码转换成c代码
会生成一个名为hello.c的c语言的源文件。
然后使用gcc编译成二进制可执行文件,这时候需要制定头文件、编译选项、链接选项:(macOS下测试通过)

gcc `python-config --cflags` `python-config --ldflags`  hello.c -o hello

注:使用`符号,而不是单引号’。

如果python版本较高的话可以使用

gcc `python3-config --cflags --ldflags` hello.c -o hello

这样代码就被编译成二进制的可执行程序了。
链接错误的话试试:(centOS下测试通过,如果hello.c -o hello放在最后则centOS编译会报错)

gcc `python-config --cflags` -o hello hello.c  `python-config --ldflags`

4. 加密.py文件为.so文件

4.1 安装 cython, python-devel, gcc
4.2 新建一个setup.py,内容是:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["helloworld.py"]))

其中helloworld.py是需要加密的文件。setup.pyhelloworld.py放在相同文件夹。

4.3 运行setup.py脚本
python setup.py build_ext --inplace

其中build_ext代表外部模块,--inplace参数则表示在当前目录生成文件。

4.4 运行脚本后,在当前文件夹会生成helloworld.so文件

然后直接导入helloworld这个模块即可。如果你定义了类,可能还会遇到和__init____call__相关的错误。解决办法就具体问题具体分析了。

Note:Windows下会生成.pyd文件,而非.so文件

4.5 另外一种编译方法(未测试)
cython helloworld.py
gcc -c -fPIC -I/usr/include/python2.7/ helloworld.c
gcc -shared helloworld.o -o helloworld.so

Note: 编译后的文件与平台和python版本相关性比较高,我的做法是使用docker来进行部署。

参考文献:

  1. python源代码文件加密 - 简书
  2. python文件编译成so介绍 - 1.使用cython将py文件编译成so文件 - linyonghui1213的专栏 - CSDN博客
  3. Cython编译python为so 代码加密 - 经验集锦 - CSDN博客
  4. Python编译成.so文件进行加密后调用 - weixin_44216589的博客 - CSDN博客
  5. python将py编译成so方法 - 牧飞 - CSDN博客
  6. python 源代码保护 之 xx.py -> xx.so - TonyZhang24 - 博客园
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python源代码文件加密 的相关文章

  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐