我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中怎么实现编译和反编译

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中怎么实现编译和反编译

这篇文章将为大家详细讲解有关Python中怎么实现编译和反编译,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、用Pyinstaller打包python代码

1. 安装Pyinstaller

安装过程非常简单,在命令行中运行:

pip install pyinstaller

即可完成安装。

2. 打包代码

我写了一段简单的代码作为例子,为了更清晰地演示打包过程,我将main()函数写在了单独的文件中,并将mylib.py作为一个库引入。

#   mylib.py  #  import time  def myfunc():      now = time.time()      timetime_str = time.strftime("%Y-%m-%d %H:%M", time.localtime(now))      print('现在是' + time_str)      print("Have a nice day!")  #   main.py  #  import mylib  import os  if __name__ == "__main__":      mylib.myfunc()      os.system('pause')

这时只需要在命令行中运行:

pyinstaller.exe -F yourcode.py

即可。会看到一下输出:

PS D:\文档\tmp\test> pyinstaller.exe -F main.py  580 INFO: PyInstaller: 3.6  582 INFO: Python: 3.7.3  585 INFO: Platform: Windows-10-10.0.18362-SP0  592 INFO: wrote D:\文档\tmp\test\main.spec  596 INFO: UPX is not available.  611 INFO: Extending PYTHONPATH with paths  ['D:\\文档\\tmp\\test', 'D:\\文档\\tmp\\test']  612 INFO: checking Analysis  614 INFO: Building Analysis because Analysis-00.toc is non existent  614 INFO: Initializing module dependency graph...  620 INFO: Caching module graph hooks...  657 INFO: Analyzing base_library.zip ...  13893 INFO: Caching module dependency graph...  14161 INFO: running Analysis Analysis-00.toc  14233 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable    required by d:\programfiles\python\python.exe  15748 INFO: Analyzing D:\文档\tmp\test\main.py  15751 INFO: Processing module hooks...  15752 INFO: Loading module hook "hook-encodings.py"...  16003 INFO: Loading module hook "hook-pydoc.py"...  16011 INFO: Loading module hook "hook-xml.py"...  16916 INFO: Looking for ctypes DLLs  16917 INFO: Analyzing run-time hooks ...  16925 INFO: Looking for dynamic libraries  17373 INFO: Looking for eggs  17374 INFO: Using Python library d:\programfiles\python\python37.dll  17374 INFO: Found binding redirects:  []  17377 INFO: Warnings written to D:\文档\tmp\test\build\main\warn-main.txt  17447 INFO: Graph cross-reference written to D:\文档\tmp\test\build\main\xref-main.html  17506 INFO: checking PYZ  17507 INFO: Building PYZ because PYZ-00.toc is non existent  17508 INFO: Building PYZ (ZlibArchive) D:\文档\tmp\test\build\main\PYZ-00.pyz  18600 INFO: Building PYZ (ZlibArchive) D:\文档\tmp\test\build\main\PYZ-00.pyz completed successfully.  18637 INFO: checking PKG  18639 INFO: Building PKG because PKG-00.toc is non existent  18640 INFO: Building PKG (CArchive) PKG-00.pkg  22329 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.  22332 INFO: Bootloader d:\programfiles\python\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe  22334 INFO: checking EXE  22335 INFO: Building EXE because EXE-00.toc is non existent  22336 INFO: Building EXE from EXE-00.toc  22416 INFO: Appending archive to EXE D:\文档\tmp\test\dist\main.exe  22641 INFO: Building EXE from EXE-00.toc completed successfully.

你将在当前文件夹下看到如下文件:

D:.  │  main.py  │  main.spec  │  mylib.py  ├─build  │  └─main  │          Analysis-00.toc  │          base_library.zip  │          EXE-00.toc  │          main.exe.manifest  │          PKG-00.pkg  │          PKG-00.toc  │          PYZ-00.pyz  │          PYZ-00.toc  │          warn-main.txt  │          xref-main.html  └─dist         main.exe

其中dist文件夹中就是生成的exe文件。

直接双击exe文件就能正常运行了。

Python中怎么实现编译和反编译

但这篇文章的重点并不是介绍如何使用pyinstaller。此时,我又在思考,如此简单的打包过程究竟安全吗?打包成的exe文件会不会轻而易举地被反编译?

查阅了相关资料后发现,确实可能。

二、pyinstaller 的反编译过程

1. 下载并使用pyinstxtractor解包

我们第一步采用的工具是pyinstxtractor.py,可以将pyinstaller 生成的exe文件解包成pyc文件。

项目地址:

https://sourceforge.net/projects/pyinstallerextractor/

之后把这个文件复制到待解包exe同级目录下,运行如下命令:

python pyinstxtractor.py xx.exe

运行后生成xx.exe_extracted文件夹 ,里面有一堆dll ,pyd等文件,我们需要注意的是里面有一个xxx.exe.manifest文件,xxx可能与你的exe文件名不同,但这才是它的真实名字。然后找到一个叫xxx的没有后缀名的文件,它其实就是你之前打包的那个.py文件对应的pyc文件。

Python中怎么实现编译和反编译

找到一个叫xxx的没有后缀名的文件

我们还注意到此目录下还有一个PYZ-00.pyz_extracted文件夹,里面都是引入的依赖库,当然,我们自己写的mylib.py也在其中,它也是我们反编译的对象。

2. 反编译pyc文件

找到了pyc文件,下面自然就是对它进行解密了。pyc其实是python程序执行过程中产生的缓存文件,我们直接运行python代码时也会看到。对于这种格式的反编译是比较简单的,网上有许多工具,甚至还有很多在线工具。这里为了方便,我就采用了一款在线工具。附上链接:http://tools.bugscaner.com/decompyle/

但直接将我们找到的pyc文件上传会发现无法反编译。原因是什么呢?我们用十六进制编辑器(大家网上搜就行,我这里用的是wxMEdit)打开这个文件,与之前直接运行py文件生成的pyc文件比较。

我先来看一下main.pyc的区别,左边是我们解包出来的,右边是运行生成的。

Python中怎么实现编译和反编译

左边是我们解包出来的,右边是运行生成的

发现唯一的差别就是少了第一行16个字节(叫做 magic number 表示python的版本和编译时间),那我们把它加上是不是就能正常解析了呢?确实是这样,但没有原始pyc文件怎么办?我们再到xx.exe_extracted文件夹里找一找。会发现有一个叫struct的文件,我们给他加上后缀.pyc反编译试试。发现成功反编译出如下内容:

Python中怎么实现编译和反编译

struct反编译结果

这就说明它的 magic number 是正确的,那我们只要把它的前16个字节复制过去不就行了?我们再来试试,成了!main.py中的内容被成功反编译出来了。

Python中怎么实现编译和反编译

main.pyc反编译结果

下面同理也能反编译出mylib.py等依赖库中的内容,不过值得注意的是,网上很多教程都没有提到依赖库的pyc文件缺少的字节数与主程序的不同!

Python中怎么实现编译和反编译

左:struct文件 | 中:解包出的mylib.pyc | 右:正确的pyc文件

我们发现它不是缺少了16个字节,而是中间少了4个字节!那么,我们只需要把struct头部的16个字节覆盖掉mylib.pyc的前12个字节。

改好之后再进行反编译。

Python中怎么实现编译和反编译

mylib.pyc反编译内容

反编译成功!不过中文字符被解析成了Unicode编码,可以再使用相应工具转换。

可以看到,通过pyinstaller打包的exe,还是能被较为容易地反编译的。那么有加密打包的方法吗?其实pyinstaller本身就是支持加密的,下面就来说一说如何加密打包。

三、使用pyinstaller加密打包exe

其实只要在打包时加个key参数就能加密

pyinstaller.exe -F --key 123456 xxx.py

不过需要依赖pycrypto包,而python一般是不自带这个包的。因此需要我们手动安装。

1. 安装pycrypto包

原本安装过程应该很简单,通过pip就能安装。

pip install pycrypto

不过安装过程好像要调用VS编译器编译,这就造成了莫名其妙的问题,如果你在安装过程中没有报错,那么恭喜你,你可以跳过这部分了。

我在网上找了很多解决方法都没效,最后终于在StackOverflow上找到了一篇回答,完美解决了这个问题。原答案地址:https://stackoverflow.com/a/46921479/12954728

解决方法如下,前提是你电脑上安装了Visual studio

以我的vs2015为例

(1)在开始菜单中找到VS文件夹,用管理员身份运行这个”兼容工具命令提示符“

Python中怎么实现编译和反编译

(2)在你的VS安装目录下找到stdint.h这个文件,最好用everything搜索一下

Python中怎么实现编译和反编译

(3)输入set CL=-FI"你的路径\stdint.h"设置环境变量

(4)然后再执行pip install pycrypto就能成功安装了

Python中怎么实现编译和反编译

2. 使用pyinstaller加密打包

现在执行如下命令就能加密打包了。key后面为密钥可以随便输。

pyinstaller.exe -F --key 123456 xxx.py

3. 反编译测试

那么我们再来测试一下加密打包的exe还能不能被反编译。

再次执行pyinstxtractor.py

PS > python pyinstxtractor.py .\main-encrypt.exe    import imp  [*] Processing .\main-encrypt.exe  [*] Pyinstaller version: 2.1+  [*] Python version: 37  [*] Length of package: 5787283 bytes  [*] Found 63 files in CArchive  [*] Beginning extraction...please standby  [+] Possible entry point: pyiboot01_bootstrap  [+] Possible entry point: main  [*] Found 136 files in PYZ archive  [!] Error: Failed to decompress Crypto, probably encrypted. Extracting as is.  [!] Error: Failed to decompress Crypto.Cipher, probably encrypted. Extracting as is.  [!] Error: Failed to decompress __future__, probably encrypted. Extracting as is.  [!] Error: Failed to decompress _compat_pickle, probably encrypted. Extracting as is.  [!] Error: Failed to decompress argparse, probably encrypted. Extracting as is.  [!] Error: Failed to decompress ast, probably encrypted. Extracting as is.  [!] Error: Failed to decompress base64, probably encrypted. Extracting as is.  [!] Error: Failed to decompress bdb, probably encrypted. Extracting as is.  [!] Error: Failed to decompress bisect, probably encrypted. Extracting as is.  [!] Error: Failed to decompress bz2, probably encrypted. Extracting as is.  [!] Error: Failed to decompress calendar, probably encrypted. Extracting as is.  [!] Error: Failed to decompress cmd, probably encrypted. Extracting as is.  [!] Error: Failed to decompress code, probably encrypted. Extracting as is.  [!] Error: Failed to decompress codeop, probably encrypted. Extracting as is.

这次下面输出了一长串Error,看来确实是被加密了。

我们再来看一看文件夹。

Python中怎么实现编译和反编译

Python中怎么实现编译和反编译

main-encrypt.exe_extracted文件夹里似乎没什么变化,但PYZ-00.pyz_extracted文件夹里全是加密文件,应该是无法反编译了。

不过对外层文件夹中的main文件进行同样操作后依然是可以反编译出源码的。

Python中怎么实现编译和反编译

关于Python中怎么实现编译和反编译就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中怎么实现编译和反编译

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中怎么实现编译和反编译

这篇文章将为大家详细讲解有关Python中怎么实现编译和反编译,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、用Pyinstaller打包python代码1. 安装Pyinstaller安
2023-06-16

Python文件反编译怎么实现

本篇内容介绍了“Python文件反编译怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!python的便利性,使得如今许多软件开发者、黑
2023-06-21

Python中怎么实现反编译可执行文件exe

实现反编译可执行文件exe的方法有两种:静态反编译和动态反编译。静态反编译:静态反编译是通过对可执行文件的二进制代码进行分析和逆向工程,将其转换为高级语言代码或者汇编代码。常用的静态反编译工具有IDA Pro、Ghidra等。使用这些工具
2023-10-22

golang怎么防止反编译

在Go语言中,可以采取一些措施来防止反编译,以下是一些常见的方法:使用代码混淆:通过对代码进行混淆,使得反编译后的代码难以理解。可以使用工具如ProGuard来进行代码混淆。使用反调试技术:在代码中添加反调试的逻辑和检测,当检测到程序正在被
2023-10-22

winform怎么防止反编译

要防止WinForm应用程序的反编译,可以使用以下方法:使用代码混淆技术:使用代码混淆工具来混淆和加密应用程序的源代码,使其难以被理解和反编译。使用加密算法:使用加密算法对敏感的代码和数据进行加密,防止被反编译获取。使用反调试技术:在应用程
2023-10-26

python如何实现微信小程序反编译

这篇文章主要介绍“python如何实现微信小程序反编译”,在日常操作中,相信很多人在python如何实现微信小程序反编译问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何实现微信小程序反编译”的疑
2023-06-25

eclipse怎么安装jad反编译

要在Eclipse中安装JAD反编译工具,可以按照以下步骤进行操作:1. 下载JAD反编译工具的JAR文件。可以在网上搜索"download jad"来找到可用的JAD版本,例如JADClipse。2. 将下载的JAD JAR文件拷贝到Ec
2023-09-07

linux怎么反编译class文件

在Linux上,可以使用Java反编译工具来反编译class文件。以下是使用jd-gui工具来反编译class文件的步骤:1. 首先,确保已经安装了Java Development Kit(JDK)和Java Runtime Environ
2023-09-23

Java中怎么实现条件编译

本篇文章给大家分享的是有关 Java中怎么实现条件编译,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译
2023-06-17

android编译qemu怎么实现

要在Android上编译QEMU,您可以按照以下步骤进行操作:设置环境:确保您的系统已经安装了必需的软件和工具,例如GCC编译器、make、git和Python等。此外,您还需要安装Android的开发套件,包括Android SDK和ND
android编译qemu怎么实现
2023-10-28

Android编程之防止反编译的实现方法

本文实例讲述了Android编程之防止反编译的实现方法。分享给大家供大家参考,具体如下: 1. 判断程序是否运行在模拟器上boolean isRunningInEmualtor() {boolean qemuKernel = false;P
2022-06-06

java怎么防止反编译加密

在Java中防止反编译加密的方法可以通过以下几种方式来实现:使用混淆技术:通过重命名变量、方法和类名,删除无用的代码和注释,以及添加无效的代码等方式,增加反编译的难度。使用代码加密技术:可以使用加密算法对关键代码进行加密,然后在运行时解密,
2023-10-26

golang怎么防止反编译执行

要防止Golang代码被反编译执行,可以采取以下措施:使用代码混淆:通过修改变量名、函数名等代码标识符,增加代码的复杂性,使反编译者难以理解代码逻辑。使用加密算法:对关键代码或敏感数据进行加密处理,只在运行时解密,这样即使被反编译,也无法
2023-10-26

exe怎么反编译为.py文件

本文小编为大家详细介绍“exe怎么反编译为.py文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“exe怎么反编译为.py文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先准备:pyinstxtractor
2023-07-05

python源码怎么编译

python 源码无需编译,因为它是一种解释型语言。然而,在某些情况下,可以采取以下步骤来编译 python 源码:使用 python 编译器 (py_compile)使用第三方编译器 (如 cython)使用 python 虚拟机 (py
python源码怎么编译
2024-05-22

c语言程序怎么反编译

如何反编译 c 语言程序:使用反编译工具(如 ghidra、ida pro 或 hopper)反编译;加载可执行文件;选择反编译选项,以将编译后的指令转换为汇编语言;分析汇编语言代码,以推断 c 语言源代码;识别函数和数据类型,以重构源代码
c语言程序怎么反编译
2024-05-21

java怎么有效防止反编译

要有效防止Java程序的反编译,可以采取以下几种方法:使用代码混淆工具:代码混淆工具可以将Java源代码中的变量名、函数名等重要信息进行混淆,使得反编译后的代码变得难以理解和分析。常用的Java代码混淆工具有ProGuard、yGuard等
java怎么有效防止反编译
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录