1
import imp
s = ''
if imp.get_magic() != 'm\xf2\r\n':
    raise RuntimeError, s


try:
    import zlib
except:
    raise RuntimeError, ''

import marshal
import sys
import os
for p in filter(os.path.exists, map(lambda p: os.path.join(p, 'ind.pyz'), sys.path)):
    f = open(p, 'rb')
    exec marshal.loads(zlib.decompress(f.read(905)))
    boot('ind', f, 64608)
    break
import inca

我在 ind.pyc 文件中有这段代码。现在我想知道:

这是什么代码?我可以看到用 zlib 前 905 个字节解压缩 ind.pyz 吗?然后启动 ind.pyz(前 64608 个字节?)。我明白了,不是吗?

“ind.pyz”应该是什么?一个可执行文件或一个编译的pyc,所以python文件?我试图反编译 .pyz 文件,但我不能.. 这些文件有反编译软件吗?

我真的卡住了,这里是 ind.pyz 文件(64kb)这个文件是如何压缩的? https://mega.co.nz/#!hIkH3RSI!f3UDHGI9omXXN7jXHJKYTCpMCU0y8N3npop6a3tfmcw

4

1 回答 1

1

首先,marshal是内部序列化工具,它的输出是依赖于版本的,所以你的代码检查它是否被正确的python版本编译:

if imp.get_magic() != 'm\xf2\r\n':
    raise RuntimeError, s

然后它查找sys.path一个 ind.pyz 文件,找到后读取 905 个字节

f.read(905)

那些 905 位被认为是 zlib 压缩的字符串,因此被解压缩

zlib.decompress(f.read(905))

并将结果字符串解组为 python 对象:

marshal.loads(zlib.decompress(f.read(905)))

该对象依次被执行。我想未编组的对象是python代码,但我自己不会检查它,我不会从不受信任的来源解组代码;)

在下一行,

boot('ind', f, 64608)

boot不是一个内置的python函数,所以它必须由exec语句定义。

于 2013-10-27T14:15:45.093 回答