python exe文件解包方法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

技术背景

目前针对Python中主流的加密方案有以下几种

序号工具方法描述优缺点
1Nuitka.py 文件先被转成了 .c 文件然后被编译成 .o 文件最后合并成 .bin 可执行文件从 bin 到 C 是不可逆的从 C 到 Python 也是不可逆的因此代码是安全的工作量小安全性高使用加密之后的Python便捷编译时间长过程复杂
2发行.pyc文件通过compileall模块将.py文件转为.pyc文件该文件是二进制无法直接看源代码而python解释器可以直接执行.pyc文件台兼容性好.py 能在哪里运行.pyc 就能在哪里运行解释器兼容性差.pyc 只能在特定版本的解释器上运行。有现成的反编译工具破解成本低
3代码混淆oxyrypyobfuscate让人看不懂代码移除注释和文档改变缩进在tokens中间加入一定空格重命名函数、类、变量在空白行插入无效代码提高了一点源码破解门槛。兼容性好只要源码逻辑能做到兼容混淆代码亦能只能对单个文件混淆无法做到多个互相有联系的源码文件的联动混淆
4py2exe将源码编译为 .pyc 文件加之必要的依赖文件一起打包成一个可执行文件。最终 py2exe 打包出的是二进制文件。直接打包成 exe方便分发和执行。破解门槛比 .pyc 更高一些兼容性差只能运行在 Windows 系统上。生成的可执行文件内的布局是明确、公开的可以找到源码对应的 .pyc 文件进而反编译出源码。
5Cython将 .py/.pyx 编译为 .c 文件再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows)生成的二进制 .so 或 .pyd 文件难以破解。同时带来了性能提升兼容性稍差对于不同版本的操作系统可能需要重新编译。虽然支持大多数 Python 代码但如果一旦发现部分代码不支持完善成本较高。
6Pyinstaller打包为exe文件将Python文件转换为exe文件以及dist文件夹和build文件夹如果要移植到其他电脑上运行也是只需要将这两个文件夹复制到对方电脑上即使对方没有python环境也可以运行程序具有较好的兼容性pyinstxtractor.py可以进行反编译

对于上述这些加密在工作中常见将一些Python写的脚本、程序使用Pyinstaller打包为exe文件的居多因为即使对方没有python环境也可以运行程序具有较好的兼容性。

想要了解这些脚本、程序的逻辑、对其功能进行分析最好的方法是其进行反编译解包。

解包思路

1.对exe文件进行解包

方法1使用pyinstxtractor.py
执行python pyinstxtractor.py <待解包文件名> 如果成功即可获得<待解包文件名>_extracted 文件夹。

方法2使用archive_viewer.py
执行python archive_viewer.py <待解包文件名> 会打印EXE文件中包含的所有文件信息
使用x <文件名>命令将想要提取出的文件提取出来q 命令退出。

区别

方法1 可以一次性提取出所有文件方法2只能逐个提取文件。但是在个人使用时同时执行时会提示python版本问题想要正常解包必须使用正确的python版本。
方法2 的成功率相对较高。可以先尝试用方法1失败后用方法2。

2.构建pyc文件

从步骤1中获得的文件是pyc文件我们还需要进一步反编译获得py文件。在将Python文件打包成exe文件的过程中会抹去pyc文件前面的部分信息所以我们在反编译之前需要检查并添加上这部分信息。抹去的信息内容可以从struct文件中获取

 可能会出现两种情况

 情况一struct 文件中 E3 前 有内容

 这种情况将struct 文件中E3 之前的 所有内容复制到目标文件 E3 之前。

 情况二struct 文件中 E3 前 无内容

 遇到这种情况后在前面步骤1中找到PYZ-00.pyz_extracted文件夹中任意一个pyc文件记住前面的4个字节在目标文件第一行输入前4个字节后续补0。

 将目标文件后缀名改为“.pyc”

3.对pyc文件进行反编译

安装uncompyle6后去dos界面输入uncompyle6 路径文件名.pyc > 文件名.py

没有报错就表示成功了。

 

 其他问题

 q1提示PYZ文件加密

在解包exe过程中会提示会出现PYZ中的文件无法正常提取archive_viewer.py或者提取出来后显示encryptedpyinstxtractor.py的问题

 针对这个问题可以使用上述方法重新反编译PYZ文件的加密密钥pyimod00_crypto_key.pyc文件就可以获得秘钥。

Pyinstxtractor不支持加密的pyz档案。目前可以使用下面的代码片段来解密pyz提取目录中的加密pyc。请注意下面的脚本是为在Python 2.7上运行而编写的可以在PyInstaller之前的版本上运行

 该脚本可以从任何Python版本反编译加密的pyc。但是您需要从下面的列表中适当地更改pyc头。具体的事项可以去访问pyinstxtractor说明文档Frequently Asked Questions · extremecoders-re/pyinstxtractor Wiki · GitHub

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python