windows 下Python3.x生成pyd文件(python加密)

Python有py、pyc、pyw、pyo、pyd等文件格式,其中除py其他格式起到了不暴露源码的作用,相当于c语言中的动态库。

Python的脚本文件是开源的,若直接发布桌面软件问题很严重。因为这是公司的产品,需要保护源码。那么要对Python代码进行混淆加密保护。

混淆代码,我准备使用pyminifier。而加密处理,就比较麻烦。

Python有py、pyc、pyw、pyo、pyd等文件格式。

其中,pyc是二进制文件。但很容易被反编译。

pyw也不行,只是隐藏命令行界面而已,可以作为入口脚本。

pyo和pyc差不多,也容易被反编译。

最后剩下pyd格式。pyd格式是D语言(C/C++综合进化版本)生成的二进制文件,实际也会是dll文件。该文件目前位置没找到可以被反编译的消息,只能被反汇编。Sublime text编辑器也是使用该格式。

Python的py文件生成pyd文件步骤如下。

1.安装Cython

可以使用pip命令安装Cython。

pip install Cython

2.处理vcvarsall.bat

若不处理,可能会出现“Unable to find vcvarsall.bat”错误。

解决办法:

参考这里How to deal with the pain of “unable to find vcvarsall.bat”

3.创建工作目录并生成pyd文件

这里有一个坑。程序所在的目录路径不能包含中文文字。所以我在E盘下创建一个test文件夹,用于放置要处理的python文件。

简单写了一个测试文件(命名为test.py):

 
  1. #coding:utf-8
  2. def hello():
  3.     print("Hello world")
  4.     input("<press ENTER to quit>")

在该目录下,再新建一个py文件(命名为setup.py):

 
  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3.  
  4. setup(
  5.   name = 'Hello world app',
  6.   ext_modules = cythonize("test.py"),
  7. )

接着,再打开cmd,跳到该目录并执行如下命令:

python setup.py build_ext --inplace
  1.  

最终生成如下文件:

其中,build是生成过程使用到的临时文件。test.c也是临时文件,可以打开看看传说中的D语言代码。

test.pyd是我们所需的文件。

pyd文件可以像平常一样使用。例如,我进入python,如下代码:

后来,我尝试使用py2exe打包pyd文件。还需要创建一个入口脚本(命名为index.py):

import test
 
if __name__=="__main__":
    test.hello()

为了方便打包,我重新创建一个目录。把index.py和test.pyd复制到该目录。

如何安装和使用py2exe这里我就不说了,自行百度一下。

分别用test.pyd和未处理的test.py打包效果如下:

1)用test.pyd

直接可以在index.exe对应的位置找到该文件。

2)用test.py

在该目录下没有test.py文件。该文件在library.zip中。

测试结果,用py2exe可以正常使用pyd文件。

ps:若用Cython出现如下错误,说明文件的编号和python脚本设置 #coding设置的编码不一致。保存一致编码即可解决该问题。

Decoding error, missing or incorrect coding=<encoding-name> at top of source (cannot decode with encoding 'utf8': invalid start byte)

4.示例:本地项目打包

注意,椭圆标注的是新建的打包脚本,方框圈注的是自动生成。

步骤:

1.新建一个py文件(命名为setup.py):

from distutils.core import setup
from Cython.Build import cythonize
 
setup(
  name = 'Dehaze',
  ext_modules = cythonize("dehaze.py"),
)

2.接着,再打开cmd,跳到该目录并执行如下命令:

python setup.py build_ext --inplace

其中,build是生成过程使用到的临时文件。xxx.c也是临时文件,可以打开看看传说中的D语言代码。

xxx.pyd是我们所需的文件。

pyd文件可以像平常一样使用。

生成文件xxx.cp35-win_amd64.pyd
手动将其重命名为xxx.pyd
注意:这里重命名时去掉“.cp35-win_amd64”不要更改前面的名字,否则不能正常引用
然后python环境下
import xxx #保证当前文件夹下没有xxx.py或者xxx.pyc
xxx.test()
 

比如这里我直接写了运行脚本run_xxx.py


from dehaze import *

if __name__ == '__main__':
    if args.input is None:
        dehaze('image/canon3.bmp')
    else:
        dehaze(args.input, args.output)

最后终端只需要执行下这个文件即可

最终分享给客户的文件就是

在linux环境下,对应的是dehaze.so

参考文章:

1.https://blog.csdn.net/qq_34106574/article/details/81166062

2.https://blog.csdn.net/g6uqwseseo/article/details/71439453?locationNum=11&fps=1

3.http://yshblog.com/blog/117

猜你喜欢

转载自blog.csdn.net/Gavinmiaoc/article/details/84340736
今日推荐