2013-10-27 2 views
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 файл. Теперь я хочу знать, что:Python zlib распаковщик, маршальная нагрузка и загрузка

Что это значит? Как я могу увидеть распаковку ind.pyz с zlib сначала 905 байтов? Затем загрузите ind.pyz (первые 64608 байт?). Я это понял, не так ли?

"ind.pyz" Что это должно быть? Исполняемый или скомпилированный pyc, поэтому файл python? Я попытался декомпилировать файл .pyz, но я не могу .. И есть ли декомпилятор для этих файлов?

Я действительно застрял, вот файл ind.pyz (64kb), как сжат этот файл? https://mega.co.nz/#!hIkH3RSI!f3UDHGI9omXXN7jXHJKYTCpMCU0y8N3npop6a3tfmcw

ответ

1

Прежде всего, marshal внутренняя сериализация Util, что выход зависит от версии, так что ваш код проверяет, является ли составитель правильной версии Python:

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

Затем он просматривает sys.path для отра .pyz файл, а когда нашли, читает 905 байт

f.read(905) 

Эти 905 укусы consideres, чтобы быть Zlib сжатые строки, так распаковываются

zlib.decompress(f.read(905)) 

и в результате строка unmarshalled на объект питона:

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

Этот объект в свою очередь is executed. Я полагаю, ООН-ранжированы объект является код питона, но не будет проверять это сам, я не распаковать код из непроверенных источников;)

На следующей строке,

boot('ind', f, 64608) 

boot не построен python, поэтому он должен быть определен оператором exec.

+0

Возможно ли получить исходный код из строки, загруженной с помощью '' 'marshal.loads()' ''? «Да», как? – alexandernst

+0

@alexandernst это совершенно отдельный вопрос, я не знаю простого ответа; даже термин «исходный код» не ясен, и для вашей выгоды я советую вам начать новую тему об этом, так как это больше людей мне будет знать об этом, и на вопрос можно ответить лучше. – alko

+0

Я уже начал его здесь: http://stackoverflow.com/questions/20045395/marshal-loading-and-exec-ing '' 'исходный код''' - довольно простая и понятная концепция. Получите исходный код, как он был написан. – alexandernst

Смежные вопросы