Python打包exe逆向工程:解包、反编译与防护技术
参考资料
逆向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 Number为0x0A0D0D33)
反编译.pyc为 .py
使用uncompyle6将修复后的.pyc文件反编译为Python源代码:
uncompyle6 extracted_module.pyc > source.py关键工具与依赖
防止逆向的常见手段
代码加密
使用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.exe2.修复Magic Number
用WinHex打开
struct.pyc和目标.pyc文件,复制头部字节到目标文件。
3.反编译
uncompyle6 suspect.pyc > suspect.py4.动态分析(可选)
使用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)可能完全阻止反编译,需结合动态分析。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 FENG·LIN
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

