记一次python逆向:反编译pyinstaller打包生成的exe

首先声明一点,逆向这块我是纯小白,我是通过看各种博客,反复折腾才搞出来的,写的有错误的地方,还请各位大佬多多指正

0 前置条件

确认需要逆向的exe文件是不是通过pyinstaller打包的,如果不是,那么这个方法就是无效的

我们可以通过图标来确定,pyinstaller打包的图标一般如下两种

1 需要用到的环境及工具

(1)电脑需要有python环境,我用的是python3.9

(2)pyinstxtractor.py ---- 将.exe解包

官方GitHub地址 https://github.com/countercept/python-exe-unpacker/blob/master/pyinstxtractor.py

(3)uncompyle6 ---- .pyc转.py

# 安装可以加上清华镜像源,自行搜索安装即可
pip install uncompyle6

(4)WinHex ---- 16进制编辑(用其他也可以)

2 将exe文件进行解包

将pyinstxtractor.py文件和需要解包的exe文件(我这里叫xxxx.exx)放在同一个目录下,执行如下命令

python pyinstxtractor.py xxxx.exe

解包后会生成一个xxxx.exe_extracted文件夹,我们可以通过这个文件夹看到这个exe文件是通过什么版本的python打包的

可以看到,我这个exe文件是通过python3.8打包的,但具体是哪个版本的,就无法得知

在xxxx.exe_extracted文件中,我们只需要关注该目录下没有后缀名的文件和PYZ-00.pyz_extracted这个文件夹

没有后缀名的文件,在我这个例子中有两个: 1 和 struct

其中,这个1文件其实就是程序的入口文件,PYZ-00.pyz_extracted文件夹存放主程序的一些依赖库,包括自己写的

PYZ-00.pyz_extracted这个文件夹下的文件大概如下,分两种情况

1 文件都是以pyc结尾的,说明没有加密,我们可以用uncompyle6 将其反编译成.py文件(也就是源码)

2 文件都是以.pyc.encrypted 结尾的,说明经过了加密,感兴趣的可以研究如何解密,我这里就不说明了

3 将pyc文件转为py文件

将pyc文件转为py文件,最重要的是需要补全magic head。想要快速将pyc转为py文件,而不需要补全magic head,请直接看3.3节。

3.1 反编译程序入口文件

上面说过,在我这个例子中,1这个文件就是程序的入口文件,一般来说你的exe文件如果是demo.exe,那么你这个入口文件大概率是demo。

(1)重命名程序入口文件

上面说过1这个文件是没有后缀名的,需要给它加上.pyc的后缀名,变为1.pyc;同理,将struct文件改为struct.pyc

(2)用WinHex打开上面1.pyc 和 struct.pyc,对比字节码的差异,补全magic head

这里我就有点懵,因为我看其它博客struct.pyc文件打开后,第一行并不是E3开头,而是类似下面这种

这里无法根据struct.pyc进行补全,我又搜索其它博客,发现有人和我情况一样,struct.pyc打开直接就是E3开头,可惜没有人回答这个问题

不多说,直接上解决办法:在exe解包的目录下有一个base_library.zip压缩包,打开这个压缩包,随便找一个oyc文件,使用WinHex打开,这里我打开的是base_library中的abc.pyc文件

对比两个文件,发现 55 0d 0d 0a 01这第一行的字节码就是我们需要的magic head

我们直接把abc.pyc文件中的第一行复制,添加到1.pyc文件中的第一行

保存,然后用 uncompyle6 反编译

uncompyle6 -o 1.py 1.pyc

反编译后,没有报错,并且生成了1.py文件,打开1.pyc文件,能够看到源码,说明magic head是正确的

3.2 反编译依赖库

反编译程序入口后,我们可以看到,该程序依赖了一个demo的库,这个库肯定是作者自己写的

依赖的demo库在PYZ-00.pyz_extracted文件夹中可以找到,打开demo.pyc与1.pyc进行对比

这里我们可以发现,依赖库缺失的字节是在中间位置,这里我们看到缺少的是12-15位的四个字节 00 00 00 00

补全缺失的四个字节

保存,然后用 uncompyle6 反编译

uncompyle6 -o demo.py demo.pyc

反编译后,没有报错,并且生成了demo.py文件,打开demo.pyc文件,能够看到源码,说明我们补全的字节码是正确的

<think>嗯,用户问的是PyInstaller中使用--key参数报错的问题。首先,我需要确认用户的使用场景。PyInstaller的--key参数是用来加密生成Python字节码的,通常用于保护代码不被轻易反编译。用户可能在打包时想增加代码的安全性,但遇到了报错。 接下来,我要回忆PyInstaller的文档。得--key需要配合一个16字符的密钥使用,并且需要安装PyCrypto或者tinkersupport这些加密库。如果用户没有正确安装这些依赖,或者密钥格式不对,就会报错。 可能的错误原因有几个方面:第一,用户是否安装了正确的加密库?比如PyInstaller默认使用PyCrypto,但这个库已经不再维护,可能安装失败。用户可能尝试安装了pycryptodome作为替代,但没有正确配置。第二,密钥是否满足16字符的要求?如果密钥长度不对,或者包含不支持的字符,也会导致错误。第三,PyInstaller版本是否支持--key参数?旧版本可能有兼容性问题,需要确认用户是否用的是最新版本。 然后,我需要思考解决方案。首先建议用户检查密钥是否符合条件,然后确认依赖库是否正确安装。如果使用的是PyCrypto遇到问题,可以建议改用pycryptodome,并给出安装命令。同时,提醒用户注意Python版本和PyInstaller的兼容性,可能需要升级工具。最后,提供一个示例命令,让用户参考正确用法。 还要注意用户的系统环境,比如是否在虚拟环境中安装依赖,或者是否有权限问题导致库安装失败。另外,如果错误信息中有具体的提示,比如导入错误或密钥错误,需要根据不同的错误类型给出具体建议。用户可能没有看到详细的报错信息,所以建议他们提供错误日志以便进一步排查。 最后,整理这些思路,用清晰的中文分步骤解释可能的原因和解决方法,帮助用户逐步排除问题。确保回答结构清晰,用户能按照步骤检查和操作,解决报错问题。</think>在PyInstaller中使用`--key`参数进行加密时遇到报错,通常涉及以下几个关键原因及解决方法: --- ### 一、`--key`参数的作用 `--key`参数用于**加密Python字节码**(.pyc文件),通过AES算法保护代码,但需注意: - 仅加密字节码,原始脚本逻辑仍可能被逆向分析 - 必须配合16字符的密钥使用(如`--key 1234567890123456`) --- ### 二、常见报错原因及解决步骤 #### 1. **依赖库缺失** - ❌ 错误表现:`ImportError: No module named 'Crypto'` 或类似提示 - 🔧 解决方法: ```bash # 安装替代PyCrypto的库 pip install pycryptodome # 确认PyInstaller版本(需≥3.3) pip install --upgrade pyinstaller ``` #### 2. **密钥格式错误** - ❌ 错误表现:`ValueError: Key must be 16 characters long` - 🔧 解决方法: - 确保密钥为**16位ASCII字符**(例如`--key MySecureKey12345`) - 避免使用中文或特殊符号 #### 3. **Python版本兼容性** - ❌ 错误表现:`RuntimeError: Compression requires Python 3.6+` - 🔧 解决方法: - 确认Python版本≥3.6 - 使用虚拟环境测试(推荐): ```bash python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows ``` #### 4. **路径或权限问题** - ❌ 错误表现:`Permission denied` 或文件访问错误 - 🔧 解决方法: - 以管理员权限运行终端(Windows) - 避免路径包含空格或中文 --- ### 三、完整操作示例 ```bash # 安装依赖 pip install pyinstaller pycryptodome # 打包命令(注意密钥长度) pyinstaller --key MySecureKey12345 your_script.py ``` --- ### 四、高级排查 如果仍报错,尝试: 1. 通过`--log-level DEBUG`查看详细日志: ```bash pyinstaller --key YOUR_KEY --log-level DEBUG your_script.py ``` 2. 检查是否与其他参数冲突(如`--upx`需单独安装UPX工具) --- 请根据具体错误信息按上述步骤排查。若问题仍未解决,建议提供完整报错内容以便进一步分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值