反编译 Python 文件:ValueError

逆向工程 工具 Python 可执行 反编译 字节码
2021-06-23 14:51:32

所以我有这个 python 文件,我成功地解压了它里面的内容我们有我们的 file.pyc 我附加了魔法字节,所以它来自:

E3 00 00 00 00 00 00 00 00 00 00 00 00

看起来像这样的东西:

42 0D 0D 0A 00 00 00 00 00 00 00 00 E3 00

魔术字节似乎是正确的,但是当我尝试使用“uncompyle6”进行反编译时,我得到了这个:

<class 'ValueError'>; bad marshal data (unknown type code)

为了解决这个问题,我去尝试了“decompyle3”,但它仍然返回相同的错误。

Extra Info:
[*] Pyinstaller version: 2.1+
[*] Python version: 37
[*] Length of package: 21143183 bytes
[*] Found 66 files in CArchive
[*] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap
[+] Possible entry point: pyi_rth_certifi
[+] Possible entry point: pyi_rth_multiprocessing
[+] Possible entry point: pyi_rth_pkgres
[+] Possible entry point: KitsuneSelfbot
[*] Found 1013 files in PYZ archive

还有这里是我们的 file.pyc 中的第一个字节块(未编辑):

E3 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00 00 40 00 00 00 73 7A 07 00 00 64 00 64 01 6C 00 5A 00 64 00 64 01 6C 01 5A 01 64 00 64 01 6C 02 5A 02 64 00 64 01 6C 03 5A 03 64 00 64 01 6C 04 5A 04 64 00 64 01 6C 05 5A 05 64 00 64 01 6C 06 5A 06 64 00 64 01 6C 07 5A 07 64 00 64 01 6C 08 5A 08 64 00 64 01 6C 09 5A 09 64 00 64 01 6C 0A 5A 0A 64 00 64 01 6C 0B 5A 0B 64 00 64 01 6C 0C 5A 0C 64 00 64 01 6C 0D 5A 0D 64 00 64 01 6C 0E 5A 0E 64 00 64 01 6C 02 5A 02 64 00 64 01 6C 03 5A 03 64 00 64 01 6C 01 5A 01 64 00 64 01 6C 0F 5A 0F 64 00

然后从我们的 future.pyc 这些是第一个字节

42 0D 0D 0A 00 00 00 00 00 00 00 00 E3 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 40 00 00 00 F3 D8 00 00 00 64 00 5A 00 64 01 64 02 64 03 64 04 64 05 64 06 64 07 64 08 64 09 64 0A 67 0A 5A 01 64 0B 67 01 65 01 17 00 5A 02 64 0C 5A 03 64 0D 5A 04 64 0E 5A 05 64 0F 5A 06 64 10 5A 07 64 11 5A 08 64 12 5A 09 64 13 5A 0A 64 14 5A 0B 64 15 5A 0C 47 00 64 16 64 17 84 00 64 17 83 02 5A 0D 65 0D 64 18 64 19 65 03 83 03 5A 0E 65 0D 64 1A 64 1B 65 04 83 03 5A 0F 65 0D 64 1C 64 1D 65 05 83 03 5A 10 65 0D 64 1E 64 1D 65 06 83 03

我也尝试解压 future.pyc 但它也返回了同样的错误:

<class 'ValueError'>; bad marshal data (unknown type code)

任何帮助都将不胜感激:)

1个回答

[免责声明:我是 PyInstaller Extractor 的作者]。

PyInstaller Extractor 已更新至 v2.0,其中包括对 Python 3.7 和 3.8 的支持。此外,它会自动修复提取的 pyc 的标题,不再需要手动修复标题。

如果您使用该工具最新版本,则以下答案不再适用


错误的原因是因为该工具尚未更新以支持 Python 版本 >= 3.7。现在回到实际原因,与 Python 3.3-3.6 版相比,Python 3.7 及更高版本具有 16 字节的标头。

引用PEP 552

pyc 标头当前由 3 个 32 位字组成。我们将把它扩展到 4第一个词将继续是幻数,对字节码和 pyc 格式进行版本控制。第二个字,概念上是新字,将是一个位域。pyc 的其余标头和失效行为的解释取决于位字段的内容。

(强调我的)

目前您正在添加一个 12 字节的标头,需要增加到 16,如下所示。

42 0D 0D 0A 00 00 00 00 00 00 00 00 00 00 00 00

同样,future.pyc的头部以及pyz__extracted目录下的所有文件也需要修复。

或者,作为工具更新之前的临时解决方法,您可以编辑pyinstxtractor.py以确保它写入 16 字节的标头。

pyinstxttractor.py 中的原始代码

with open(destName + '.pyc', 'wb') as pycFile:
    pycFile.write(pycHeader)      # Write pyc magic
    pycFile.write(b'\0' * 4)      # Write timestamp
    if self.pyver >= 33:
        pycFile.write(b'\0' * 4)  # Size parameter added in Python 3.3
    pycFile.write(data)

pyinstxttractor.py 中的修补代码

with open(destName + '.pyc', 'wb') as pycFile:
    pycFile.write(pycHeader)      # Write pyc magic
    pycFile.write(b'\0' * 12)
    pycFile.write(data)