记录一次反编译pyInstaller打包的python脚本

  • 一次偶然,我在群里看到有人分享了一个脚本, 尝试运行此脚本显示如下图,可以看得出来这个exe程序是用python打包的。
    记录一次反编译pyInstaller打包的python脚本

  • 用“python打包”这几个关键字在网上搜索了一下,发现一般都是用pyInstaller工具打包成单独的exe程序,为了确认下这个脚本是否也用pyInstaller工具打包,我打开IDE, 搜索字符串pyinstaller,找到了以下信息,可以判定是pyinstaller打包。记录一次反编译pyInstaller打包的python脚本

  • 然后又在网上搜了一下,找找有没有反编译python打包之类的文章,不出所料有很多,一般大家都是用工具来提取源码,我依葫芦画瓢,自己亲自动手实验下能否提取。

  • 首先把工具找齐,有archive_viewer.py或pyinstxtractor.py脚本,以及二进制工具010Edit。
    archive_viewer.py在github上有,链接:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py
    使用了下觉得pyinstxtractor.py这个脚本更好操作,那我就使用这个脚本来提取。

  • 运行上面的脚本前我先安装pyinstaller,(之前电脑安装的是2.7.13版本的python,暂时还不知道打包的exe脚本是用的哪个python版本,网上说要版本对应才可以,那就先试试。)在cmd命令窗口下运行pip install pyinstaller,出现了网络超时的错误,花了点时间找到错误原因,原来是我上网用的代理,所以要加上自己的代理地址–proxy=http://192.168.x.xxx:925,合在一起变成 pip install pyinstaller --proxy=http://192.168.x.xxx:925,但是又出现了新的问题,从图中可以看出是无法找到资源,下载中断了,最后指定安装了一个通用版本才解决,运行这个命令pip installer PyInstaller‑3.6‑py2.py3‑none‑any.whl,安装pyinstaller成功。
    记录一次反编译pyInstaller打包的python脚本

  • 安装好pyinstaller工具后运行pyinstxtractor.py脚本,输入python pyinstxtractor.py zukang.exe,成功把打包的脚本解压出来了,运气好,我安装的python与目标打包的脚本版本一致。
    记录一次反编译pyInstaller打包的python脚本

  • 解压出来会在当前目录下生成一个_extracted结尾的文件夹,里面包含一些脚本在独立运行时需要的动态库、python27还有一些其它的信息。
    记录一次反编译pyInstaller打包的python脚本

  • 上图文件夹里面有个struct和zukang这两文件比较重要,用010edit打开这两个文件,发现zukang文件头少了一些信息,把struct文件头里面的前8个字节 03 F3 0D 0A 70 79 69 30 插入到zukang这个头文件里面,另存为zukang.pyc文件名。
    记录一次反编译pyInstaller打包的python脚本
    记录一次反编译pyInstaller打包的python脚本

  • 安装uncompyle工具,运行命令 pip install uncompyle6 --proxy=http://192.168.x.xxx:925,最后把pyc文件转换成源码,运行命令uncompyle6 -o . zukang.pyc,在当前目录下自动生成zukang.py。