元帅装载和执行

时间:2013-11-18 10:22:58

标签: python bytecode decompiling

我有这个Python代码:

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条件检查Python版本是否为“正确”版本。然后marshal用于加载包含一些代码的字符串。

第一个问题:该字符串是如何产生的?也许compile()?但到底怎么样? 第二个问题:我可以反编译那个字符串吗?怎么样?

1 个答案:

答案 0 :(得分:1)

至于它是如何创建的,它是这样的

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

至于解决它的作用?你永远不应该解散它。你不知道隐藏在那里的恐怖块是什么,并且当你装入它时会被执行。

你可以使用dis

print dis.disassemble_string(a)

这将为您提供代码中的每个操作。

取消测试功能的输出

>>    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应该有助于确定其余的说明