Python代码保护,编译成pyd(windows)或so(linux)库
最近碰到个需求,需要把Python代码和用到的资源文件进行混淆加密打包。混淆代码,可以使用oxyry,pyobfuscate,pyminifier进行混淆。Python的文件格式有:py、pyw、pyc、pyo、pyd等,其中:py和pyw都是python脚本文件,只是视窗在运行它们的时候用 python.exe 运行 .py ,用 pythonw.exe 运行 .pyw ;pyc是脚本文件经过编
最近碰到个需求,需要把Python代码和用到的资源文件进行混淆加密打包。
混淆代码,可以使用oxyry,pyobfuscate,pyminifier进行混淆,其中,
- http://pyob.oxyry.com/ 是一个在线混淆 Python 代码的网站;
- https://github.com/astrand/pyobfuscate 是一个历史悠久的Python 代码混淆库,功能还是很强大的;
- https://github.com/qiyeboy/pyminifier 也是是一个很多人使用的Python 代码混淆库。
Python的文件格式有:py、pyw、pyc、pyo、pyd等,其中:
py和pyw都是python脚本文件,只是视窗在运行它们的时候用 python.exe 运行 .py ,用 pythonw.exe 运行 .pyw ;
pyc是脚本文件经过编译器编译之后得到的二进制文件,很容易被反编译;
pyo是脚本文件开启优化编译选项(-O)编译得到的二进制文件,也很容易被反编译;
pyd是python的动态链接库dll文件,目前还没有被反编译的消息,只能被反汇编。
打包pyd使用的是python中的第三方模块Cython,安装命令:pip install cython
在python工程中建立打包文件setup.py,假如需要打包的python文件名为xxxa.py,则:
setup.py文件内容如下:
from setuptools import setup
from Cython.Build import cythonize
setup(
name='xxxb',
ext_modules=cythonize('xxxa.py'), # 打包文件的名称,默认与setup.py在同一路径下
)
在setup.py所在的目录下执行如下命令:
python setup.py build_ext --inplace
如果出现错误“error: Unable to find vcvarsall.bat”,很可能是未安装VS或者安装的VS版本与你的Python版本不对应,我这里安装的是VS2017,链接:https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
我这里下载安装之后重新执行打包命令就可以了。
这里需要提一下,如果你之前安装了Anaconda并执行了"conda instal libpython"命令配置过环境变量,执行打包命令的时候出现
if self.ld_version >= "2.10.90":
TypeError: '>=' not supported between instances of 'NoneType' and 'str'
这种错误,你可以使用命令
python setup.py build_ext --inplace --compiler=msvc
来进行打包,指明编译器使用VS。
运行完成之后,会生成对应的c
文件、pyd
文件和编译过程中用到的临时文件build
文件夹,如图:
其中c文件内就是传说中的D语言代码,pyd文件就是我们需要的最终文件。
pyd文件可以直接当成模块使用,可以进入python直接调用:
(venv) D:\Python\make_pyd>python
Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Warning:
This Python interpreter is in a conda environment, but the environment has
not been activated. Libraries may fail to load. To activate this environment
please see https://conda.io/activation
Type "help", "copyright", "credits" or "license" for more information.
>>> import make_pyd
>>> make_pyd.hello()
Hello World
<press ENTER to quit>
也可以在python文件中引用,比如我们建立一个入口脚本文件index.py,
import make_pyd
if __name__ == '__main__':
make_pyd.hello()
我们还可以使用pyinstaller把pyd文件打包成为一个可执行的exe文件(关于使用pyinstaller打包的具体过程大家可以自行搜索,网上有很多相关文章)。
更多推荐
所有评论(0)