最近逛优快云,看到一篇不错的博文,图文并茂,想参考一下作者的代码,正巧作者文末也贴了优快云站内下载链接。然而下载需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
得到 XXX.py ——
但是,用Pycharm、GBK,看到神秘数字22864 ——
使用UltraEdit查看,一股子汇编味
(我和其它正常编译的.pyc没有对上,就放弃了这条路) ——
哦,对了,还试了这个网址.pyc转.py —— https://tool.lu/pyc/
=========================================================================
快写完本文的时候,又看到了一篇,一并贴在这里【对python生成的EXE文件 进行反编译】
=========================================================================