【实践】Python文件打包为exe后防止反编译
原文链接:
将脚本编译为pyd以防止反编译
如何解决呢,可以考虑将模块py文件编译为动态链接库,这样破解难度将大大增加。其中,在python里,pyd格式即动态链接库。使用cython即可编译,如果是anaconda是自带,python有的可能不带cython,安装即可:
1 |
|
我们在main.py所在的文件夹新建py文件,在此处我命名为build_pyd.py,其内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
然后执行以下cmd命令:
1 |
|
注意:编译需要相关的VC环境,因为python3.9是基于 VS15版本的,所以我这里安装的也是。不安装是无法编译的。不然会出现报错error:Unable to find vcvarsall.bat
文章链接:
运行过程及生成结果如下图,其中红框的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的反编译难度是相当高的,至此,就大功告成了!