Python打包后的.exe文件,还原为.py文件

本文详细记录了如何将Python打包的.exe文件反编译回.py源码的过程,包括使用pyinstxtractor.py脚本和uncompyle6库,以及在遇到困难时的解决方法。通过github项目和在线工具,最终成功还原了所需代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近逛优快云,看到一篇不错的博文,图文并茂,想参考一下作者的代码,正巧作者文末也贴了优快云站内下载链接。然而下载需10积分,我这个号还剩2积分,另个小号刚巧9积分。也在站内搜索、尝试了一些快速获取积分的攻略,但都没立即到账。

在浏览了这位仁兄的高见后,深以为然【白嫖那些事 - csdn免费下载方法】,所谓的“优快云免费下载软件”多不靠谱且病毒缠身,一如“支付宝无限破解版”,忽悠人不尝兴明。关键时刻,还得是万能的某橙色软件TB。

成功下载后,发现压缩包中不是源码,是打包好的.exe。是的,下载前太激动了,不曾注意这个细节。嗯,作者很棒棒,作品完成度高高,可是,我想看的是他有的功能具体写的啥实现的啊。

===于是决定想办法把.exe转回.py===(博文中,作者贴出的关键代码知,全是由python写的)

搜到了这篇文章,很喜欢:【别再问我exe反编译成Python脚本了!】[1]

发现是转载,于是找到了原出处:【Pyinstaller打包的exe之一键反编译py脚本与防反编译】[2]

[另:顺便也给大家推荐该宝藏作者的另一篇:Python一键自动整理归类文件,GUI窗口程序拿来即用]

参考[1][2],依葫芦画瓢进行操作,有一种自学魔法书尝试御风术的感觉,最后居然在混乱中成功了,感觉挺神奇,也挺高兴。下面是事后回顾、记录 —— 

【A.一气呵成版】

1. 在github项目python-exe-unpacker中下载 pyinstxtractor.py 脚本 ,地址:

    https://github.com/countercept/python-exe-unpacker

 下载该项目后,把其中的 pyinstxtractor.py 脚本文件,复制到 .exe 同级目录:

 (注:上图中,try_return01下的四个文件夹,都是生成物)

cmd,相应文件夹下运行 try00return01.py —— 

python try00return01.py

根据参考资料所言 ,

打开我们的 图片区域颜色替换小工具.exe_extracted 文件夹,(该文件夹运行 pyinstxtractor.py 后产生。try00return01.py 中,已用代码 import pyinstxtractor 引入同文件夹的 pyinstxtractor.py )

 如下图所示,知其为 [ 以单文件形式,打包产生的exe ] :

 其结果可见文件夹 py_result :

而这个.py文件,经过运行,证实正是我想参考的代码。

放一下提到的 try00return01.py :(可能要pip install uncompyle6) [也可点击这里下载]

#!/usr/bin/env python
# coding: utf-8

# 提取exe中的pyc
import os
import sys
import pyinstxtractor
from uncompyle6.bin import uncompile
import shutil


# 预处理pyc文件修护校验头
def find_main(pyc_dir):
    for pyc_file in os.listdir(pyc_dir):
        if not pyc_file.startswith("pyi-") and pyc_file.endswith("manifest"):
            main_file = pyc_file.replace(".exe.manifest", "")
            result = f"{pyc_dir}/{main_file}"
            if os.path.exists(result):
                return main_file


def uncompyle_exe(exe_file, complie_child=False):
    sys.argv = ['pyinstxtractor', exe_file]
    pyinstxtractor.main()
    # 恢复当前目录位置
    os.chdir("..")

    pyc_dir = os.path.basename(exe_file) + "_extracted"
    main_file = find_main(pyc_dir)

    pyz_dir = f"{pyc_dir}/PYZ-00.pyz_extracted"
    for pyc_file in os.listdir(pyz_dir):
        if pyc_file.endswith(".pyc"):
            file = f"{pyz_dir}/{pyc_file}"
            break
    else:
        print("子文件中没有找到pyc文件,无法反编译!")
        return
    with open(file, "rb") as f:
        head = f.read(4)

    if os.path.exists("pycfile_tmp"):
        shutil.rmtree("pycfile_tmp")
    os.mkdir("pycfile_tmp")
    main_file_result = f"pycfile_tmp/{main_file}.pyc"
    with open(f"{pyc_dir}/{main_file}", "rb") as read, open(main_file_result, "wb") as write:
        write.write(head)
        write.write(b"\0" * 12)
        write.write(read.read())

    if os.path.exists("py_result"):
        shutil.rmtree("py_result")
    os.mkdir("py_result")
    sys.argv = ['uncompyle6', '-o',
                f'py_result/{main_file}.py', main_file_result]
    uncompile.main_bin()

    if not complie_child:
        return
    for pyc_file in os.listdir(pyz_dir):
        if not pyc_file.endswith(".pyc"):
            continue
        pyc_file_src = f"{pyz_dir}/{pyc_file}"
        pyc_file_dest = f"pycfile_tmp/{pyc_file}"
        print(pyc_file_src, pyc_file_dest)
        with open(pyc_file_src, "rb") as read, open(pyc_file_dest, "wb") as write:
            write.write(read.read(12))
            write.write(b"\0" * 4)
            write.write(read.read())

    os.mkdir("py_result/other")
    for pyc_file in os.listdir("pycfile_tmp"):
        if pyc_file == main_file + ".pyc":
            continue
        sys.argv = ['uncompyle6', '-o',
                    f'py_result/other/{pyc_file[:-1]}', f'pycfile_tmp/{pyc_file}']
        uncompile.main_bin()

# exe_file = r"D:/PycharmProjects/gui_project/dist/auto_organize_gui.exe"
exe_file = r"F:/try_return01/图片区域颜色替换小工具.exe"
uncompyle_exe(exe_file, True)

另:3步搞定windows下使用uncompyle6反编译pyc文件

另:我想参考的代码,有一句  import easygui as g 

       可在https://sourceforge.net/projects/easygui/ 下载压缩包,并将其中的 easygui.py ,

       放到对应的虚拟环境的Lib文件夹下 —— 

 也可以点击这里,直接下载该压缩包。

=========================================================================

【B.百折不挠版】 

所在文件夹下,运行 pyinstxtractor.py , 生成文件夹  XXX.exe_extracted ,

其中,“XXX” 为 .exe 的名字。

python pyinstxtractor.py XXX.exe

x XXX %被提取的文件%
XXX.pyc %保存的文件名%

之后,生成 XXX.pyc —— 

pip install uncompyle6
uncompyle6 图片区域颜色替换小工具.pyc>图片区域颜色替换小工具.py

参考链接https://www.sohu.com/a/486939506_178408

得到 XXX.py —— 

但是,用Pycharm、GBK,看到神秘数字22864 —— 

使用UltraEdit查看,一股子汇编味

(我和其它正常编译的.pyc没有对上,就放弃了这条路)  —— 

哦,对了,还试了这个网址.pyc转.py ——  https://tool.lu/pyc/

=========================================================================

快写完本文的时候,又看到了一篇,一并贴在这里【对python生成的EXE文件 进行反编译】

=========================================================================

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值