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':breaknum = float(num)print(num)except:print('输入的数字不正确!')continuetest(num)

把这段脚本保存为mylib.py,运行一下这个脚本:

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

为了演示,我们把下面的脚本新建到main.py脚本文件中,并且从mylib中引入测试函数。


# -*- coding: utf-8 -*-from mylib import *while 1:try:num = input('提示:输入"q"退出程序。\n请输入一个数字:')if num.lower() == 'q':breaknum = float(num)print(num)except:print('输入的数字不正确!')continuetest(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 executablerequired 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>

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

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

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

此处用到的工具:

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

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

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

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

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

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':breaknum = float(num)print(num)except:NoneNoneNoneprint('\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 cythonizesetup(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。

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

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

可以验证一下:

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

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

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

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

三.猜你喜欢

  1. Python 条件推导式
  2. Python 列表推导式
  3. Python 字典推导式
  4. Python 函数声明和调用
  5. Python 不定长参数 *argc/**kargcs
  6. Python 匿名函数 lambda
  7. Python return 逻辑判断表达式
  8. Python 字符串/列表/元组/字典之间的相互转换
  9. Python 局部变量和全局变量
  10. Python type 函数和 isinstance 函数区别
  11. Python is 和 == 区别
  12. Python 可变数据类型和不可变数据类型
  13. Python 浅拷贝和深拷贝
  14. Python 文件读写操作
  15. Python 异常处理
  16. Python 模块 import
  17. Python __name__ == ‘__main__’详细解释
  18. Python 线程创建和传参
  19. Python 线程互斥锁 Lock
  20. Python 线程时间 Event
  21. Python 线程条件变量 Condition
  22. Python 线程定时器 Timer
  23. Python 线程信号量 Semaphore
  24. Python 线程障碍对象 Barrier
  25. Python 线程队列 Queue – FIFO
  26. Python 线程队列 LifoQueue – LIFO
  27. Python 线程优先队列 PriorityQueue

未经允许不得转载:猿说编程 » Python 线程池 ThreadPoolExecutor(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

封装之详细详解

1.属性私有,get/set 2.封装:数据的隐藏 3.该漏漏,该藏藏:程序要求高内聚、低耦合,高内聚指类的内部数据操作细节自己完成,低耦合是提供少量方法供外部使用 package com.wuming.oop.demo04; //类 private…

BugkuCTF-MISC题神秘的文件

下载文件file.rar 解压后有个flag.zip与一个logo.png图片,点击flag.zip,发现为明文攻击 由于明文需要与加密文件相同类型的格式,所以将logo.png压缩为.zip格式 发现不可明文,后来发现通过winrar工具压缩为.zip格式可成功明文 得…

云计算的概念 - 初识云计算知识专栏(1)

戳蓝字“CSDN云计算”关注我们哦!作者:云说君来源:Cloud云说云计算的概念云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络&#xf…

C语言 数组下标越界 - C语言零基础入门教程

目录 一.数组下标越界简介 1、什么是数组访问越界?2、访问越界会出现什么结果? 二.数组下标越界案例三.防止数组下标越界方法四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.数组下标越界简介 1、什么是数组访问越界…

idea快捷键之记录

1.ctrlaltv补齐下面左边的. new A(); 2.altinsert是getter、setter、构造方法等快捷键 3.ctrlh在实体类按,显示继承关系

BugkuCTF-MISC题神奇宝贝

压缩包有两个文件,但是在解压的时候报错 用010editor打开,发现报错 同时发现文件尾部是504B,说明这是一个zip文件,把文件头修改为504B0304后可以解压出压缩包和一个图片 后来才知道,这是 《精灵宝可梦》 里的精灵未知图腾,拥有2…

云漫圈 | 寻找无序数组的第k大元素

戳蓝字“CSDN云计算”关注我们哦!作者:小灰来源:程序员小灰本期封面作者:泰勒太乐————— 第二天 —————题目是什么意思呢?比如给定的无序数组如下:如果 k6,也就是要寻找第6大的元素&a…

继承之详细讲解

代码结构 package com.wuming.oop2.demo05; //person 人 父类 public class Person {//继承:java只有单继承,没有多继承,extends修饰public int money10_0000_0000;private int money120;public int getMoney1() {return money1;}public void setM…

C语言 数组内存溢出 - C语言零基础入门教程

目录 一.数组内存溢出简介二.数组内存溢出实例三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.数组内存溢出简介 溢出:想象一个桶,桶的容积是有限的,你装满了水以后,如何还要往里面装&#xf…

BugkuCTF-MISC题乌云邀请码

下载文件,解压后得到一张图片 方法一: 通过zsteg直接得到flag 方法二: 放入Stegsolve查看 发现红绿蓝plane0 的最上边都有一排小黑点儿,很可疑 选择Analyse 的Data Extract进行分析 勾选红绿蓝的0层,选BGR模式&…

趣挨踢 | 关于遗留代码的那些事儿

戳蓝字“CSDN云计算”关注我们哦!来自:程序员最幽默(ID:humor1024)【1】当我不小心打开了遗留代码,世界从我眼前消失了。【2】当我试图破译遗留代码的时候【3】当我尝试修复遗留代码,却永远找不…

全网最细之super讲解

1.super调用父类构造方法且必须出现在方法内第一行 2.super必须只能出现在子类的方法或者构造方法中 3.super和this不能同时存在 vs this: 代表的对象不同: this:本身 super:父类 前提: this:没有继续也可以使用 super&a…

C语言 数组下标越界和内存溢出区别 - C语言零基础入门教程

目录 一.数组下标越界和内存溢出简介二.数组下标越界和内存溢出区别三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.数组下标越界和内存溢出简介 **溢出本义是算术溢出(arithmetic overflow),**指算术计算结果无法在一定范围内表…

重写详细讲解

重写:需要有继承关系,子类重写父类的方法! 1.方法名必须相同 2.参数列表必须相同 3.修饰符:范围可以扩大但不能缩小:public>protected>default>private 4.抛出异常:范围可以被缩小&#xff0c…

云计算演进历程与模式 - 初识云计算知识专栏(2)

戳蓝字“CSDN云计算”关注我们哦!云计算演进历程云计算产生背景云计算的产生是需求推动、技术进步、商业模式转变共同促进的结果。需求推动指的是政企客户低成本且高性能的信息化需求;人用户的互联网、移动互联网应用需求强烈,追求更好用户体…

BugkuCTF-MISC题细心的大象

下载文件file.zip 直接解压出错,通过binwalk -e file.zip分离出文件夹_file.zip.extracted 得到一张图片,通过binwalk -e 1.jpg分离出文件夹_1.jpg.extracted 得到.rar压缩包,打开需要密码,通过爆破找不到密码 查看1.jpg图片属性&…

C语言 数组长度计算 - C语言零基础入门教程

目录 一.计算数组长度 1.经典案例2.计算数组长度 二.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.计算数组长度 1.经典案例 /******************************************************************************************/ //Author:猿说…

BugkuCTF-MISC题想蹭网先解开密码

下载文件wifi.cap 先通过crunch命令先生成字典 crunch 11 11 -t 1391040%%%% -o password.txt 输入aircrack-ng wifi.cap 输入3,因为第三个存在握手包 输入aircrack-ng -e D-Link_DIR-600A -b BC:F6:85:9E:4E:A3 -w /root/文档/CTF题目/CTF02/MISC/想蹭网先解开密…

云要闻 | 华为助力5G;青云云资源价格全面下调;神州数码签订云计算服务合同

戳蓝字“CSDN云计算”关注我们哦!Hello,everyone:1月7日,星期一CSDN云要闻时间:嗨,大家好,偶是“CSDN 云计算”微信公众号新晋成员一枚,人称“要闻君”。精神满满的周一,…

C语言 十进制和十六进制相互转换 - C语言零基础入门教程

目录 一.十进制和十六进制区别 1、基数不同2、有效字符不同3、用途不同 二.十进制转十六进制三.十六进制转十进制四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.十进制和十六进制区别 1、基数不同 十进制满10进1; 十六进制满F…