PyInstaller将Python⽂件打包为exe后如何反编译(破解源码)以
及防⽌反编译
环境:
win7+python3.5(anaconda3)
理论上,win7及以上的系统和python任意版本均可。
⼀、基础脚本
⾸先我们构建⼀个简单的脚本,⽐如输出⼀串数字、⽂本之类,这⾥我们输出⼀串⽂字的同时计算⼀下3次⽅好了。
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 29 09:18:13 2018
@author: Li Zeng hai
"""
def test(num):
print('num={n}, {n}^3={n2}'.format(n=num, n2=num**3))
if __name__ == '__main__':
while 1:
try:
num = input('提⽰:输⼊"q"退出程序。\n请输⼊⼀个数字:')
if num.lower() == 'q':
break
num = float(num)
print(num)
except:
print('输⼊的数字不正确!')
continue
test(num)
把这段脚本保存为mylib.py,运⾏⼀下这个脚本:
可以看到,脚本正常运⾏了。
为了演⽰,我们把下⾯的脚本新建到main.py脚本⽂件中,并且从mylib中引⼊测试函数。
# -*- coding: utf-8 -*-
from mylib import *
while 1:
try:
num = input('提⽰:输⼊"q"退出程序。\n请输⼊⼀个数字:')
if num.lower() == 'q':
break
num = float(num)
print(num)
except:
print('输⼊的数字不正确!')
continue
test(num)
⼆、使⽤PyInstaller打包为exe
使⽤如下命令,将其打包为单⼀exe(去掉-F则不是单⼀exe)
pyinstaller -F main.py
打包过程如下:
E:\t>pyinstaller -F main.py
505 INFO: PyInstaller: 3.3.1
505 INFO: Python: 3.5.5
505 INFO: Platform: Windows-7-6.1.7601-SP1
505 INFO: wrote E:\t\main.spec
505 INFO: UPX is not available.
505 INFO: Extending PYTHONPATH with paths
['E:\\t', 'E:\\t']
505 INFO: checking Analysis
505 INFO: Building Analysis is non existent
505 INFO: Initializing module
521 INFO: Initializing module
521 INFO: Analyzing base_library.zip ...
6269 INFO: running
6269 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by d:\
6956 INFO: Caching
plsql执行存储过程6956 INFO: Analyzing E:\t\main.py
6956 INFO: Loading
6956 INFO: Loading module hook "hook-pydoc.py"...
6956 INFO: Loading module hook "hook-xml.py"...
7283 INFO: Loading module hook "hook-encodings.py"...
7533 INFO: Looking for ctypes DLLs
7549 INFO: Analyzing run-time hooks ...
7549 INFO: Looking for dynamic libraries
7720 INFO: Looking for eggs
7720 INFO: Using Python library d:\anaconda3\python35.dll
7720 INFO: Found binding redirects:
[]
7720 INFO: Warnings written to E:\t\build\
7751 INFO: Graph cross-reference written to E:\t\build\main ref-main.html
spring后端面试题7767 INFO: checking PYZ
7767 INFO: Building PYZ is non existent
7767 INFO: Building PYZ (ZlibArchive) E:\t\build\main\out00-PYZ.pyz
8345 INFO: Building PYZ (ZlibArchive) E:\t\build\main\out00-PYZ.pyz completed successfully.
8345 INFO: checking PKG
8345 INFO: Building PKG is non existent
8345 INFO: Building PKG (CArchive) out00-PKG.pkg
9954 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully.
9954 INFO: Bootloader d:\anaconda3\lib\site-packages\PyInstaller\bootloader\ 9954 INFO: checking EXE
9954 INFO: Building EXE is non existentpython安装教程win7
9954 INFO: Building EXE
9954 INFO: Appending archive to EXE E:\t\
9954 INFO: Building EXE completed successfully.
E:\t>
redis数据类型以及应用场景最终在⽬录下⽣成build、disk⽂件夹。其中exe⽂件在disk中。运⾏正常。如下图:
三、反编译Pyinstaller打包的exe
这样的exe已经可以被迁移到别的电脑上使⽤了,如果是为了⽅便其他电脑使⽤,到这⼀步就已经结束了。但有时候,我们可能是把这个功能给很多⼈⽤,但如果不想开源或者被别⼈破解,到这⼀步是还不够的。
因为到这⼀步的exe是可以被别⼈反编译出源码的。
此处⽤到的⼯具:
exe反编译⼯具::点击此处去下载
pyc反编译⼯具:Easy Python Decompiler 或者在线反编译pyc。
将pyinstxtractor.py放到exe⽂件相同⽬录,执⾏以下cmd命令:
python pyinstxtractor.
如果成功执⾏,将在同⽬录下⽣成新的反编译⽂件夹——_extracted,如下图:
同时,我们可以在下图圈起来的路径下,到当时我们exe引⼊的mylib模块,其为pyc格式。
pyc格式的⽂件,反编译起来就⾮常简单了。⽤前⽂提供的⼯具或者⽹上个在线的分分钟反编译出来,我们看下反编译的结果:
#!/usr/bin/env python
# visit tool.lu/pyc/ for more information
'''
Created on Wed Aug 29 09:18:13 2018
@author: Li Zeng hai
'''
def test(num):
print('num={n}, {n}^3={n2}'.format(n=num, n2=num ** 3))
if __name__ == '__main__':
while None:
try:
num = input(
' e6 8f 90 e7 a4 ba ef bc 9a e8 be 93 e5 85 a5"q" e9 80 80 e5 87 ba e7 a8 8b e5 ba 8f e3 80 82\n e8 af b7 e8 be 93 e5 85 a5 e4 b8 80 e4 b8 aa e6 95 b0 e5 ad 97 ef bc 9a')      if num.lower() == 'q':
break
num = float(num)
print(num)
except:
None
None
None
print(
' e8 be 93 e5 85 a5 e7 9a 84 e6 95 b0 e5 ad 97 e4 b8 8d e6 ad a3 e7 a1 ae ef bc 81')
continue
可以看到,基本上完美的把源码反编译出来了。其中涉及到中⽂的地⽅,会因为编码问题有所改变。但是⾮中⽂部分,⼏乎⼀模⼀样。
就问你怕不怕
四、将脚本编译为pyd以防⽌反编译
好怕怕,哈哈。
如何解决呢,可以考虑将模块py⽂件编译为动态链接库,这样破解难度将⼤⼤增加。其中,在python⾥,pyd格式即动态链接库。使⽤cython即
可编译,如果是anaconda是⾃带,python有的可能不带cython,安装即可:
pip install Cython
我们在main.py所在的⽂件夹新建py⽂件,在此处我命名为build_pyd.py,其内容如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 29 13:33:20 2018
@author: Li Zeng hai
"""
import setup
from Cython.Build import cythonize
setup(
name = '',
ext_modules = cythonize(["mylib.py",]
),
)
程序员的思维很可怕
然后执⾏以下cmd命令:
下载chatgpt中文版python build_pyd.py build_ext --inplace
运⾏过程及⽣成结果如下图,其中红框的pyd⽂件即编译好了。因为我是64位的系统和python,所以会⽣成amd64后缀,我们把这个删掉重命名为mylib.pyd即可。
注:当同时存在mylib.pyd和mylib.py时,引⼊优先级是pyd>py,所以不⽤移除py⽂件,默认引⼊时就是pyd。
此时,我们删除build、disk⽂件夹,重复步骤⼆,再次编译为exe即可。
注意:编译需要相关的VC环境,因为python3.5是基于 VS14版本的,所以我这⾥安装的也是。不安装是⽆法编译的。
可以验证⼀下:
再次反编译后,原来的路径E:\t\_extracted\out00-PYZ.pyz_extracted之下,已经不到mylib.pyc了。
因为他已经不是可以直接反编译出来的⽂件了。
那么他在哪呢,他是作为pyd存在于上层⽬录中了。如下图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。