[Python逆向] 逆向Pyinstaller打包的exe文件源码及保护

news2025/1/19 14:21:11

Python逆向Pyinstaller打包的exe文件源码及保护

写在前面

我们都知道可以使用Pyinstaller库可将.py文件编译成.exe文件运行,这篇文章我们就从将脚本编译成.exe并将.exe的源码内容反编译出源文件,再顺便谈谈如何防止被逆向。

环境工具

Python 3.6:https://www.python.org/downloads/release/python-360/
Pyinstaller库:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller==4.0

pyinstxtractor.py:下载地址:https://sourceforge.net/projects/pyinstallerextractor/
WinHex编辑器:下载地址:https://down.52pojie.cn/Tools/Editors/WinHex_v19.9.zip
uncompyle库:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple uncompyle6==3.9.0

tinyaes库:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tinyaes==1.0.3

编译程序

检查环境

python -V

在这里插入图片描述

编写脚本

测试脚本.py

import datetime

# 函数
def test():
    print("====反编译源码的测试脚本====")
    input_text = input("请输入你想要打印的内容:")

    # 打印格式化时间和用户输入的内容
    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ") + input_text)

if __name__ == '__main__':
    # 调用
    test()

打包程序

首先安装打包程序所使用的库pyinstaller,这里用了清华源并且指定使用了4.0版本库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller==4.0

找到脚本所在的文件夹,我的是C:\Users\YRJ\Desktop\a cd 到此路径下,并输入以下打包命令:

Pyinstaller -F 测试脚本.py

命令执行完毕后,会看到completed successfully.字段,表示.exe文件生成成功,在dist文件夹中。
在这里插入图片描述

逆向过程

首先我们下载反编译工具pyinstxtractor.py与我们要反编译的.exe文件放入同一个工作目录下,如下图所示:
在这里插入图片描述

然后我们继续在命令行cddist文件夹,输入以下命令并执行:

python pyinstxtractor.py 测试脚本.exe

执行完毕,看到Successfully字样,会生成测试脚本.exe_extracted文件夹,如下图所示:

在这里插入图片描述

进入该文件夹,里面有许许多多后缀为.dll.pyd的文件,还有一个名为PYZ-00.pyz_extracted的文件夹,这个文件夹里放的是程序引入的依赖库,如果你引入过自己其他的.py文件,就可以用类似的方法将依赖的.py文件反编译出来,如下图所示:
在这里插入图片描述

在目录中我们要找到struct和与你的.exe文件同名的文件。如下图所示:
在这里插入图片描述

这两个文件是否带.pyc后缀和你使用的pyinstxtractor.py工具版本有关系。V2.0以前的版本,会生成两个不带.pyc后缀的文件,手动为它添加.pyc后缀即可。如下图所示:

在这里插入图片描述

当前这个测试脚本.pyc文件是没有Magic Number的,我们需要根据Python版本自行补全,由上图可知打包此程序的Python版本为3.6,我们接下来就需要查3.6版本的Magic Number

  • Python3.3 以下版本: 只有Magic Number和四位时间戳
  • Python3.3(包含) - Python3.7(不包含)版本: 4个字节的magic num + 8个字节的时间戳,这个时间戳可以全是0。
  • Python3.7(包含)版本: 4个字节的magic num + 4个字节的空白数据 + 4个字节的时间戳 + 4个字节的文件长度,除了magic num,其它数据可以全是0。

查Magic Number

方法一:

查通用对照表:

enum PycMagic {
    MAGIC_1_0 = 0x00999902,
    MAGIC_1_1 = 0x00999903,
    MAGIC_1_3 = 0x0A0D2E89,
    MAGIC_1_4 = 0x0A0D1704,
    MAGIC_1_5 = 0x0A0D4E99,
    MAGIC_1_6 = 0x0A0DC4FC,

    MAGIC_2_0 = 0x0A0DC687,
    MAGIC_2_1 = 0x0A0DEB2A,
    MAGIC_2_2 = 0x0A0DED2D,
    MAGIC_2_3 = 0x0A0DF23B,
    MAGIC_2_4 = 0x0A0DF26D,
    MAGIC_2_5 = 0x0A0DF2B3,
    MAGIC_2_6 = 0x0A0DF2D1,
    MAGIC_2_7 = 0x0A0DF303,

    MAGIC_3_0 = 0x0A0D0C3A,
    MAGIC_3_1 = 0x0A0D0C4E,
    MAGIC_3_2 = 0x0A0D0C6C,
    MAGIC_3_3 = 0x0A0D0C9E,
    MAGIC_3_4 = 0x0A0D0CEE,
    MAGIC_3_5 = 0x0A0D0D16,
    MAGIC_3_5_3 = 0x0A0D0D17,
    MAGIC_3_6 = 0x0A0D0D33,
    MAGIC_3_7 = 0x0A0D0D42,
    MAGIC_3_8 = 0x0A0D0D55,
    MAGIC_3_9 = 0x0A0D0D61,
};

例如: Python 3.6的Magic Number,执行后可以得到0x0A0D0D33,则对应二进制码是33 0D 0D 0A

方法二(推荐):

struct.pyc文件:
struct.pyc文件使用WinHex编辑器打开,它的前4位字节就是magic num与方法一的二进制码相同。如下图所示:
在这里插入图片描述

再打开测试脚本.pycstruct.pyc对比头内容确定要添加的内容,如下图所示:
在这里插入图片描述

改pyc文件

选中struct.pyc中框选的头内容,右键编辑→复制选块→十六进制数值。330D0D0A7079693001010000
在这里插入图片描述

打开测试脚本.pyc,直接在前面添加,上面复制的十六进制数值330D0D0A7079693001010000,光标点击第一个字母E右键编辑→剪贴板数据→粘贴→ASCII Hex→确定,然后保存即修改完毕!如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

转换源码

安装.pyc.py所使用的库uncompyle6,这里用了清华源并且指定使用了3.9.0版本库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple uncompyle6==3.9.0

找到测试脚本.pyc所在的文件夹,cd 到此路径下,并输入以下打包命令:

uncompyle6 -o 测试脚本.py 测试脚本.pyc

命令执行完毕后,会看到successfully字段,表示.py源码文件已成功生成在同路径下。
在这里插入图片描述

比对源码

通过对程序本来的源码逆向得来的源码对比可知:简单的源码上基本一直,复杂写的源码上可能会有一点点瑕疵。

单就此次逆向的程序而言,比程序原本的源码就少了源码的注释,多了系统反编译时相关环境及版本的注释。
在这里插入图片描述

通过命令python 测试脚本.py执行逆向得来的源码,测试通过,发现功能正常。
在这里插入图片描述

防止逆向

pyinstaller打包

首先安装加密打包程序所使用的库tinyaes,这里用了清华源并且指定使用了1.0.3版本库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tinyaes==1.0.3

找到脚本所在的文件夹,我的是C:\Users\YRJ\Desktop\c cd 到此路径下,并输入以下打包命令:

pyinstaller -F 测试脚本.py --key 123456

命令执行完毕后,会看到completed successfully.字段,表示.exe文件生成成功,在dist文件夹中。
在这里插入图片描述

接着就安装前面写的逆向过程执行命令python pyinstxtractor.py 测试脚本.exe,结果只有入口脚本反编译成功,被依赖的脚本均被加密,无法直接被反编译,如下图所示:
在这里插入图片描述

PYZ-00.pyz_extracted文件夹内可以看到,抽取的中间结果变成了.pyc.encrypted格式,无法直接被反编译,未加密和加密的相关对比,如下图所示:

在这里插入图片描述

常规手段就无法直接反编译了。这个时候若还想反编译就需要底层的逆向分析研究或将pyinstaller的源码完整研究一遍,了解其加密处理的机制,看看有没有逆向的可能。

nuitka打包

cython打包

参考文章:

Python 反编译:pyinstxtractor工具和uncompyle6库的使用:https://blog.csdn.net/qq_63585949/article/details/126706526

Python Uncompyle6 反编译工具使用与Magic Number详解:https://blog.csdn.net/Zheng__Huang/article/details/112380221

python Magic Number对照表以及pyc修复方法:https://www.cnblogs.com/Here-is-SG/p/15885799.html

Pyinstaller打包的exe之一键反编译py脚本与防反编译:https://blog.51cto.com/u_11866025/5714478#pyc_223

winhex无法创建请确定文件夹存在文件没有受到保护:https://zhidao.baidu.com/question/135115576.html

Python 反编译:pycdc工具的使用:https://blog.csdn.net/qq_63585949/article/details/127080253

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

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

相关文章

(一)MicroPython——WIFI点灯

目录 学习目标 成果展示 硬件知识 代码 总结 学习目标 成果展示 预备知识 代码 总结 学习目标 我们今天来学习有关MicroPython的知识点,相比于用C语言来开发,MicroPython有许多的优点,比如可以交互,有大量的库可以调…

Allegro如何把快速BUS组高亮成不同颜色操作指导

Allegro如何把快速BUS组高亮成不同颜色操作指导 在做PCB设计的时候,会需要把BUS组高亮成不同颜色,方便评估与布线,Allegro支持快速把BUS高亮成不同的颜色,如下图 具体操作如下 打开颜色管理器出现颜色管理器

1576_AURIX_TC275_MTU控制与状态寄存器

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 在这一页之前,连续有好几个寄存器都是预留的,因此可以直接跳过。访问使能寄存器的功能,从描述看其实是非常熟悉的,因为这个描述的模板可以从…

Java多线程:线程通信:生产者 和 消费者 || 顺序打印

Java多线程:线程通信:生产者 和 消费者 || 顺序打印 每博一文案 靠谱,是最高级的聪明:师父说:人生一回,道义一场。你对人对事的态度,藏着你一生的福报。 千金难买好人缘,人活的就是…

Android编译Skia库

Android编译Skia库 本文档提供两种方法编译Skia库 使用aosp源码进行编译使用skia源码进行编译 两种编译方法都可以编译,并且都可以使用在多个平台中,且可以使用在不同Android版本中 使用aosp源码编译 第一步是拿到aosp的源码.因为写这篇教程,使用的是msm8996的源码,因此,我…

Armitage图形化前端

开源免费图形前端 ● 作者自称是众多不会使用metasploit的安全专家之一(命令行) ● MSF基于命令行,缺少直观的GUI图形用户接口 Armitage只是调用MSF的漏洞利用能力 ● Armitage的每一个GUI操作都可以对应MSF中的一条命令 红队团队合作模拟…

OSCP vulhub LORD OF THE ROOT: 1.0.1

vulhub LORD OF THE ROOT: 1.0.1靶场信息&安装Description一、信息收集第一种ssh爆破第二种猜二、漏洞探测三、漏洞利用四、提权第二种方法:udf提权第三种缓冲区溢出提权靶场信息&安装 地址:https://www.vulnhub.com/entry/lord-of-the-root-10…

APSIM练习:向管理组件添加额外规则

“标准”作物管理组件没有提供很多选项来决定何时播种作物——很可能应该考虑一系列额外的种植规则(例如,土壤是否足够干燥以驱动拖拉机过去?),并且在播种时应采取额外措施(例如添加一些肥料)。…

Tofu目标识别跟踪模块介绍

1.简介Tofu3 是多波段视频物体识别跟踪模块,支持可见光视频与红外视频的输入,支持激光补光变焦自适应控制,支持视频下的多类型物体检测、识别、跟踪等功能。产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能,提供…

服务器防勒索病毒场景分析经验分享

服务器防勒索病毒 l 场景描述 互联网飞速发展,各企业均搭建了自己的服务器。包括文件服务器、代码服务器、业务系统服务器、数据库服务器等。目前大多数企业使用的服务器系统以Windows Server和Linux(Centos)居多,但随着国产操作…

python从入门到实践————图形界面(上)

系列文章目录 文章目录系列文章目录前言窗体组件窗体显示显示窗体文本显示项目实践总结前言 图形用户接口(Graphical User Interface,GUI)是人机交互的重要技术手段,在Python中利用tkinter模块就可以方便地实现图形界面。 在你p…

每日一题:Leetcode203 移除链表元素

文章目录 系列:链表专练 语言:java & go 题目来源:Leetcode203 移除链表元素 难度:简单 考点:头结点 && 虚拟头结点 思路和参考答案文章目录题目描述思路java参考代码go参考代码:题目描述 给…

xcelium——重要特性——提高编译仿真性能

以下图片来自于CadenceTECHTALK研讨会 解决编译仿真的瓶颈问题,提高整体性能 影响performance的因素 xcelium版本access rwccoverage收集snapshot过大,加载时间过长,可通过Zlib加快加快snapshot加载 编译/仿真添加选项: -new…

如何检查自己电脑是否被攻击了?

数据来源 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 通过系统命令排查账户安全 query user # 查看当前登录账户 lo…

21.字符串的概念,字符串的可修改性

字符串和指针 字符串的概念: 字符串就是以 ‘\0’ 结尾的若干字符的集合。字符串的地址,是第一个字符的地址。可以定义一个字符指针变量保存字符串的地址。比如: char* shelloworld"; 字符串的存储形式:数组、文字常量区、…

靶机测试haclabs-no_name

靶机地址https://www.vulnhub.com/entry/haclabs-no_name,429/靶机测试nmap扫描└─$ nmap -T5 -A 192.168.1.100 -oA hl-portsStarting Nmap 7.92 ( https://nmap.org ) at 2023-01-12 11:16 CST Nmap scan report for 192.168.1.100 Host is up (0.00040s latency). Not show…

获工信部认可!腾讯牵头的《零信任系统技术规范》入选工信部百项团标应用示范

近日,工信部发布《关于公布2022年团体标准应用示范项目的通告》,由腾讯安全牵头起草,公安部第三研究所、国家计算机网络应急技术处理协调中心、中国移动设计院等业内16家零信任厂商、测评机构及用户联合编制的中国第一部《零信任系统技术规范…

Webpack搭建本地服务器

1、开启本地服务器 1.1、为什么要搭建本地服务器? 目前我们开发的代码,为了运行需要有两个操作: 操作一:npm run build,编译相关的代码;操作二:通过live server或者直接通过浏览器&#xff0…

【ROS】—— 机器人系统仿真 —URDF语法 (十三)

文章目录前言1. 概述1.1 概念1.2 作用1.3 相关组件1.3.1 URDF1.3.2 RViz1.3.3 gazebo1.4 准备2. URDF集成Rviz基本流程2.1 创建功能包,导入依赖2.2 编写 URDF 文件2.3 在 launch 文件中集成 URDF 与 Rviz3. URDF语法详解3.1 robot3.2 link3.3 joint3.4 URDF练习3.5 …

Lock锁原理解析【Android进阶】

Lock锁原理解析【Android进阶】 Lock简介 Lock接口位于J.U.C下locks包内,其定义了Lock应该具备的方法。 Lock 方法签名: void lock():获取锁(不死不休,拿不到就一直等)boolean tryLock():获…