参考资料

逆向Python打包exe的核心流程

使用PyInstaller Extractor解包

PyInstaller生成的exe文件可通过pyinstxtractor.py解包,生成包含.pyc文件和依赖库的目录。

python pyinstxtractor.py your_program.exe

解包后生成your_program.exe_extracted文件夹,其中包含以下关键文件:

  • struct.pyc:用于提取Magic Number(Python版本标识)

  • PYZ-00.pyz_extracted:依赖库目录,可能包含加密的.pyc.encrypted文件

修复Magic Number

Python的.pyc文件头部包含4字节的Magic Number,需根据打包时的Python版本补全。

  • 方法1:从struct.pyc中复制头部字节

# 示例:使用WinHex提取Magic Number
with open('struct.pyc', 'rb') as f:
    magic_bytes = f.read(4)  # 读取前4字节
  • 方法2:参考通用对照表(如Python 3.6的Magic Number0x0A0D0D33

反编译.pyc为 .py

使用uncompyle6将修复后的.pyc文件反编译为Python源代码:

uncompyle6 extracted_module.pyc > source.py

关键工具与依赖

工具

用途

安装命令(Python)

pyinstxtractor

解包PyInstaller生成的exe

手动下载脚本

uncompyle6

将.pyc反编译为.py

pip install uncompyle6

WinHex

编辑二进制文件(修复Magic Number)

商业软件,需单独安装

防止逆向的常见手段

代码加密

使用tinyaes库在打包时加密依赖文件,生成.pyc.encrypted文件:

pyinstaller --key your_secret_key your_script.py

加密后,PYZ-00.pyz_extracted中的文件将无法直接反编译。

混淆工具

  • PyArmor:对代码进行混淆,增加逆向难度(但非绝对安全)。

  • Nuitka:将Python编译为C扩展,再打包为exe,部分场景下可提升反编译门槛。

依赖隔离

将核心逻辑放在远程服务或C扩展中,减少exe文件内的敏感代码。

逆向示例流程

1.解包exe

python pyinstxtractor.py suspect.exe

2.修复Magic Number

  • 用WinHex打开struct.pyc和目标.pyc文件,复制头部字节到目标文件。

3.反编译

uncompyle6 suspect.pyc > suspect.py

4.动态分析(可选)

  • 使用Volatility等工具提取内存中的解密代

代码示例:修复Magic Number

def add_magic_number(pyc_path, magic_bytes):
    """为.pyc文件添加Magic Number"""
    with open(pyc_path, 'rb+') as f:
        content = f.read()
        f.seek(0)
        f.write(magic_bytes + content[4:])  # 假设前4字节为Magic Number

# 示例:从struct.pyc复制Magic Number
with open('struct.pyc', 'rb') as f:
    magic_bytes = f.read(4)
add_magic_number('target.pyc', magic_bytes)

注意事项

  • 法律风险:逆向工程可能违反软件许可协议,需确保目标文件允许分析。

  • 加密文件:若exe使用--key参数加密,需破解密钥或分析加密逻辑。

  • 依赖库:部分第三方库(如PyArmor)可能完全阻止反编译,需结合动态分析。