引言

当遇到丢失源码的Python打包exe程序时,我们可能需要逆向分析其逻辑。之前写过《Pyinstaller 反编译》,最近发现有些工具比较老了,反编译不成功。
所以重新整理了下,整个过程无需依赖反编译工具,借助AI即可完成(感谢强大的AI)。


使用pyinstxtractor解包exe

  1. 安装工具

    1
    pip install pyinstxtractor
  2. 解包exe文件

    1
    python -m pyinstxtractor myapp.exe

    执行后生成myapp.exe_extracted文件夹,其中包含:

    • .pyc文件(编译后的字节码)
    • 依赖库和资源文件

    》注意:最好是用跟exe同样的python版本,不然有可能反编译不成功
    》不知道是什么版本,就随便用一个版本先解包,生成的文件夹里有版本的dll文件
    》可以创建python虚拟环境来操作,参考《多版本Python环境管理指南

  3. 关键文件定位
    在解包目录中寻找PYZ-00.pyz_extracted文件夹,主程序的pyc文件通常位于此处(如myapp.pyc


pyc文件反编译

使用以下脚本读取pyc并反编译为字节码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import dis
import marshal
import sys

def decompile_pyc(pyc_path):
with open(pyc_path, 'rb') as f:
# 跳过pyc文件头(不同Python版本头长度不同)
f.seek(16) # Python 3.7+ 使用16字节头
try:
code = marshal.load(f)
except:
print("⚠️ 文件头可能不匹配,尝试12字节偏移...")
f.seek(12)
code = marshal.load(f)

# 将字节码输出到文件
bytecode_path = pyc_path.replace('.pyc', '_bytecode.txt')
with open(bytecode_path, 'w') as out:
sys.stdout = out
dis.dis(code)
sys.stdout = sys.__stdout__

print(f"✅ 字节码已保存至: {bytecode_path}")
return bytecode_path

# 使用示例
bytecode_file = decompile_pyc("myapp.pyc")

关键说明

  1. 文件头偏移量根据Python版本调整:
    • Python 3.7+:16字节
    • Python 3.3-3.6:12字节
    • 更旧版本:8字节
  2. 若遇到ValueError,可尝试不同偏移量

通过AI还原源码(DeepSeek示例)

  1. 打开 DeepSeek AI
  2. 输入提示词
    1
    2
    3
    4
    5
    6
    7
    请将以下Python字节码还原为可读的Python源码:
    (粘贴bytecode.txt中的全部内容)

    注意:
    1. 还原函数和变量名称
    2. 保持原始逻辑结构
    3. 添加必要的注释

©2018 - Felicx 使用 Stellar 创建
总访问 113701 次 | 本页访问 326
共发表 97 篇Blog · 总计 140.2k 字