本帖最后由 Arcticlyc 于 2024-5-14 21:12 编辑
首先,你只是对代码进行 encode 操作,而他的代码实际上是 code object,这一点我已经跟你讲过
了解 code object 之前,可以先看一张图
上图是 python 中 pyc 文件的结构,如果你不知道 pyc 可以百度搜索
从上图可以看出,一个 pyc 文件中,从第 16 字节开始(python 3.7+),就是 code object (经过 marshal 序列化后)的二进制数据。
代码对象 code object 是一段可执行的 Python 代码在 CPython 中的内部表示。
我们知道,pyc 反编译一般有 uncompyle6(最高支持 py 3.9) 和 pycdc 两个工具。
由于我的环境为 3.11,现在我将演示从 py 到 pyc,并从 pyc 中获取 code object 的过程,然后再通过 code object 重新生成 pyc 文件,最后再通过 pyc 反编译工具将 pyc 文件反编译为源代码的过程。
1. 从 py 到 pyc,获取 code object
# test.py
# 斐波那契数列
def fib(n):
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
fib(1000)
2. 通过 code object 生成 pyc 文件
# 通过 code object 生成 pyc
HEADER = magic + b"\x00" * 4
# 时间随便写
HEADER += struct.pack("<I", int(time.time()))
# 大小随便写
HEADER += struct.pack("<I", 30)
code = HEADER + marshal.dumps(pyobj)
Path('test.pyc').write_bytes(code)
3. 通过 pyc 反编译工具反编译 pyc 文件
可以看出,这种方法是可以反编译 pyc 的
但是受到代码或是反编译工具本身的影响,反编译的结果可能不完全
深入了解请参考:
一文带你搞懂Python中的pyc文件
|