写在前面:写这篇文章,第一个是因为公司开发的exe的确也有这个问题,其次呢,也是因为本人对Python也比较有兴趣,在此推写一个解决办法,也希望可以帮助到一些朋友,或者说让一些朋友学习到些什么。
一、问题说明
对于Pyinstaller进行打包的程序,有怎么一个东西可以进行反编译 ---- pyinstxtractor.py !
下载地址:https://github.com/extremecoders-re/pyinstxtractor
操作如下:
-
将下载好的 pyinstxtractor.py 文件与打包好的 exe 放到同目录下
注:此处的 exe 为编写的测试 exe,代码如下:
import threading
import time
from tkinter import *
class Main:
def __init__(self):
self.root = Tk()
self.time = StringVar()
self.gui()
self.root.mainloop()
def gui(self):
label = Label(self.root, textvariable=self.time, width=30, height=3)
label.pack()
timer = threading.Timer(1, self.thread)
timer.start()
def thread(self):
current = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
self.time.set(current)
timer = threading.Timer(1, self.thread)
timer.start()
if __name__ == '__main__':
Main()
打包命令如下:
pyinstaller main.py -w -F
打包成功后,运行:
- 使用以下命令,将上述的 exe 反编译(exe 与 pyinstxtractor.py 同目录下运行 cmd)
python pyinstxtractor.py main.exe
在生成的目录中,可以找到如下文件 ---- main.pyc
此时,随意找一个 pyc 反编译网站,即可看到源码(中文可能有少许编码问题,但绝大部分代码均可还原)
可使用此网站:https://tool.lu/pyc
可以看到,此处源码还原度极高,可以说对于项目、个人和公司而言都是一件细思极恐的问题!!!
二、解决办法
在此处,本人使用的方法是:利用 cpython 包,先将 py 文件编译成 pyd 文件,再重新打包。注:
1. cpython 为 python 的一个
2. pyd 文件,相当于 c 文件编译生成的 dll 文件,只能进行反汇编,而非反编译,安全性极大提高
3. 在相同目录下同时存在相同名字的 py 文件和 pyd 文件,python 会自动引用 pyd 文件,而非 py 文件
使用 cpython 前,有一个前置条件:电脑需装有 visual c++ 桌面开发环境(默认安装即可)
推荐下载地址:Visual Studio 和 C++ Community(社区版)
安装完成后,在 pycharm 中下载 cpython 包(此处我使用的是清华镜像)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Cython
下载完毕后,在刚刚的源代码 main.py 的同级目录下创建 setup.py
from distutils.core import setup
from Cpython.Build import cythonize
setup(ext_modules=cythonize("main.py"))
同时,将 main.py 中的主运行代码调整到新的文件 test.py
接着在 pycharm 命令行中运行命令:python setup.py build_ext --inplace
同时将生成的 pyd 文件名字改为 main.pyd
此时,删除 dist、build 文件夹和其它多余的文件,重新打包
对于 test.exe 进行反编译
进入反编译的文件中,即可找到 main.pyd
至此,对于主要源码的反编译保护基本实现完成。