2013-11-18 2 views
0

У меня есть этот Python код:Marshal загрузка и Exec-ки

import marshal, imp 
if imp.get_magic() == '\x03\xf3\r\n': 
    __code = marshal.loads('c\x00\x00\x00\x00.....\x00d\x01\x00k\x00.....\t\t\r\x01') 
del marshal, imp 
exec __code 

В if условие проверяет Wheter версия Python является "правой" версии. Затем marshal используется для загрузки строки, содержащей некоторый код.

Первый вопрос: как возникла эта строка? Может быть, compile()? Но как именно? и второй вопрос: могу ли я декомпилировать эту строку? Как?

+1

Что-то есть страшный питон. –

+0

@JakobBowyer Я знаю, да? Вот почему я пытаюсь понять, что он делает: P – alexandernst

ответ

1

Насколько как его создал, его что-то вроде этого

a = marshal.dumps(compile("def test(): return 0", "<source>", "exec")) 

Насколько работает, что он делает? Вы никогда не должны его развязывать. Вы не знаете, что самородок ужас скрыт там и будут выполнены при загрузке его.

Вы могли бы использовать Дис

print dis.disassemble_string(a) 

Это даст вам каждую операцию в коде.

Выход dis'ing функции тестирования

>> 0 DUP_TOPX   0 
     3 STOP_CODE  
>> 4 STOP_CODE  
     5 STOP_CODE  
     6 STOP_CODE  
     7 STOP_CODE  
>> 8 STOP_CODE  
     9 POP_TOP   
    10 STOP_CODE  
    11 STOP_CODE  
    12 STOP_CODE  
>> 13 BINARY_AND  
    14 STOP_CODE  
    15 STOP_CODE  
    16 STOP_CODE  
    17 POP_JUMP_IF_TRUE 13 
    20 STOP_CODE  
    21 STOP_CODE  
    22 LOAD_CONST   0 (0) 
    25 MAKE_FUNCTION  0 
    28 STORE_NAME   0 (0) 
    31 LOAD_CONST   1 (1) 
... etc etc 

Его к вам, чтобы работать через каждую операцию и определить, что он делает. Я могу найти несколько инструкций, которые я понимаю, например 34 RETURN_VALUE, но здесь documentation должен помочь идентифицировать остальных.

+1

Я запускаю этот код каждый день, так как это часть пользовательского приложения, которое у нас есть в офисе. Я запускаю его на некоторое количество времени, так что ... Как я могу увидеть код isntead разобранных инструкций? – alexandernst

+0

Жесткий, попробуйте http://code.google.com/p/unpyc/ –

+0

@alexandernst, см. Также http://stackoverflow.com/a/8189619/1265154 – alko

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