【实践】Python文件打包为exe后防止反编译

原文链接:

https://www.jb51.net/article/184725.htm

将脚本编译为pyd以防止反编译

如何解决呢,可以考虑将模块py文件编译为动态链接库,这样破解难度将大大增加。其中,在python里,pyd格式即动态链接库。使用cython即可编译,如果是anaconda是自带,python有的可能不带cython,安装即可:

1

pip install Cython

我们在main.py所在的文件夹新建py文件,在此处我命名为build_pyd.py,其内容如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# -*- coding: utf-8 -*-

"""

Created on Wed Aug 29 13:33:20 2018

@author: Li Zeng hai

"""

  

from distutils.core import setup

from Cython.Build import cythonize

  

setup(

 name = 'any words.....',

 ext_modules = cythonize(["mylib.py",]

 ),

)

然后执行以下cmd命令:

1

python build_pyd.py build_ext --inplace

注意:编译需要相关的VC环境,因为python3.9是基于 VS15版本的,所以我这里安装的也是。不安装是无法编译的。不然会出现报错error:Unable to find vcvarsall.bat 

 文章链接:

https://blog.csdn.net/TaiBai_435_/article/details/121990608

运行过程及生成结果如下图,其中红框的pyd文件即编译好了。因为我是64位的系统和python,所以会生成amd64后缀,我们把这个删掉重命名为mylib.pyd即可。

注:当同时存在mylib.pyd和mylib.py时,引入优先级是pyd>py,所以不用移除py文件,默认引入时就是pyd。

此时,我们删除build、disk文件夹

使用如下命令,将其打包为单一exe(去掉-F则不是单一exe)

pyinstaller -F mylib.py

 就能直接引用pyd文件打包发布exe文件,但是在我这里出现文件缺失的错误:

ValueError: Module file F:\python项目\mylib.py is missing

这里需要注意的是程序的__main__入口只能有一个,如果源py文件中有定义main入口,需要注释掉并调整代码缩进,否则通过main.py调用pyd文件遇到if name == ‘main':之后的代码都不会运行。并且需要将源py文件头部import部分全部复制到main.py文件头部

import win32gui
import win32api
import win32con

import mylib
if __name__ == '__main__':
 mylib()

再次用命令打包

pyinstaller -F main.py

 完美解决!


可以验证一下:

再次反编译main.exe后,原来的路径E:\t\dist\main.exe_extracted\out00-PYZ.pyz_extracted之下,已经找不到mylib.pyc了。

因为他已经不是可以直接反编译出来的文件了。

那么他在哪呢,他是作为pyd存在于上层目录中了。如下图:

pyd的反编译难度是相当高的,至此,就大功告成了!