我有这个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_VALUE
但 documentation这里应该有助于识别其余部分
关于python - 编码(marshal)加载和执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20045395/