计算机发展至今已经有了机器语言、汇编语言和高级语言三种。高级语言被翻译成机器语言的过程分为两类,第一种是编译,第二种是解释。

编译执行的程序在执行前,会先通过编译器进行编译,把高级语言转变为机器语言,然后再执行;解释执行的程序在执行时,由解释器对程序逐行解释成机器语言,一边解释一边执行。

python是一种脚本语言,但python“翻译”的过程中,不仅需要解释还需要编译,这是因为python是一门基于虚拟机的语言。

一般我们都是说python通过python解释器解释执行,但实际上python是利用字节码虚拟机解释执行的。python先把代码(.py文件)编译成字节码,字节码存放在内存中的PyCodeObject对象中,然后将交给字节码虚拟机,然后虚拟机会从编译得到的PyCodeObject对象中一条一条执行字节码指令。当Python程序运行结束时,Python解释器则将PyCodeObject写入到.pyc文件中,.pyc文件在磁盘中保存。当python程序第二次运行时,首先程序会在硬盘中寻找.pyc文件,如果找到,则直接载入,不需要编译就能载入python虚拟机执行,否则就重复上面的过程。

所以,python是先编译然后再解释执行的。

py to exe用的是pyinstaller

重点!!!

py to exe的二进制特征:

py生成的可执行程序核心是一个bootloader,这个bootloader具有如下核心代码

字符串”_MEIPASS2”是pyinstaller使用的库,而pkg类型是安装文件类型。

我们也可以直接从strings中判断,可以发现py生成的可执行程序中含有大量”Py”开头的字符串:

exe to python

反编译pyinstaller 产生的可执行文件有很多种方式,大体上可以分为两个步骤,一是由可执行文件获取pyc(pyo)文件,二是由pyc(pyo)文件得到py文件。

反编译python生成的exe需要用到pyinstaller库里的archive_viewer.py脚本。archive_viewer.py一共有四个可用命令:

U: go Up one level

O : open embedded archive name

X : extract name

Q: quit

archive_viewer.py对可执行程序进行解包分析,这里涉及到了好几个类型的文件,简单说明一下:

py是源文件,

pyc是源文件编译后的文件

pyo是源文件优化编译后的文件

pyz是一个压缩包,包含程序运行需要的所有依赖

pyd是其他语言写的python库

我们需要关注的是”helloworld”和”PYZ-00.pyz”这两个文件。一般来说*.pyz,其中包含主程序引用到的所有库,可以提取.pyz文件然后继续使用archive_viewer.py解包分析;另一个是主程序对应的文件名的文件,其中会包含主程序。

使用x命令提取主程序,另存为helloworld.pyc:

在helloworld.pyc文件头,补充8个字节:

需要补充8个字节是因为pyinstaller编译成pyc时,会把pyc的magic value去掉。magic value一共8个字节,前四个对应于编译时所用python的版本,后四个对应于编译时间,比如python2.7 的03 f3 0d 0a 01 23 45 67,python3.4 的ee 0c 0d 0a 01 23 45 67。

最后使用easy python decompiler从pyc(pyo)文件得到py文件,直接将pyc文件拖拽进程序。

实践:

首先安装pyinstaller

pip install pyinstaller

我最后的安装路径C:\Users\用户名\AppData\Local\Programs\Python\Python39\Scripts

随便写一个py文件

#just a test

print("hello world!")

打包成exe命令

pyinstaller -F -w C:\Users\solitaryang\Desktop\testpy.py

可以看到exe出来了,用die看一下:

入口函数:

特征字符串:

我的archive_viewer.py位置:

C:\Users\solitaryang\AppData\Local\Programs\Python\Python39\Lib\site-packages\PyInstaller\utils\cliutils

提取出来的文件放在了C:\Users\用户名下

前后pyc文件对比:

前:

后:

对文件头进行修复,在前添加610D0D0A00000000C2F6EC6024000000

最后一步从pyc得到py文件,方法很多

1、https://tool.lu/pyc/用这个网站在线还原

2、使用uncompyle

3、使用其他工具,例如easy python decompiler

这里我用第二种方法试试

先安装pip installuncompyle6

说明:

-o后面可以加上文件路径,代表反编译文件输出的位置,“.”表示输出到当前文件夹

反编译成功后会返回“# Successfully decompiled file”

可以使用uncompyle6 --help查看其他参数

然后我发现我是3.9。。。

试了很多种方法都不适合3.9.。。版本太高不是啥好事

这里劝各位小伙伴,做实验的时候用低版本的python吧。。。

py-exe编译与反编译相关推荐

  1. C# SDK exe dll 防止反编译

    / C# SDK (Software Development Kit) exe dll 防止反编译 加密工具 dotNET Reactor 是一款强大的 .NET 代码保护和授权管理系统,安全可靠.简 ...

  2. Python程序编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  3. vs可以编译python_Python如何进行编译和反编译

    用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安 ...

  4. 谈谈Python的编译和反编译

    用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安 ...

  5. python源代码的后缀名是_Python代码编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  6. 【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译

    反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载; -- CSDN 下载地址 : http://download.csdn.net/detai ...

  7. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  8. 安卓apk的编译与反编译

    原文:https://blog.csdn.net/baidu_33870664/article/details/80186945 android基于java的,而java反编译工具很强悍,所以对正常a ...

  9. java反编译是什么_什么是Java代码的编译与反编译?

    Java代码的编译与反编译 2017-02-21 Hollis 数盟 一.什么是编译 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目标程序的动作. 编译就是把高级语言变 ...

最新文章

  1. nginx 官方手册 php,nginx + php 的配置
  2. Xcode自定义字体不能应用的原因
  3. TCP send 阻塞与非阻塞
  4. Aspect的简单方法拦截
  5. another app is currently holding the yum lock;waiting for it to exit...
  6. MATLAB xlswrite 写数据 到 Excel文件
  7. iOS - OC 与 Swift 互相操作
  8. Unity 游戏框架搭建 (五) 简易消息机制
  9. 多租户数据架构以及hibernate支持(Multi-TenantDataArchitecture)
  10. SpringBoot 任务调度(开发总结)
  11. 图像编码解码(I P B帧),数码相机成像原理
  12. java键盘事件无反应_键盘事件,没反应
  13. 1931CIE基础知识
  14. 摄像头自建html直播,H5代码实现调用本地摄像头实现实时视频以及拍照功能
  15. 一款简洁的导航网源码
  16. 利用VBA在Excel中批量画图
  17. echarts的中国地图,点击进入省级地图,点击省级地图,返回中国地图
  18. Ubuntu 安装 TP_LINK驱动 TL-WDN5200H 2.0无线网卡
  19. Java 校验注解的使用、自定义校验注解
  20. BGA锡球选择与PITCH的关系

热门文章

  1. 7-76 PAT考试日期 (5分)
  2. python matplotlib 画黑白的柱状图(论文专用)
  3. elasticsearch ES搜索权重设置(boost参数)
  4. B-样条基函数:计算实例
  5. LeetCode:96. Unique Binary Search Trees(找出独一无二搜索树)
  6. shuf 随机选取txt文件特定行数
  7. 如何用cmd配置mysql数据库密码_命令行修改MySQL数据库密码
  8. 《花开半夏》--3 对峙(2)
  9. JavaScript 三目运算符的注意点
  10. 电脑死机怎么办?试试这5个方法!