目录
  • 技术背景
  • 解包思路
    • 1.对exe文件进行解包
    • 2.构建pyc文件
    • 3.对pyc文件进行反编译
  • 其他问题
    • 总结

      技术背景

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

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

      总结

      到此这篇关于python中exe文件解包方法的文章就介绍到这了,更多相关python exe文件解包内容请搜索本网站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本网站!

      您可能感兴趣的文章:
      • 将python文件打包exe独立运行程序方法详解
      • python脚本打包后无法运行exe文件的解决方案
      • Python中.py文件打包成exe可执行文件详解
      • Python打包exe文件一步步图解明了简单
      • Python程序打包成可执行文件exe详解流程