python - 编码(marshal)加载和执行

标签 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()?但具体如何呢? 第二个问题:我可以反编译该字符串吗?怎么办?

最佳答案

就其创建方式而言,大概是这样的

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

至于弄清楚它的作用吗?你永远不应该解码它。你不知道里面隐藏着什么恐怖的金 block ,当你加载它时就会被执行。

你也许可以使用 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_VALUEdocumentation这里应该有助于识别其余部分

关于python - 编码(marshal)加载和执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20045395/

相关文章:

python - 在 python 中以递归方式对文件进行 glob 的干净方法

python - Django SECRET_KEY 是针对每个实例还是针对每个应用?

assembly - 字节码到底是什么?

c# - 如何反编译c++ dll?

python - 配置解析器未返回正确的变量 - 在单词周围遗漏了 ( )

Python/Django 迭代ManyToMany 相关领域

air - 反编译Adobe AIR应用程序

android - Android 应用计费的安全性如何?

python - Web2Py 中的每次调用都会解释代码吗?

java - 最终字段值在字节码生成中不起作用