pyc反编译那些事儿
内容介绍
PyInstaller封装程序的反编译:
- 使用PyInstaller Extractor 提取由PyiIstaller生成的可执行文件内容
- 使用Uncompyle6进行反编译
PyiIstaller生成的可执行文件
如果要建立独立应用,那么需要把python的依赖包全部打包。
安装:
pip install pyinstaller
打包:
pyinstaller -F -w XXX.py
打包完成后,会建立两个文件夹,分别是build
和dist
,可执行文件就在dist
下面,同时需要把程序用到的文件放到同一个目录(如果用的是相对路径的话)
build
下面有一个warn-UI.txt
文件,如果打包完成后无法运行文件可以在此查看问题
以下是pyinstaller
的常用选项
-h,--help 查看该模块的帮助信息
-F,-onefile 产生单个的可执行文件
-a,--ascii 不包含 Unicode 字符集支持
-d,--debug 产生 debug 版本的可执行文件
-w,--windowed,--noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,--nowindowed,--console 指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,--out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,--path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,--name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字
-D,--onedir 产生一个目录(包含多个文件)作为可执行程序
使用PyInstxtractor提取 *.pyc 文件
工具准备:
PyInstaller Extractor 项目地址:https://github.com/extremecoders-re/pyinstxtractor
工作目录:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020/3/24 15:37 45937021 Main_cfg_editor.exe
-a---- 2020/3/25 14:33 13194 pyinstxtractor.py
提取文件:
python pyinstxtractor.py Main_cfg_editor.exe
[+] Processing Main_cfg_editor.exe
[+] Pyinstaller version: 2.1+
[+] Python version: 37
[+] Length of package: 45659005 bytes
[+] Found 2823 files in CArchive
[+] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap.pyc
[+] Possible entry point: pyi_rth_pkgres.pyc
[+] Possible entry point: pyi_rth_win32comgenpy.pyc
[+] Possible entry point: pyi_rth_multiprocessing.pyc
[+] Possible entry point: pyi_rth_traitlets.pyc
[+] Possible entry point: pyi_rth__tkinter.pyc
[+] Possible entry point: Main_cfg_editor.pyc
[+] Found 1627 files in PYZ archive
[+] Successfully extracted pyinstaller archive: Main_cfg_editor.exe
You can now use a python decompiler on the pyc files within the extracted directory
使用Uncompyle反编译 *.pyc 文件
工作准备:
Uncompyle6 库的安装:
pip install uncompyle6
反编译:
uncompyle6 Main_cfg_editor.pyc > Main_cfg_editor.py
常见错误信息
Invalid pyc/pyo file - Magic value mismatch!
原因:由于每个 *.pyc 文件都有一个magic head,PyInstaller 生成 .exe 的时候会把.pyc 的 magic 部分去掉,在反编译的时候需要补齐,高版本 PyInstxtractor 2.0 已经解决这个问题。
如果需要手动补齐 magic head 的情况下:
使用16进制模式查看主文件与主文件目录下的 struct 文件,需要在主文件头插入16个字节与 struct文件保持一致(其中前4个字节是Python编译版本,要完全一致)
注意模板文件仅需要插入8个字节,与 struct 文件保持一致
ValueError: source code string cannot contain null bytes
通常在反编译后执行 *.py 文件时发生,原因时反编译后的文件中存在一些空字符。最简单的解决办法是把文本复制到其他文本编辑器(例如UltraEdit),然后复制回来。
如使用python 3.9 报错
Error: uncompyle6 requires Python 2.6-3.8
我们只需要给uncompile
包加一个3.9支持
.pyc文件首部损坏
struct.pyc
文件包含一个完整可用的首部,可以用来修复.pyc文件.