LOADING

加载过慢请开启缓存 浏览器默认开启

pyhon逆向初步学习

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继续工作,也可以减轻读字节码的工作量。