pyexe
pyexe是打包后的python的exe可执行文件常见的打包有pyinstaller等
nuitka
(作为开发使用,nuitka暂时没有有效的逆向方法)
安装
pip install nuitka
构建
python -m nuitka main.py
可选参数
--mode=onefile #打包成一个exe,便于分发
--include-package-data=package_name #打包所有文件
--windows-icon-from-ico=your-icon.png #图标
pyinstaller
使用 PyInstaller — PyInstaller 6.12.0 文档 — Using PyInstaller — PyInstaller 6.12.0 documentation
安装
pip install pyinstaller
打包
pyinstaller -op main.py
选项(-op)
-F #打包成一个exe
-D #打包成文件夹
--runtime-hook RUNTIME_HOOKS #设置hook,在任何其他代码或模块之前执行,以设置运行时环境的特殊功能
--additional-hooks-dir HOOKSPATH #搜索hook的附加路径
--hidden-import , --hiddenimport 模块名称 #隐藏导入模块
--upx-dir UPX_DIR #导入UPX路径,并用upx压缩
--add-data SOURCE:DEST #添加文件,其中 source 是要收集的文件(或目录)的路径,dest_dir 是相对于顶
#级应用程序目录的目标目录,两个路径以冒号 (:)
--upx-exclude "name" #排除upx加固
--icon=*.ico #添加图标,可能需要--add-data
解包
注意要使用相同版本的python解包。
pyinstxtractor.py
archive_viewer.py
反编译pyc
Python pyc文件 bytecode 字节码详解,及插入、编辑_python 字节码-CSDN博客
借助dis库可以分析字节码文件。
import dis
pycf = marshal.loads(open("main.pyc",'rb').read()[16:]) #去除magic头,py2为8byte,py3为16byte
dis.dis(pycf) #反编译字节码
dis.opmap #返回所opname的字节码值
hex(len(pycf.co_code)) #返回字节码的长度
uncompyle6,也可以反编译pyc不过不支持python3.9后的版本,就不说了。
pycdc,pycdas很好用。
pycdc
解包出来的pyc文件有可能要修复magic头(python版本加修改时间)。
magic头在pyc文件的前8字节或者16字节,由python版本和修改时间组成,一般在E3之前。
修复magic头只需要在我们的解包的文件中找到struct.pyc文件,把这个文件的头复制到要修复的文件首行就行。一般PYZ-00.pyz_extracted文件夹里的pyc的magic头也可用。
一些magic头
MAGIC_1_0 = 0x00999902,
MAGIC_1_1 = 0x00999903,
MAGIC_1_3 = 0x0A0D2E89,
MAGIC_1_4 = 0x0A0D1704,
MAGIC_1_5 = 0x0A0D4E99,
MAGIC_1_6 = 0x0A0DC4FC,
MAGIC_2_0 = 0x0A0DC687,
MAGIC_2_1 = 0x0A0DEB2A,
MAGIC_2_2 = 0x0A0DED2D,
MAGIC_2_3 = 0x0A0DF23B,
MAGIC_2_4 = 0x0A0DF26D,
MAGIC_2_5 = 0x0A0DF2B3,
MAGIC_2_6 = 0x0A0DF2D1,
MAGIC_2_7 = 0x0A0DF303,
MAGIC_3_0 = 0x0A0D0C3A,
MAGIC_3_1 = 0x0A0D0C4E,
MAGIC_3_2 = 0x0A0D0C6C,
MAGIC_3_3 = 0x0A0D0C9E,
MAGIC_3_4 = 0x0A0D0CEE,
MAGIC_3_5 = 0x0A0D0D16,
MAGIC_3_5_3 = 0x0A0D0D17,
MAGIC_3_6 = 0x0A0D0D33,
MAGIC_3_7 = 0x0A0D0D42,
MAGIC_3_8 = 0x0A0D0D55,
MAGIC_3_9 = 0x0A0D0D61,
MAGIC_3_10 = 0x0A0D0D6F,
MAGIC_3_11 = 0x0A0D0DA7,
MAGIC_3_12 = 0x0A0D0DCB,
MAGIC_3_13 = 0x0A0D0DF3,
pycdc可以直接反编译成python代码,但是其中也会有一些操作码不支持,这时候我们可以用pycdas看字节码手动写出python代码。我们也可以修改pycdc的源码,来添加指令支持,让pycdc继续工作,也可以减轻读字节码的工作量。