在这里分享一些技巧和经验给大家。辛苦撰文分享,转载或引用请保留本文作者信息及文章链接。

作者的环境:

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的反编译难度是相当高的,至此,就大功告成了!

超详细Pyinstaller打包exe+反编译Pyinstaller打包的exe教程+防止反编译教程相关推荐

  1. 2020.2Kali_Linux(超详细❤亲测❤)下载(附下载好的网盘资源)及安装教程

    2020.2Kali_Linux(超详细❤)下载(附下载好的网盘资源)及安装教程 链接:https://pan.baidu.com/s/1A59vRnEkKuI7CAivbXZsGA 提取码:whfm ...

  2. 【超详细】Consul的安装的使用附多环境配置(傻瓜式教程)

    一.Consul概述 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul 的方案更"一站式" ...

  3. [超详细图文]小米/MIUI12开发版/安卓10通用magisk/面具安装EdXposed框架教程(以红米K20为例)

    MIUI12开发版安装EdXposed框架(以红米K20为例) MIUI12开发版通用安装EdXposed框架教程 0.做好备份 1.确认你的MIUI是开发版并解锁BL.开启Root权限 2.安装Ma ...

  4. Python反编译pyinstaller打包的exe文件 从0开始(未加密篇)

    因为pyinstaller方便.兼容性相对较好,所以我们会经常见到一些用pyinstaller打包的Python程序,在这里我们了解一下如何对这些打包好的exe文件进行反编译(即反编译出.py文件), ...

  5. Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)

    继上一篇文章创建了项目后,本章我们进行项目的打包工作. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 打包步骤 1 准备环境 1.1 安装`PyInsta ...

  6. python反编译Pyinstaller打包的可执行文件

    背景:最近在帮朋友写一款类似抢票的脚本,朋友有好几个脚本了,但是效果不理想,想让我帮忙,由于这种需要对接口进行详细了解,有些事件没有条件去抓包,然后我就对朋友已有的几个脚本动了心思.首先像这种爬虫类小 ...

  7. Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)

    继上一篇文章打包后,发现包太大了,我们现在开始进行瘦身优化. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 不想细看的朋友 可以直接跳到 最后 方法对比 ...

  8. pyinstxtractor.py 的改进 - 反编译pyinstaller生成exe的工具

    编写历程 使用网上的pyinstxtractor.py提取PyInstaller生成的exe文件, 发现无法用uncompyle6反编译提取的pyc文件, 报错. 对比原先的pyc文件, 和提取的文件 ...

  9. Android反编译apk修改版本号重新打包签名详细教程(超详细)

    文章目录 一.反编译工具介绍 1:apktool 获取资源文件 2:dex2jar(源码文件获取) 3:jd-gui 查看APK中classes.dex转化成出的jar文件,即源码文件 二.apkto ...

最新文章

  1. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】...
  2. Build Docker image of a Python Flask app【转载】
  3. WINDOWS SERVER 2003 DHCP服务器全攻略
  4. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载
  5. oracle数据集成产品,甲骨文推出Oracle数据集成产品
  6. java移动接口发短信_天天都会写接口,但它的用途和好处有多少人能说得清楚?...
  7. 常用的python内置方法
  8. hibernate教程笔记3
  9. 解决安卓中页脚被输入法顶起的问题
  10. 手机4k屏幕测试软件,手机4K屏、2K屏、1080p屏对比测试!惊叹
  11. MDPI期刊-引用文献格式-调整记录
  12. php 获取客户端IP
  13. 手机淘宝的flexible设计与实现
  14. 〖Python WEB 自动化测试实战篇⑦〗- 实战 - selenium的基本元素操作与键盘鼠标模拟事件操作
  15. 梯度类算法原理:最速下降法、牛顿法和拟牛顿法
  16. 别让自己 “墙” 了自己
  17. FAQ02【Hive】:Hive连接后出现一堆乱七八糟的日志
  18. SQL语句 存在就更新不存在就插入
  19. 高中数学必修5知识点:第二章数列
  20. 基于STM32L431设计的云端绿化管理系统(ESP8266+阿里云物联网平台)

热门文章

  1. Dynamic Bone ——Unity 3D动态骨骼插件
  2. 关于Windows Server自动重启,并出现日志报错WHEA-Logger 47错误解决方案
  3. 背影,触碰了谁的灵魂
  4. mybatis WARN No appenders could be found for logger的解决方法
  5. html标签验证百度搜索,如何验证百度站长平台(百度搜索资源平台)?
  6. Hyperion 数据源简介
  7. sony xz1c android 10,小屏旗舰再现江湖,索尼XZ1c曝光
  8. MYSQL之ifnull(),nullif(),isnull()的用法
  9. 【洛谷4657】[CEOI2017] Chase(一个玄学的树形DP)
  10. TPA测试项目管理系统-测试问题管理