【问题标题】:Marshal loading and exec-ingMarshal 加载和执行
【发布时间】:2013-11-18 10:22:57
【问题描述】:

我有这个 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()?但具体如何? 第二个问题:我可以反编译那个字符串吗?怎么样?

【问题讨论】:

  • 那是一条可怕的蟒蛇。
  • @JakobBowyer 我知道,对吧?这就是为什么我试图弄清楚它在做什么:P
  • @JakobBowyer 为什么这么害怕。请解释一下

标签: python bytecode decompiling


【解决方案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 应该有助于识别其余指令

【讨论】:

  • 我每天都在运行此代码,因为它是我们办公室中自定义应用程序的一部分。我已经运行它很长时间了,所以......也就是说,我如何才能真正看到代码而不是反汇编指令?
  • @JackobBowyer 我需要知道如何解组它。因为我确信它包含一个简单的 python 脚本
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2021-04-28
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2010-12-20
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多