python逆向-逆向pyinstaller打包的exe程序反编译获取源代码

Pyinstaller

pyinstaller 是一个用于将 Python 程序打包成独立可执行文件的工具,能够在没有 Python 解释器的情况下运行。 Python 脚本转换为 Windows、macOS 和 Linux 操作系统上的可执行文件。

把Python项目打包成exe非常简单。

#安装pyinstaller
pip install pyinstaller#打包
pyinstaller your_script.py

有时候为了恢复一部分源码,我们将以前前编译好的exe反编译成py文件。

在反编译前,我们要确定是Python编译的 exe项目。

Exeinfo PE

Exeinfo PE 是一款查看 PE 文件信息的工具,可以查看 EXE/dll 文件的编译器信息、是否加壳、入口点地址、输出表/输入表等等 PE 信息,帮助开发人员对程序进行分析和逆向。Exeinfo PE 还可以提取PE文件中的资源,可以提取图片、EXE、压缩包、MSI、SWF等等资源

使用类似的查壳工具可以查看程序是不是 pyinstaller 打包,确定是 pyinstaller 打包后就可以使用下面的方法进行反编译了
打开软件后直接将需要逆向的程序拉到软件上即可
在这里插入图片描述

exe反编译

拉取 pyinstxtractor.py
git clone https://github.com/countercept/python-exe-unpacker使用 Python 执行pyinstxtractor.py脚本,便可以对指定的 exe 程序进行反编译。
python pyinstxtractor.py main.exe

编译完成后同目录下会出现一个xxx.exe_extracted的目录,进入目录后可以看到同 exe 程序名的一个文件。由于我们反编译的 Python 版本与程序 Python 版本不同,导致反编译出来的程序没有携带 .pyc后缀,需要我们自己手动加上后缀,如下图修改成main.pyc
在这里插入图片描述
修改后缀
在这里插入图片描述

给pyc文件添加文件头

pyinstaller 打包后会去掉文件头部的 magic number,此时反编译出来的 pyc 文件都是缺少 magic number 值的,会导致后面我们将 pyc 文件反编译为 py 文件时出现问题,需要我们手动补上缺失的部分。

这里使用WinHex20,WinHex20是一款非常知名的16进制编辑器软件,使用该软件能够快速帮助用户编辑二进制、十六进制、乱码等文件,非常方便。

使用 WinHex20 打开 main.pyc文件。
在这里插入图片描述

打开“main.exe_extracted"文件夹下的PYZ-00.pyz_extracted文件夹,使用 WinHex20 随便打开其中一个pyc文件,将其头部复制到main.pyc的头部。可以看到上面修改的头部就是下面这里复制过去的。修改后记得保存文件!

在这里插入图片描述

使用pycdc反编译pyc文件

在网上下载好pycdc之后,将修改后的main.pyc文件和pycdc.exe放在同目录下

pycdc.exe main.pyc>main.py

在这里插入图片描述

等待执行成功之后在文件夹内会出现main.py

在这里插入图片描述
然后就可以使用编辑器阅读了,但是可能会出现中文编码错误的情况,如下:

在这里插入图片描述

原因:反编译工具在还原时,有时不会自动将这些字节解码回原始的 Unicode 字符串,而是直接以十六进制转义序列的形式显示出来。
大数据量的情况下直接让ai写个脚本处理替换一下就行!

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

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

相关文章

【SQL】-- sql having 和 where 的 区别

HAVING 和 WHERE 都是用来筛选数据的,但它们的应用场景有所不同。WHERE:用于筛选行数据,通常在 FROM 子句之后执行。它在分组操作 (GROUP BY) 之前应用,用来筛选出符合条件的记录。示例:SELECT name, age FROM employe…

MySQL,SQL Server,PostgreSQL三种数据库各自的优缺点,分别适用哪些场景

MySQL的优缺点及适用场景优点开源免费,社区版可商用,成本低。轻量级,安装配置简单,适合中小型项目。读写性能优异,尤其在OLTP(在线事务处理)场景下表现突出。支持主从复制、分片等扩展方案&…

Java 类加载机制双亲委派与自定义类加载器

我们来深入解析 Java 类加载机制。这是理解 Java 应用如何运行、如何实现插件化、以及解决一些依赖冲突问题的关键。一、核心概念:类加载过程一个类型(包括类和接口)从被加载到虚拟机内存开始,到卸载出内存为止,它的整…

Kaggle项目实践——Titanic: Machine Learning from Disaster

泰坦尼克号沉船事件是机器学习领域最经典的入门项目之一。Kaggle 上的 Titanic: Machine Learning from Disaster 竞赛,被无数人称为“机器学习的 Hello World”。 一、数据导入与清洗:让数据从 “杂乱” 变 “干净” 机器学习模型就像 “挑食的孩子”…

Qt C++ 复杂界面处理:巧用覆盖层突破复杂界面处理难题​之二

接上一篇,继续探索“覆盖层”的使用方法。 五、覆盖层进阶交互:从 “能绘制” 到 “好操作”​ 基础的绘制功能只能满足 “看得见” 的需求,实际开发中还需要 “能操作”—— 比如选中线条修改颜色、按 Delete 键删除线条、鼠标 hover 时高亮…

神经网络构成框架-理论学习

一、神经网络的基本组成与分类 1.1 神经网络的核心组成部分 神经网络是现代人工智能的基石,其设计灵感来源于生物神经系统的信息处理方式。作为工程师,了解神经网络的基本组成部分对于构建和优化模型至关重要。一个典型的神经网络主要由以下几个关键部分…

从0开始开发app(AI助手版)-架构及环境搭建

架构选择 前端React Native 后端Firebase 原因 环境准备 安装node 安装JDK 命令行工具:Node.js command prompt命令行查询Javav版本:javac -version使用nrm工具切换淘宝源:npx nrm use taobao安装yarn,替代npm下载工具&#x…

【性能测试】Jmeter工具快速上手-搭建压力测试脚本

🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 概念 性能测试是软件测试的重要分支,核心目标是通过模拟真实业务场景和负载压力,评估系统在不同条件下的性能表现,发现系统性…

oracle里的int类型

oracle里的int类型 在 ANSI SQL 标准 中,INTEGER 和 SMALLINT 是定义好的精确数值类型,但它们的 “长度”或“大小”并不是通过 (N) 括号来指定的(如 INT(4)),这一点与 MySQL 等数据库的非标准扩展完全不同。 SMALLI…

前端学习之后端java小白(二)-sql约束/建表

一、约束SQL约束(Constraints)是用于限制表中数据的规则,确保数据的完整性和准确性。以下是主要的SQL约束类型: 主要约束类型: 1. NOT NULL 约束: 确保列不能包含空值 CREATE TABLE users (id INT NOT NULL,name VARC…

OpenCV:图像金字塔

文章目录一、什么是图像金字塔?二、图像金字塔的核心操作:采样与逆采样1. 向下采样(pyrDown):从高分辨率到低分辨率步骤1:高斯滤波步骤2:删除偶数行与偶数列OpenCV实战代码效果特点2. 向上采样&…

LVS与Keepalived详解(一)负载均衡集群介绍

文章目录前言一、什么是LVS?二、四层(L4)负载均衡的最佳解决方案是什么?2.1解决方案分类与对比(负载均衡的三种方式介绍)2.1.1 硬件负载均衡 (Hardware Load Balancer)2.1.2 软件负载均衡 (Software Load B…

消息队列-kafka完结

基本概念和操作 基本概念 简单概念:::color4 Broker:如果将kafka比喻成数据仓库网络,那么Broker就是网络中的仓库节点,比如快递站,在该节点内可以独立运行,并且多个Broker可以连接起来,构建kafka集群Topic&…

Chromium 138 编译指南 Windows篇:环境变量配置与构建优化(三)

引言配置,往往决定成败。在软件开发的世界里,环境变量就像是一位无声的指挥家,默默地协调着各个组件的协同工作。对于Chromium 138这样一个拥有数千万行代码的超大型项目而言,正确的环境变量配置更是编译成功的关键所在。也许您曾…

LabVIEW加载 STL 模型至 3D 场景 源码见附件

LabVIEW 中 STL 模型的导入与 3D 场景显示,基于示例代码逻辑,结合格式兼容性、功能实现步骤及多样化显示方式,适用于三维可视化温控、机械零件模拟等场景。 1示例代码 NI 社区案例 “Add an STL file to 3D scene using LabVIEW” 提供了经…

硅基计划3.0 Map类Set类

文章目录一、二叉搜索树(排序树)1. 概念初识2. 模拟实现1. 创建搜索树节点2. 查找指定元素是否存在3. 插入4. 删除二、Map类1. put——设置单词以及其频次2. get——获取单词频次3. getOrDefault——获取单词频次或返回默认值4. remove——删除单词频次信…

LeetCode 刷题【73. 矩阵置零】

73. 矩阵置零 自己做 解&#xff1a;标记消除 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {vector<bool> x(matrix.size(), false); //要置0的行vector<bool> y(matrix[0].size(), false); //…

Unity学习----【进阶】TextMeshPro学习(一)--基础知识点

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.导入TextMeshPro 对于新创建的工程&#xff0c;可以直接在这里导入TMP必要的资源&#xff08;上面&#xff09;&#xff0c;以及TMP的实例和扩展&#xff08;下面&#xff09; 导入之…

BigDecimal(用于处理超出double范围的浮点数)

BigDecimal 是 Java 中 java.math 包提供的高精度十进制浮点数类&#xff0c;专为解决基本类型&#xff08;float/double&#xff09;的精度缺陷而设计&#xff0c;广泛用于金融、科学计算等对精度要求极高的场景。以下从核心特性、使用方法、常见问题对比、注意事项等方面详细…

Nginx 优化

文章目录1、隐藏版本号2、修改用户与组3、缓存时间4、日志切割5、连接超时6、更改进程数7、配置网页8、防盗链1、隐藏版本号 隐藏nginx的版本号&#xff0c;为了防止恶意用户利用已知漏洞进行攻击 ## 查看版本号 curl -I http://192.168.10.23方法一&#xff1a;修改配置文件…