最近碰到个需求,需要把Python代码和用到的资源文件进行混淆加密打包。

 

混淆代码,可以使用oxyry,pyobfuscate,pyminifier进行混淆,其中,

  1. http://pyob.oxyry.com/ 是一个在线混淆 Python 代码的网站;
  2. https://github.com/astrand/pyobfuscate 是一个历史悠久的Python 代码混淆库,功能还是很强大的;
  3. 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打包的具体过程大家可以自行搜索,网上有很多相关文章)。

Logo

更多推荐