Pyinstaller编译EXE及反编译

适用范围

实测 python3.9可以反编译。从pycdc源代码看,似乎支持到python 3.13。

示例文件

demo.py

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
class QWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(QWidget, self).__init__(parent)
        self.init_ui()
    def init_ui(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Demo')
        layout = QtWidgets.QVBoxLayout(self)
        self.label = QtWidgets.QLabel('Hello World', self)
        layout.addWidget(self.label)

        self.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = QWidget()
    sys.exit(app.exec_())

编译EXE

pip install pyinstaller

pyinstaller -F demo.py

dist 目录下得到 demo.exe

反编译EXE

准备工具

  • w64devkit-x64-2.0.0.exe,从 https://github.com/skeeto/w64devkit 或镜像站下载
  • cmake-3.31.5-windows-x86_64.msiC,从 https://cmake.org/download/ 下载
  • Git-2.45.2-64-bit.exe,从 https://git-scm.com/downloads/win 下载
  • pycdc源码, 从 https://github.com/zrax/pycdc 下载
  • pyinstxtractor.py源码,从https://github.com/extremecoders-re/pyinstxtractor 下载

安装上面的三个EXE

编译pycdc

启动w64devkit.exe,进入 pycdc 目录

cmake . -G "MinGW Makefiles"

cmake --build . --config Release

pycdc目录下得到 pycdc.exe

反编译

可以用任意版本的python,建议用与打包环境用相同python版本

python pyinstxtractor.py demo.exe

同目录下得到demo.exe_extracted

找到 demo.pyc, pycdc.exe 解析 pyc文件,反编译为 py文件

pycdc.exe -o demo.py demo.pyc

反编译得到的文件

# Source Generated with Decompyle++
# File: demo2.pyc (Python 3.9)

import sys
from PyQt5 import QtWidgets, QtCore, QtGui

class QWidget(QtWidgets.QWidget):
    
    def __init__(self = None, parent = None):
        super(QWidget, self).__init__(parent)
        self.init_ui()

    
    def init_ui(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Demo')
        layout = QtWidgets.QVBoxLayout(self)
        self.label = QtWidgets.QLabel('Hello World', self)
        layout.addWidget(self.label)
        self.show()

    __classcell__ = None

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = QWidget()
    sys.exit(app.exec_())

相关资源下载

通过网盘分享的文件:python_compile_decompile
链接: https://pan.baidu.com/s/1Qf4KUFmqFWzf7WbOTx6xVA?pwd=bf25 提取码: bf25 
  • cmake-3.31.5-windows-x86_64.msi
  • Git-2.45.2-64-bit.exe
  • w64devkit-x64-2.1.0.exe
  • pycdc-master.zip [ 2025.05.08从github下载]
  • pyinstxtractor-master.zip [2025.05.08从github下载]
  • pycdc.exe 根据以上方法,编译出来的 pycdc程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值