python代码保护及破解技术(上)
字数 1343 2025-08-23 18:31:17

Python代码保护及破解技术详解

一、Python代码执行原理

Python是一种解释型语言,其执行过程分为两个主要阶段:

  1. 编译阶段:Python解释器将源代码(.py)编译为字节码(.pyc)
  2. 执行阶段:Python虚拟机(PVM)执行编译好的字节码

.pyc文件结构

.pyc文件由三部分组成:

  1. Magic Number (4字节)

    • 标识Python版本,不同版本有不同的magic number
    • 格式:2字节小端序 + \r\n (如Python2.7: 03f3 0d0a)
  2. 源代码文件信息 (长度因Python版本而异)

    • Python2: 4字节(修改时间戳)
    • Python3.5-3.6: 8字节(时间戳+文件大小)
    • Python3.7+: 12字节(支持hash校验)
  3. PyCodeObject序列化数据

    • 包含实际的字节码信息
    • 通过marshal模块序列化存储

二、Python代码保护技术

1. 编译为.pyc文件

单个文件编译

python -m py_compile file.py

批量编译

import compileall
compileall.compile_dir(r'/path')

2. PyInstaller打包

将Python解释器、脚本及依赖打包成独立可执行文件:

pyinstaller -F -w file.py

3. 代码混淆技术

混淆手段包括:

  • 移除注释和文档
  • 改变缩进格式
  • 在tokens间插入空格
  • 重命名函数/类/变量
  • 插入无效代码

在线混淆工具:Oxyry Python混淆器

4. 高级保护技术

(1) 字节码混淆

在opcode中添加无效指令和跳转指令,欺骗反编译工具

(2) Cython加密

将.py文件转换为.c再编译为.pyd/.so:

  1. 用Cython将Python源码转为C代码
  2. 用C编译器生成二进制动态库

(3) PyArmor

目前最成熟的Python代码保护方案,基本无法逆向

三、Python代码破解技术

1. .pyc文件反编译

使用uncompyle6

pip install uncompyle6
uncompyle6 -o test.py test.pyc

使用pycdc

适用于Python 3.9+版本

2. PyInstaller解包

步骤:

  1. 使用pyinstxtractor解包
python pyinstxtractor.py filename.exe
  1. 补全magic number

    • 从解包目录的struct文件中获取
    • 用Hex编辑器添加到.pyc文件头部
  2. 反编译修复后的.pyc文件

3. 处理缺失magic number的情况

Python脚本示例:

structPath = 'struct'
programPath = 'test'
f = open(structPath, 'rb')
f2 = open(programPath, 'rb')
w_all = f2.read()
f2.seek(0)
w = f.read(16).hex()
w2 = f2.read(16).hex()
print(w, w2, sep='\n')
add = input('Please input the codes you need to write:')
add = bytes.fromhex(add)
f2.close()
f2 = open(programPath+'.pyc', 'wb')
f2.write(add + w_all)
f.close()
f2.close()
print('Done.')

四、其他保护方案

  1. Docker镜像打包:将Python程序打包为加密的Docker镜像
  2. pyminifier:开源混淆器,重命名变量/函数/类名
  3. pyc_obscure:向PyCodeObject插入垃圾数据干扰反编译

五、Magic Number参考表

不同Python版本的magic number示例:

  • Python 2.7: 62211 (03f3 0d0a)
  • Python 3.6: 3373
  • Python 3.7: 3390
  • Python 3.8: 3413

完整magic number列表可在原文末尾查阅。

六、防护建议

  1. 对于高安全性需求,优先使用PyArmor或Cython
  2. 结合多种保护技术(混淆+加密+打包)
  3. 关键算法建议用C/C++实现并编译
  4. 定期更新保护措施,跟进最新破解技术

注:更详细的字节码混淆、Cython加密和PyArmor使用方法将在《Python代码保护(下)》中介绍。

Python代码保护及破解技术详解 一、Python代码执行原理 Python是一种解释型语言,其执行过程分为两个主要阶段: 编译阶段 :Python解释器将源代码(.py)编译为字节码(.pyc) 执行阶段 :Python虚拟机(PVM)执行编译好的字节码 .pyc文件结构 .pyc文件由三部分组成: Magic Number (4字节) 标识Python版本,不同版本有不同的magic number 格式:2字节小端序 + \r\n (如Python2.7: 03f3 0d0a) 源代码文件信息 (长度因Python版本而异) Python2: 4字节(修改时间戳) Python3.5-3.6: 8字节(时间戳+文件大小) Python3.7+: 12字节(支持hash校验) PyCodeObject序列化数据 包含实际的字节码信息 通过marshal模块序列化存储 二、Python代码保护技术 1. 编译为.pyc文件 单个文件编译 批量编译 2. PyInstaller打包 将Python解释器、脚本及依赖打包成独立可执行文件: 3. 代码混淆技术 混淆手段包括: 移除注释和文档 改变缩进格式 在tokens间插入空格 重命名函数/类/变量 插入无效代码 在线混淆工具: Oxyry Python混淆器 4. 高级保护技术 (1) 字节码混淆 在opcode中添加无效指令和跳转指令,欺骗反编译工具 (2) Cython加密 将.py文件转换为.c再编译为.pyd/.so: 用Cython将Python源码转为C代码 用C编译器生成二进制动态库 (3) PyArmor 目前最成熟的Python代码保护方案,基本无法逆向 三、Python代码破解技术 1. .pyc文件反编译 使用uncompyle6 使用pycdc 适用于Python 3.9+版本 2. PyInstaller解包 步骤: 使用pyinstxtractor解包 补全magic number 从解包目录的struct文件中获取 用Hex编辑器添加到.pyc文件头部 反编译修复后的.pyc文件 3. 处理缺失magic number的情况 Python脚本示例: 四、其他保护方案 Docker镜像打包 :将Python程序打包为加密的Docker镜像 pyminifier :开源混淆器,重命名变量/函数/类名 pyc_ obscure :向PyCodeObject插入垃圾数据干扰反编译 五、Magic Number参考表 不同Python版本的magic number示例: Python 2.7: 62211 (03f3 0d0a) Python 3.6: 3373 Python 3.7: 3390 Python 3.8: 3413 完整magic number列表可在原文末尾查阅。 六、防护建议 对于高安全性需求,优先使用PyArmor或Cython 结合多种保护技术(混淆+加密+打包) 关键算法建议用C/C++实现并编译 定期更新保护措施,跟进最新破解技术 注:更详细的字节码混淆、Cython加密和PyArmor使用方法将在《Python代码保护(下)》中介绍。