Python exe 文件反编译为 Python 脚本
将Python可执行文件(.exe)反编译为Python脚本是一项有趣的技术挑战,可以帮助我们理解程序的工作原理,以及可能包含的逻辑和算法。虽然反编译不是一项简单的任务,并且对于使用各种保护措施的程序可能无效,但对于一般情况下的Python可执行文件,我们可以尝试使用一些工具来进行反编译。
下面我们就来学习如何将Python可执行文件(.exe)反编译为Python脚本。
版本反编译反编译是将已编译的程序代码还原为其原始源代码的过程。在Python中,由于其解释性质,通常没有像编译语言那样生成的二进制文件,但是我们可以将Python脚本转换为字节码文件(.pyc),而.exe文件通常是由pyinstaller、cx_Freeze等工具编译生成的。
Python可执行文件(.exe)反编译Python可执行文件(.exe)反编译为Python脚本主要分为两个步骤,(1)从.exe文件中提取pyc文件(2)将pyc文件转换为Python脚本。
打包一个简单的.exe可执行文件__name__=="__main__":_info()使用pyinstaller构建可执行.exepyinstaller--onefile-pvenv/Lib/site-packages.\print-student\提取pyc文件
使用脚本提取
pyi-archive_viewer是PyInstaller自己提供的工具,它可以直接提取打包结果exe中的pyc文件。
详细介绍可参考官方文档:
补全非入口类文件pyz_dir="_extracted/_extracted"forpyc_(pyz_dir):pyc_file_src=f"{pyz_dir}/{pyc_file}"pyc_file_dest=f"pycfile_tmp/{pyc_file}"print(pyc_file_src,pyc_file_dest)withopen(pyc_file_src,"rb")asread,open(pyc_file_dest,"wb")aswrite:((12))(b"\0"*4)(())转换补全后的pyc文件
uncompyle6反编译
如:uncompyle6.\pycfile_tmp\(3425)Embeddedfilename:,3.9.0,fordecompilationUnsupportedPythonversion,3.9.0,fordecompilation
由于我使用的是3.9.0版本,uncompyle6不再支持decompilation,有兴趣的朋友可以去试试。
在线工具
我们也可以使用一些在线工具进行解密,比如:
反编译结果
可能遇到的问题_extracted文件为空
构建.exe文件Python版本和解压包时使用的版本不一致,比如我使用进行解包:
Python.\\[*]Processing.\[*]Pyinstallerversion:2.1+[*]Pythonversion:312[*]Lengthofpackage:7675728bytes[*]Found60filesinCArchive[*]Beginningextractionpleasestandby[!]Warning:ThescriptisrunninginadifferentpythonversionthantheoneusedtobuildtheexecutableRunthisscriptinPython312topreventextractionerrors(ifany)duringunmarshalling[!][*]Successfullyextractedpyinstallerarchive:.\directory#查看解压后的文件\print-student\_extracted\_extractedls\print-student\_extracted\_extracted如何防止exe被反编译
我们可以在打包命令后面添加--key参数来进行加密,例如:
pyinstaller--onefile-pvenv/Lib/site-packages.\print-student\'1234'
再次解压,抽取的中间结果变为了.,无法正常反编译。
思考=
可以看到在加密参数已经被废弃,大家可以思考一下原因。
总结反编译Python可执行文件可以帮助我们理解程序的工作原理和逻辑,但在实践中可能会受到许多因素的限制。对于复杂的程序,反编译可能只是了解其工作原理的第一步,可能需要进一步的分析和研究。最后,我们需要明白技术没有好坏,需要谨守道德和法律的底线。