【Python】PyInstaller打包exe逆向实战:从pyinstxtractor到源码还原
1. PyInstaller打包exe逆向原理剖析
当你用PyInstaller把Python脚本打包成exe时,它实际上做了三件事:首先将Python代码编译成.pyc字节码,然后把这些字节码和Python解释器一起打包,最后加上一个自解压的启动器。这个过程中最关键的步骤是字节码生成和资源打包,而我们要逆向的就是这个过程。
PyInstaller生成的exe文件结构很有特点,它本质上是个自解压压缩包。用二进制编辑器打开这类exe,你会在文件末尾看到明显的"MEI"魔数标记,这就是PyInstaller的签名。解包时,pyinstxtractor工具正是通过定位这个标记来找到打包数据的起始位置。
逆向过程中最麻烦的是PyInstaller会对.pyc文件做手脚。正常的Python字节码文件包含16字节头部(4字节魔数+4字节时间戳+4字节文件大小+4字节校验和),但PyInstaller打包时会故意去掉前8个字节。这就是为什么直接反编译提取出的文件会报"Invalid pyc magic number"错误。
2. 工具准备与环境搭建
工欲善其事必先利其器,我们需要准备以下工具链:
- pyinstxtractor:这是核心解包工具,建议从GitHub获取最新版:
git clone https://github.com/extremecoders-re/pyinstxtractor.git - uncompyle6:字节码反编译工具,用pip安装:
pip install uncompyle6 - 十六进制编辑器:推荐免费好用的HxD或010 Editor,用来修复pyc文件头。