PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译


Posted in Python onApril 15, 2020

环境:

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,运行一下这个脚本:

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

可以看到,脚本正常运行了。

为了演示,我们把下面的脚本新建到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 because out00-Analysis.toc is non existent
505 INFO: Initializing module dependency graph...
521 INFO: Initializing module graph hooks...
521 INFO: Analyzing base_library.zip ...
6269 INFO: running Analysis out00-Analysis.toc
6269 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
required by d:\anaconda3\python.exe
6956 INFO: Caching module hooks...
6956 INFO: Analyzing E:\t\main.py
6956 INFO: Loading module hooks...
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\main\warnmain.txt
7751 INFO: Graph cross-reference written to E:\t\build\main\xref-main.html
7767 INFO: checking PYZ
7767 INFO: Building PYZ because out00-PYZ.toc 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 because out00-PKG.toc 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\Windows-64bit\run.exe
9954 INFO: checking EXE
9954 INFO: Building EXE because out00-EXE.toc is non existent
9954 INFO: Building EXE from out00-EXE.toc
9954 INFO: Appending archive to EXE E:\t\dist\main.exe
9954 INFO: Building EXE from out00-EXE.toc completed successfully.

E:\t>

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

最终在目录下生成build、disk文件夹。其中exe文件在disk中。运行正常。如下图:

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

三、反编译Pyinstaller打包的exe

这样的exe已经可以被迁移到别的电脑上使用了,如果是为了方便其他电脑使用,到这一步就已经结束了。但有时候,我们可能是把这个功能给很多人用,但如果不想开源或者被别人破解,到这一步是还不够的。

因为到这一步的exe是可以被别人反编译出源码的。

此处用到的工具:

exe反编译工具:pyinstxtractor.py:点击此处去下载

pyc反编译工具:Easy Python Decompiler 或者在线反编译pyc。

将pyinstxtractor.py放到exe文件相同目录,执行以下cmd命令:

python pyinstxtractor.py main.exe

如果成功执行,将在同目录下生成新的反编译文件夹——main.exe_extracted,如下图:

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

同时,我们可以在下图圈起来的路径下,找到当时我们exe引入的mylib模块,其为pyc格式。 

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

pyc格式的文件,反编译起来就非常简单了。用前文提供的工具或者网上找个在线的分分钟反编译出来,我们看下反编译的结果:

#!/usr/bin/env python
# visit http://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(
        '\xe6\x8f\x90\xe7\xa4\xba\xef\xbc\x9a\xe8\xbe\x93\xe5\x85\xa5"q"\xe9\x80\x80\xe5\x87\xba\xe7\xa8\x8b\xe5\xba\x8f\xe3\x80\x82\n\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe4\xb8\x80\xe4\xb8\xaa\xe6\x95\xb0\xe5\xad\x97\xef\xbc\x9a')
      if num.lower() == 'q':
        break
      num = float(num)
      print(num)
    except:
      None
      None
      None
      print(
        '\xe8\xbe\x93\xe5\x85\xa5\xe7\x9a\x84\xe6\x95\xb0\xe5\xad\x97\xe4\xb8\x8d\xe6\xad\xa3\xe7\xa1\xae\xef\xbc\x81')
      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
"""
 
from distutils.core import setup
from Cython.Build import cythonize
 
setup(
 name = 'any words.....',
 ext_modules = cythonize(["mylib.py",]
 ),
)

然后执行以下cmd命令:

python build_pyd.py build_ext --inplace

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

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

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

此时,我们删除build、disk文件夹,重复步骤二,再次编译为exe即可。

注意:编译需要相关的VC环境,因为python3.5是基于 VS14版本的,所以我这里安装的也是。不安装是无法编译的。

可以验证一下:

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

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

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

PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

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

到此这篇关于PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译的文章就介绍到这了,更多相关PyInstaller Python文件打包为exe内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
python读写csv文件并增加行列的实例代码
Aug 01 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
基于python读取.mat文件并取出信息
Dec 16 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
python实现简单学生信息管理系统
Apr 09 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
Python任务调度模块APScheduler使用
Apr 15 #Python
Python实现代码块儿折叠
Apr 15 #Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 #Python
如何提高python 中for循环的效率
Apr 15 #Python
ipython jupyter notebook中显示图像和数学公式实例
Apr 15 #Python
解决 jupyter notebook 回车换两行问题
Apr 15 #Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 #Python
You might like
PHP 上传文件的方法(类)
2009/07/30 PHP
php检测文件编码的方法示例
2014/04/25 PHP
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
以windows service方式运行Python程序的方法
2015/06/03 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
python爬取哈尔滨天气信息
2018/07/14 Python
Python @property使用方法解析
2019/09/17 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
Python __slots__的使用方法
2020/11/15 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
应用电子专业学生的自我评价
2013/10/16 职场文书
机械系大学毕业生推荐信
2013/11/27 职场文书
银行职业规划书范文
2013/12/28 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
2014年三万活动总结
2014/04/26 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
2015年除四害工作总结
2015/07/23 职场文书
给领导敬酒词
2015/08/12 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
Python绘制散乱的点构成的图的方法
2022/04/21 Python
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS